为了好玩而努力:http ://www.diku.dk/hjemmesider/ansatte/torbenm/Basics/
可空值的计算示例首先使用定点计算。(见第 3.8 节)
我在 Scheme 中做事并且非常依赖递归。
如果您尝试实现可为空的或首先通过递归实现,那么很明显您将在像这样的生产中无限地重复
N -> N a b
其中 N 是非终结符,a,b 是终结符。
这是否可以通过维护一组在生产规则左侧看到的非终结符递归地解决,并在我们考虑它们一次后忽略它们?
这似乎适用于可为空的。先说什么呢?
编辑:这是我从玩耍中学到的。源代码链接在底部。
非终结符在 first 的计算中不能被忽略,除非它们可以为空。
考虑:
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
in,N -> N a
我们会推断出a
哪个first(N)
是假的。相反,我们看到 N 不可为空,因此在首先计算时,我们可以省略任何N
在 RHS 中作为第一个符号找到的产生式。
这产生:
N -> M
M -> b
这告诉我们b
在first(N)
.
源代码: http: //gist.github.com/287069
所以……这听起来好吗?