通过递归下降解析器的语法规则,我们如何验证源字符串

时间:2010-09-29 02:00:12

标签: parsing

如果输入以下两个输入字符串:

1)<id> + <id> * <id>
2) <id> * <id> <id>

E ::= T{+T}* 
T ::= V{*V}* 
V ::= <id>

然后通过应用上述递归下降解析器的语法规则,我们如何验证上述源字符串。 递归下降解析器将指示哪种类型的错误?

...谢谢

1 个答案:

答案 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

希望这可以帮助你学习。