Parsing 根据递归下降解析器的语法规则,如何验证源字符串

Parsing 根据递归下降解析器的语法规则,如何验证源字符串,parsing,Parsing,如果输入了以下两个输入字符串: 1)<id> + <id> * <id> 2) <id> * <id> <id> E ::= T{+T}* T ::= V{*V}* V ::= <id> 1)+* 2) * E::=T{+T}* T::=V{*V}* V::= 然后,通过应用递归下降解析器的上述语法规则,我们如何验证上述源字符串。 递归下降解析器将指示什么类型的错误 谢谢…您的语法规则看起来像算术

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

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

E ::= T{+T}* 
T ::= V{*V}* 
V ::= <id>
1)+*
2)  *  
E::=T{+T}*
T::=V{*V}*
V::=
然后,通过应用递归下降解析器的上述语法规则,我们如何验证上述源字符串。 递归下降解析器将指示什么类型的错误


谢谢…

您的语法规则看起来像算术中缀符号。(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
来自pyparsing导入运算符Recessence、opAssoc、ParseException
expr=运算符接收(“”,
[
(“*”,2,opAssoc.左),
(“+”,2,opAssoc.左),
])
测试:“””\
+  *  
*“.splitlines()
对于t in测试:
打印t
尝试:
print expr.parseString(t,parseAll=True).asList()
除ParseException外,pe:
打印“解析失败”
打印
印刷品:

<id> + <id> * <id> 
[['<id>', '+', ['<id>', '*', '<id>']]]

<id> * <id> <id>
parsing failed
+*
[['', '+', ['', '*', '']]]
*  
解析失败

希望这对你的学习有所帮助。

这类问题是CS课程的典型问题吗?读到一半我无聊得流下了眼泪…@是的。Paul你能帮助我如何根据D M Dhamdhere系统编程书一步一步地执行这个示例吗。。我想看看CSF是如何预测的,SSM是如何递增的,而不是Pascal或Java中的算法。。。