便所の落書き
これぐらいバカでもできるよ。
grammer.txt
IGNORE: " "; NAME: "[a-zA-Z_]*"; NUMBER: "0|[1-9][0-9]*"; arith_expr: term ("+" term)+ | # was (("+"|"-") term)* term ("-" term)+ | <term>; term: factor ("*" term)+ | # was (("*"|"/"|"%"|"//") factor)* factor ("/" term)+ | factor ("%" term)+ | factor ("//" term)+ | <factor>; factor: "+" factor | "-" factor | "~" factor | <power>; power: NUMBER | NAME;
grammer.py
from pypy.rlib.parsing.parsing import * from pypy.rlib.parsing.ebnfparse import parse_ebnf, make_parse_function grammar = py.magic.autopath().dirpath().join("grammar.txt").read() regexs, rules, ToAST = parse_ebnf(grammar) parse = make_parse_function(regexs, rules) t = parse("1 + 3 * 5").visit(ToAST()) print t
結果
[Nonterminal('arith_expr', [Nonterminal('power', [Symbol('NUMBER', '1')]), Symbol('__0_+', '+'), Nonterminal('term', [Nonterminal('power', [Symbol('NUMBER', '3')]), Symbol('__2_*', '*'), Nonterminal('power', [Symbol('NUMBER', '5')])])])]