首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自上而下解析器希望在“Code”中有一个像样的case示例左递归

自上而下解析器希望在“Code”中有一个像样的case示例左递归
EN

Stack Overflow用户
提问于 2010-10-24 15:58:58
回答 1查看 2.3K关注 0票数 5

你好,flow成员上的堆栈。

我正在学习编译器课程。我确实理解自上而下解析器应该避免左递归,并转换为右递归方式。

问题是,

a)我是否理解为右自顶向下解析器等于LL,自下而上解析器等于LR?

b)我发现左递归是一种规则,它自称为ex) Expr :== '+‘Term | Term,它可以导致无限循环找到Expr。但不管怎样,有没有考虑用C或Java输入的示例代码?(我不想要解析器或扫描器代码)我需要的是带有句子形式的案例代码示例,它通过左递归进行无限循环。

c)在自顶向下解析器中使用Right Recursion的方式实际上有什么不同?

答案c)消除了回溯的需要。但还有其他的东西吗?

答案b) x - 2 * y,还有其他的东西吗?因为这一次使用回溯解析的方式。

我已经找出了非左递归和左递归的例子。

左递归语法

代码语言:javascript
复制
A -> Ax

非左递归语法

代码语言:javascript
复制
A -> Bx
B -> Ay

两者都进入了无限循环。

感谢并感谢你们所有的专家。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-10-25 06:24:01

a)我是否理解为右自顶向下解析器等于LL,自下而上解析器等于LR?是

自上而下的解析器使用左递归进入无限循环,因为代码中的结果如下所示:

代码语言:javascript
复制
A() {
  A(); match(x);
}

A永远调用自己,并且永远不会从输入流中删除任何内容。

左递归不一定是直接的,所以你的“非左递归语法”仍然是左递归的:

代码语言:javascript
复制
A -> Bx | z
B -> Ay

您可以看到,如果您将B替换为其结果,则它是左递归的:

代码语言:javascript
复制
A -> Ayx | z

下面是一个将左递归语法正确转换为右递归语法的示例:

代码语言:javascript
复制
E -> E + T | T

右递归:

代码语言:javascript
复制
E -> T B
B -> + T B | Lambda

E -> T B,因为在规则E -> E+T|T中,在完成规则的应用后,T将始终出现在最左边。由于最左侧由E -> T B负责,我们可以自由构造字符串的右侧,就像我们使用B -> +T B所做的那样。我们需要一个λ产生式来为我们的递归提供一个停止点。

-> Ax和A -> xA是等价的语法,只是一个是左的,另一个是右递归的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4007479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档