为了好玩而处理这个:http://www.diku.dk/hjemmesider/ansatte/torbenm/Basics/
示例计算为空,并首先使用定点计算.(见第3.8条)
我在Scheme中做一些事情,并且非常依赖递归。
如果您尝试通过递归实现可空或先为空,那么很明显,您将在如下的产品上无限地重复使用
N -> N a b
其中N是非终端,a,b是终端.
这能否通过维护生产规则左边的一组非终端机来递归地解决,而在我们对它们进行了一次核算之后就忽略了它们?
这似乎适用于可空的。首先呢?
编辑:,这是我从游戏中学到的东西。源代码链接在底部。
在第一阶段的计算中,不能忽略非终端,除非它们是可空的。
考虑:
N -> N a
N -> X
N ->
在这里,我们可以忽略N
在N a
中,因为N
是可空的。我们可以将N -> N a
替换为N -> a
,并推断a
是first(N)
的成员。
在这里我们不能忽视N
N -> N a
N -> M
M -> b
如果我们忽略了N
中的N -> N a
,我们就会推断a
在first(N)
中,这是假的。相反,我们看到N是不可空的,因此,当首先计算时,我们可以省略N
作为RHS中的第一个符号的任何产生。
这产生了:
N -> M
M -> b
这告诉我们b
在first(N)
。
源代码:http://gist.github.com/287069
所以..。这听起来可以吗?
发布于 2011-03-08 16:00:46
我建议继续阅读:)
3.13 Rewriting a grammar for LL(1) parsing
,特别是3.13.1 Eliminating left-recursion
.
请注意,您也可能遇到间接的左递归:
A -> Bac
B -> A
B -> _also something else_
但是这里的解决方案非常类似于消除直接左递归,就像在第一个例子中一样。
您可能需要检查一下本论文,它以更直接的方式解释了它。减去理论:)
https://stackoverflow.com/questions/2135448
复制相似问题