立て続けですまんの。
lex/yacc の lexer が欲しいのは元はと言えば ジジイのせい…じゃなくて、Doxygen の Cython 対応が欲しいなぁ、が発端。読みにくいでしょ、pycode.l、pyscanner.l。
ただなぁ、BitBucketもGitHubもどっちも Pygments ユーザなら良かったんだけど、GitHub は Pygments じゃないのな。だからlex の lexer 書いても、Doxygen のこいつらが読みやすくなることはない。GitHub が Pygments に乗り換えてくれるか独自にそっちのが進化しない限り。
てわけで、やや単なる趣味の領域になってきそうだが、いずれにしても lex/yacc の lexer は欲しい。それと、m4 とか roff、texinfo みたいな、「伝統的、かつ、どメジャー、なのに lexer がない」ものも欲しい。今でもこれら、どこででも見かけるからさ。読む必要があって読まねばならんときに、のっぺらぼーなプレインテキストとして読まねばならんのはあまりにも「目がぁ」。
そうなんだけれどもね、いきなり本題の lex/yacc はほんの少しハードル高め(2種類の言語のミックスみたいなもんだから)に思えたんで、なんか丁度いい練習ネタはないかなぁ、と考えてた。あれこれ考えた挙句、幸いにも誰も書いてなかった bc。やったラッキー。絶妙過ぎるぞ、これ。「超」簡単なのにちゃんと「それなり」。(つまり自力で全部ゴリゴリ書いたら凄まじく大変で、Pygments lexer のフレームワークに従うと超絶簡単、てやつ。)
てわけで。
1 # -*- coding: utf-8 -*-
2 """
3 pygments.lexers.algebra
4 ~~~~~~~~~~~~~~~~~~~~~~~
5
6 Lexers for computer algebra systems.
7
8 :copyright: Copyright 2006-2015 by the Pygments team, see AUTHORS.
9 :license: BSD, see LICENSE for details.
10 """
11
12 import re
13
14 from pygments.lexer import RegexLexer, bygroups, words
15 from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
16 Number, Punctuation
17
18 __all__ = ['GAPLexer', 'MathematicaLexer', 'MuPADLexer', 'BCLexer']
19
20 # ...
21
22 # ...
23 class BCLexer(RegexLexer):
24 name = 'BC'
25 aliases = ['bc']
26 filenames = ['*.bc']
27
28 tokens = {
29 'root': [
30 (r'/\*', Comment.Multiline, 'comment'),
31 (r'"(?:[^"\\]|\\.)*"', String),
32 (r'[{}();,]', Punctuation),
33 (r'(if|else|while|for|break|continue|halt|'
34 r'return|define|auto|print|'
35 r'read|length|scale|sqrt|limits|quit|warranty)\b', Keyword),
36 (r'\+\+|--|\|\||&&|'
37 r'([-<>+*%\^/!=])=?', Operator),
38 (r'[0-9]+(?:\.[0-9]*)?(?:e[0-9]+)?', Number),
39 (r'\.[0-9]+(?:e[0-9]+)?', Number),
40 (r'.', Text)
41 ],
42 'comment': [
43 (r'[^*/]', Comment.Multiline),
44 (r'/\*', Comment.Multiline, '#push'),
45 (r'\*/', Comment.Multiline, '#pop'),
46 (r'[*/]', Comment.Multiline)
47 ]
48 }
1 # ...
2 'BCLexer': ('pygments.lexers.algebra', 'BC', ('bc',), ('*.bc',), ()),
3 # ...
結果は面白くもなんともないけれども:
さて。lex, yacc, m4, roff, texinfo。どれから行こうかなぁ? 需要的には m4 が多そうな気がするねぇ。Makefile.am とかの automake 系をメンテする人、今でも多そうだもんね。lex, yacc はワタシ的には是が非でも欲しいんだけれども、世間的需要はどうしたって少なくなるだろう。滅多にみなくなったもんなぁ、lex/yacc で書かれるもの。