如何解决 PEG 中的左递归

How to resolve left recursions in PEG

问题是,PEGs (parsing expression grammars) do not allow left-recursive rules。 我已经阅读了有关该主题的可用答案,但是问题具体(例如 this one)或非常简单(例如 x = symbol:(x '.'))。

我创建了以下非常简单的语法来说明问题

EXAMPLE = x+

x = symbol:(x y* / x y z)

y = symbol:('.' x)
z = symbol:('$')

可以使用 PEG.js parser generator.

测试此语法

使用正式语言 "fluent" 的人可以描述如何将此规则/规则集重写为 PEG 吗?还是有一种通用的方法/算法可以解决左递归问题?

编辑:我刚找到 this Wikipedia page,它描述了一种删除左递归的方法,我会研究它并尝试将它应用到上面显示的语法中.

PEG 解析器本质上是具有无限前瞻性和有序选择的 LL(*)。您的语法必须为下一个符号提供一个或多个选择,以允许解析器进行选择。

你的语法看起来有问题,但如果我正确理解了你的意图,它会有一组点和每组末尾的一美元。所以它是这样的:

x -> ('.'+ '$')+

有正式的重写算法,但大多数情况下,只要弄清楚 'what could come next?' 和 'what comes after that?' 以及 'how does it repeat?'.

就足够了