Pygmentsネタばかりだと飽きるか?

立て続けですまんの。

lex/yacc の lexer が欲しいのは元はと言えば ジジイのせい…じゃなくて、Doxygen の Cython 対応が欲しいなぁ、が発端。読みにくいでしょ、pycode.lpyscanner.l

ただなぁ、BitBucketGitHubもどっちも Pygments ユーザなら良かったんだけど、GitHubPygments じゃないのな。だからlex の lexer 書いても、Doxygen のこいつらが読みやすくなることはない。GitHubPygments に乗り換えてくれるか独自にそっちのが進化しない限り。

てわけで、やや単なる趣味の領域になってきそうだが、いずれにしても lex/yacc の lexer は欲しい。それと、m4 とか roff、texinfo みたいな、「伝統的、かつ、どメジャー、なのに lexer がない」ものも欲しい。今でもこれら、どこででも見かけるからさ。読む必要があって読まねばならんときに、のっぺらぼーなプレインテキストとして読まねばならんのはあまりにも「目がぁ」。

そうなんだけれどもね、いきなり本題の lex/yacc はほんの少しハードル高め(2種類の言語のミックスみたいなもんだから)に思えたんで、なんか丁度いい練習ネタはないかなぁ、と考えてた。あれこれ考えた挙句、幸いにも誰も書いてなかった bc。やったラッキー。絶妙過ぎるぞ、これ。「超」簡単なのにちゃんと「それなり」。(つまり自力で全部ゴリゴリ書いたら凄まじく大変で、Pygments lexer のフレームワークに従うと超絶簡単、てやつ。)

てわけで。

lexers/algebra.py に参加させてみた
 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     }
lexers/mappings.py に
1 # ...
2     'BCLexer': ('pygments.lexers.algebra', 'BC', ('bc',), ('*.bc',), ()),
3 # ...

結果は面白くもなんともないけれども:

さて。lex, yacc, m4, roff, texinfo。どれから行こうかなぁ? 需要的には m4 が多そうな気がするねぇ。Makefile.am とかの automake 系をメンテする人、今でも多そうだもんね。lex, yacc はワタシ的には是が非でも欲しいんだけれども、世間的需要はどうしたって少なくなるだろう。滅多にみなくなったもんなぁ、lex/yacc で書かれるもの。