首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >这个用于可空和第一个的“算法”(在解析器中)是否有效?

这个用于可空和第一个的“算法”(在解析器中)是否有效?
EN

Stack Overflow用户
提问于 2010-01-25 20:37:28
回答 1查看 361关注 0票数 4

为了好玩而处理这个:http://www.diku.dk/hjemmesider/ansatte/torbenm/Basics/

示例计算为空,并首先使用定点计算.(见第3.8条)

我在Scheme中做一些事情,并且非常依赖递归。

如果您尝试通过递归实现可空或先为空,那么很明显,您将在如下的产品上无限地重复使用

N -> N a b

其中N是非终端,a,b是终端.

这能否通过维护生产规则左边的一组非终端机来递归地解决,而在我们对它们进行了一次核算之后就忽略了它们?

这似乎适用于可空的。首先呢?

编辑:,这是我从游戏中学到的东西。源代码链接在底部。

在第一阶段的计算中,不能忽略非终端,除非它们是可空的。

考虑:

代码语言:javascript
运行
复制
N -> N a
N -> X
N -> 

在这里,我们可以忽略NN a中,因为N是可空的。我们可以将N -> N a替换为N -> a,并推断afirst(N)的成员。

在这里我们不能忽视N

代码语言:javascript
运行
复制
N -> N a
N -> M
M -> b

如果我们忽略了N中的N -> N a,我们就会推断afirst(N)中,这是假的。相反,我们看到N是不可空的,因此,当首先计算时,我们可以省略N作为RHS中的第一个符号的任何产生。

这产生了:

代码语言:javascript
运行
复制
N -> M
M -> b

这告诉我们bfirst(N)

源代码:http://gist.github.com/287069

所以..。这听起来可以吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-08 16:00:46

我建议继续阅读:)

3.13 Rewriting a grammar for LL(1) parsing,特别是3.13.1 Eliminating left-recursion.

请注意,您也可能遇到间接的左递归:

代码语言:javascript
运行
复制
A -> Bac
B -> A
B -> _also something else_

但是这里的解决方案非常类似于消除直接左递归,就像在第一个例子中一样。

您可能需要检查一下本论文,它以更直接的方式解释了它。减去理论:)

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

https://stackoverflow.com/questions/2135448

复制
相关文章

相似问题

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