import parsimonious as parmon
parser = parmon.Grammar(r"""
E = E "+" E / id
id = "0"/"1"/"2"/"3"/"4"/"5"/"6"/"7"/"8"/"9"
""")
code = "2+2"
print(parser.parse(code))
from pyparsing import *
id = Word(nums, min=1, max=1)
E = Forward()
E << (id + '+' + E | id)
code = '2 + 2'
print (E.parseString(code))
print (E.parseString('3+4+5'))
或许有必要详细阐述@rici的评论,并给出解决问题的方法:
E = E "+" E / id
实际上是指:E = E "+" (E / id)
,这是一个无结尾的递归定义:E = E "+" E / id
当E
被替换为右侧时:E = (E "+" (E / id)) "+" (E / id)
等这意味着,尽管
+
的右操作数在示例表达式中立即匹配(选择id
产生式,即终端字符2
),但对于如何匹配左侧仍然存在疑问。在这就是为什么您提供的EBNF是错误的,并将其更改为:
E = ( E "+" E ) / id
解决问题。在
我不能提供任何你提到的解析器。你有没有考虑过pyparsing?在
id
被定义为一位数的数字标记。在Forward
表示{<<
运算符将E
的定义插入自身。括号调用“match first”,这意味着如果可能,将应用“or”中的第一个表达式。在print
函数中执行。在这里有一个针对这种表达式的简单解析器。在
这个代码产生这个结果。在
^{pr2}$相关问题 更多 >
编程相关推荐