如何解决 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?'.
就足够了
问题是,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?'.
就足够了