我正在为表达式做一个简单的解析器,这是我的代码:
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))我得到了这个错误:
IncompleteParseError(text, node.end, self)
parsimonious.exceptions.IncompleteParseError: Rule 'rules' matched in its entirety, but it didn't consume all the text. The non-matching portion of the text begins with '/ id
id = "0"/"1"' (line 2, column 16).我也尝试过Lark-parser,但也不能在上面工作。感谢你的帮助。
发布于 2018-01-18 04:16:44
我不能提供任何你提到的解析器。您是否考虑过pyparsing
id被定义为一位数字token.Forward表示E将在代码中稍后定义。(这类似于过程转发中‘languages.)<<运算符将E的定义插入到自身中。圆括号要求'match first‘,这意味着如果在两个print函数中执行possible.这里有一个针对这类表达式的简单解析器。
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'))此代码产生以下结果。
['2', '+', '2']
['3', '+', '4', '+', '5']发布于 2019-03-29 04:55:58
也许有必要详细说明@rici的评论,并为您的问题提供解决方案:
E = E "+" E / id实际上是指:E = E "+" (E / id),这是一个非结束的递归定义:
当用E替换右侧时的E = E "+" E / id:
E = (E "+" (E / id)) "+" (E / id)等。
这意味着,尽管在示例表达式中+的右操作数立即匹配(选择id production,它是终结符2),但仍然存在(永不结束)如何匹配左侧操作数的疑问。
这就是为什么您提供的EBNF是错误的,并将其更改为:
E = ( E "+" E ) / id
解决了问题。
https://stackoverflow.com/questions/48285502
复制相似问题