如果输入以下两个输入字符串:
1)<id> + <id> * <id>
2) <id> * <id> <id>
E ::= T{+T}*
T ::= V{*V}*
V ::= <id>
然后通过应用上述递归下降解析器的语法规则,我们如何验证上述源字符串。 递归下降解析器将指示哪种类型的错误?
...谢谢
答案 0 :(得分:1)
您的语法规则看起来像算术中缀符号。 Pyparsing(Python解析附加模块)有一个内置方法,用于为这种表示法构建解析器表达式,称为operatorPrecedence
。以下是pyparsing解析器将如何解析您的两个示例:
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
希望这可以帮助你学习。