Python lrparsing模块;无法解析简单的递归语法

Python lrparsing模块;无法解析简单的递归语法,第1张

概述expr = Ref('expr')block = '{' + Repeat(expr) + '}'expr = block | Token(re='[0-9]')START = expr 这是使用Python的lrparsing模块语法.该模块报告语法中没有冲突. 它无法解析带有错误的字符串{{0}} lrparsing.ParseError:第1行第5列:在尝试匹配状态11中的块时期望
expr = Ref('expr')block = '{' + Repeat(expr) + '}'expr = block | Token(re='[0-9]')START = expr

这是使用Python的lrparsing模块的语法.该模块报告语法中没有冲突.

它无法解析带有错误的字符串{{0}}
lrparsing.ParseError:第1行第5列:在尝试匹配状态11中的块时期望__end_of_input__时得到’}’

堆栈状态一步一步是:

shift  '{'; ItemSet:5='{'shift  '{'; ItemSet:5='{' ItemSet:5='{'shift  /[0-9]/; ItemSet:4=/[0-9]/ ItemSet:5='{' ItemSet:5='{'reduce '}'; ItemSet:4=/[0-9]/ -- ItemSet:7=expr ItemSet:5='{' ItemSet:5='{'reduce '}'; ItemSet:7=expr -- ItemSet:9=expr ItemSet:5='{' ItemSet:5='{'shift  '}'; ItemSet:11='}' ItemSet:9=expr ItemSet:5='{' ItemSet:5='{'

哪个afaik意味着它正在移动{{0,然后看到}将0减少到expr,然后再次减少}而没有先移动它,这使bajeezus混淆了我.

这是一个错误,还是我在做一些无限简单和愚蠢的事情?

如果这是我的语法,我将如何重构它以满足我永恒的热情和热情的欲望?如果这是一个错误,有人可以指导我一个python模块,其语法与lrparsing最相似吗?

编辑:
重构为:

blocks = Ref('blocks')block = Ref('block')expr = Ref('expr')blocks = blocks + block | THIS*0 # THIS*0 is the idiomatic way of getting the empty stringblock = '{' + expr + '}'expr = blocks | Token(re='[0-9]')START = expr

允许正确的解析.我现在的问题是……为什么?我觉得lrparsing会早些时候向我抱怨任何解析问题……重复是不是按照我期望的方式工作?

解决方法 lrparsing有一个BUG;它没有正确考虑递归重复.

您的实际问题可以通过简单的递归来解决,就像您在扩展编辑中所做的那样,尽管杂乱少一点.

block = Ref('block')block = '{' + block + '}' | Token(re='[0-9]')START = block

另请注意,您的原始语法允许输入{{0 {1}}}. (原因是可重复的部分可以扩展为简单的数字或再次扩展.)考虑到你的第二个语法,你可能不希望这样.

我确实用pyparsing完成了一些工作,但语法却大相径庭.类似的例子:

from pyparsing @R_404_5565@ Forward,literal,nums,oneOf,Wordl = lambda c: literal(c).suppress()block = Forward()block << (Word(nums,exact=1) ^ l('{') + block + l('}'))print(block.parseString("{{0}}"))

输出:

['0']

希望有所帮助.

总结

以上是内存溢出为你收集整理的Python lrparsing模块;无法解析简单的递归语法全部内容,希望文章能够帮你解决Python lrparsing模块;无法解析简单的递归语法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1193012.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-03
下一篇2022-06-03

发表评论

登录后才能评论

评论列表(0条)

    保存