Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

便所の落書き

これぐらいバカでもできるよ。

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')])])])]