首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >节俭-规则‘规则’完全匹配,但它不会消耗所有文本

节俭-规则‘规则’完全匹配,但它不会消耗所有文本
EN

Stack Overflow用户
提问于 2018-01-17 00:12:41
回答 2查看 831关注 0票数 1

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

代码语言:javascript
复制
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))

我得到了这个错误:

代码语言:javascript
复制
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,但也不能在上面工作。感谢你的帮助。

EN

回答 2

Stack Overflow用户

发布于 2018-01-18 04:16:44

我不能提供任何你提到的解析器。您是否考虑过pyparsing

  • id被定义为一位数字token.
  • Forward表示E将在代码中稍后定义。(这类似于过程转发中‘languages.)
  • The’的用法。<<运算符将E的定义插入到自身中。圆括号要求'match first‘,这意味着如果在两个print函数中执行possible.
  • The解析器,则将应用'or’中的第一个表达式。

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

代码语言:javascript
复制
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'))

此代码产生以下结果。

代码语言:javascript
复制
['2', '+', '2']
['3', '+', '4', '+', '5']
票数 1
EN

Stack Overflow用户

发布于 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

解决了问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48285502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档