Ваши правила грамматики выглядят как арифметическая инфиксная запись. Pyparsing (дополнительный модуль разбора Python) имеет встроенный метод для построения выражений синтаксического анализатора для этого вида нотации, который называется operatorPrecedence
. Вот как синтаксический анализатор разберет ваши два примера:
from pyparsing import operatorPrecedence, opAssoc, ParseException
expr = operatorPrecedence("<id>",
[
('*', 2, opAssoc.LEFT),
('+', 2, opAssoc.LEFT),
])
tests = """\
<id> + <id> * <id>
<id> * <id> <id>""".splitlines()
for t in tests:
print t
try:
print expr.parseString(t, parseAll=True).asList()
except ParseException,pe:
print "parsing failed"
print
Печать:
<id> + <id> * <id>
[['<id>', '+', ['<id>', '*', '<id>']]]
<id> * <id> <id>
parsing failed
Надеюсь, это поможет вам в учебе.