关于解析:从LL(*)到PEG是否存在定义明确且合理的转换?

Is there a well-defined and well-reasoned transformation from LL(*) to PEG?

我正在研究PEG(解析表达式语法)解析器,而我正在研究的主题之一是与其他解析技术的等效性。

在《从正则表达式到解析表达语法》中,我找到了一篇有关将正则表达式转换为等效PEG的好论文。

我希望为LL(*)解析器找到类似的处理方法,但目前还是空手而归。 在我看来,第1节中描述的许多技术也将适用于LL(*)转换问题,但是我对形式主义的了解不够,无法对自己的分析充满信心。

您的集体帮助将不胜感激!


我认为,关于PEG的Wikipedia文章就说明了一切。 PEG通过使用子句排序消除歧义来进行递归下降。 从理论上讲,可以用递归血统解析的语言家族是LL家族,但是,由于PEG具有无限的前瞻性并且没有歧义,因此该家族应该是一个更大的家族,可能是完整的CFG。

每个LL(k)语法都可以由具有k个超前值的递归下降解析器实现,因此可以通过对规则进行排序将每个LL(k)语法转换为PEG语法,从而将需要最长查找时间的规则排在第一位。

这是LL(k)语法:

1
2
params = expr
params = expr ',' params

为了使其成为同一语言的PEG语法,必须对规则进行重新排序:

1
2
params = expr ',' params
params = expr