正确的递归语法还是左递归?

时间:2014-06-03 21:21:15

标签: c++ c parsing markup

我几乎不知道我要问什么,所以我想根据为给定语法实现解析器所需的技能水平提出一个建议(因为我是这种语言的初学者)解析器和语言的正式方法。)

仅仅回顾几年,这种情况让我想起了一些Pascal语法与C / C ++语法,这与正确的东西相比。

但是我不会做任何这样的事情,我的目的是为Markdown这样的文档实现一个简单的标记语言解析器。

因此,考虑到我开始考虑使用标记语言,我想保持简单,这是最容易处理这两个选项之间的原因。另一种语法对我来说可能更容易?如果是,你建议哪一个?

3 个答案:

答案 0 :(得分:2)

右递归与左递归主要取决于你将如何实现解析器。

如果你要做一个自上而下(例如,递归下降)解析器,你通常想在语法中使用正确的递归(对于纯递归下降,这是唯一的选择)。

如果您要进行自下而上的解析器,通常需要使用左递归。自下而上的解析器通常使用像Yacc或Bison这样的解析器生成器生成,其中大多数可以在需要时处理正确的递归,但可以更有效地处理左递归。

答案 1 :(得分:1)

这取决于您使用的解析器类型。如果使用LL类型,则必须使用正确的递归。

如果使用LR类型,则可以使用左或右递归。但是,左递归可以最小化堆栈深度。

答案 2 :(得分:1)

有两种基本类型的语法:

LL(k) = Left to tight, leftmost derivation, k symbols look ahead
LR(k) = Left to right, rightmost derivation, k symbols look ahead

LR解析器手动编写要困难得多,但是它们比LL解析器更强大。如果您正在查看一些流行的解析器生成器工具:

ANTLR : a LL parser
BISON:  a LALR(1) parser (a type of LR parser but a bit less powerful)
CUP:    a LALR(1) parser (outputs Java / C# code)