简约的规则“规则”完全匹配,但它没有消耗所有的tex

2024-09-28 16:58:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为表达式创建一个简单的解析器,这是我的代码:

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))

我得到这个错误:

^{pr2}$

我也尝试过百灵鸟解析器,但也无法在这方面工作。感谢帮助。在


Tags: 代码importidparser解析器parse表达式as
2条回答

或许有必要详细阐述@rici的评论,并给出解决问题的方法:

E = E "+" E / id实际上是指:E = E "+" (E / id),这是一个无结尾的递归定义:

E = E "+" E / idE被替换为右侧时:

E = (E "+" (E / id)) "+" (E / id)

这意味着,尽管+的右操作数在示例表达式中立即匹配(选择id产生式,即终端字符2),但对于如何匹配左侧仍然存在疑问。在

这就是为什么您提供的EBNF是错误的,并将其更改为:

E = ( E "+" E ) / id

解决问题。在

我不能提供任何你提到的解析器。你有没有考虑过pyparsing?在

  • id被定义为一位数的数字标记。在
  • Forward表示{}将在稍后的代码中定义。(这类似于过程语言中“forward”的用法。)
  • <<运算符将E的定义插入自身。括号调用“match first”,这意味着如果可能,将应用“or”中的第一个表达式。在
  • 解析器在两个print函数中执行。在

这里有一个针对这种表达式的简单解析器。在

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'))

这个代码产生这个结果。在

^{pr2}$

相关问题 更多 >