问题是,peg(解析表达式语法)不允许左递归规则。我已经阅读了关于这个主题的可用答案,但是具体问题(如这个)或相当简单(例如x = symbol:(x '.')
)。
我创建了下面这个非常简单的语法来说明这个问题
EXAMPLE = x+
x = symbol:(x y* / x y z)
y = symbol:('.' x)
z = symbol:('$')
这个语法可以使用PEG.js解析器生成器进行测试。
能流利使用形式语言的人能否描述一下如何将这个规则/一组规则重写为PEG?还是有一个通用的方法/算法,允许解决左递归?
Edit:我刚找到这个维基百科页面,它描述了一种删除左递归的方法,我将研究它并尝试将其应用于上面显示的语法
PEG解析器本质上是具有无限前瞻性和有序选择的LL(*)。您的语法必须为下一个符号提供一个或多个选择,以允许解析器选择。
你的语法看起来有问题,但如果我没看错的话,你的意思是每组都有一组点和一美元。就像这样:
x -> ('.'+ '$')+
有正式的重写算法,但大多数情况下,只要弄清楚"接下来会发生什么"就足够了?和"之后是什么?"'和'它是如何重复的?'。