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中的算法。。。