Parsing 这个';算法';对于可空和第一个工作(在解析器中)?
为了好玩,完成这项工作: nullable和first的示例计算使用定点计算。(见第3.8节) 我在Scheme中做事情,并且非常依赖递归 如果您尝试通过递归实现nullable或first,那么应该很清楚,您将在类似Parsing 这个';算法';对于可空和第一个工作(在解析器中)?,parsing,compiler-theory,Parsing,Compiler Theory,为了好玩,完成这项工作: nullable和first的示例计算使用定点计算。(见第3.8节) 我在Scheme中做事情,并且非常依赖递归 如果您尝试通过递归实现nullable或first,那么应该很清楚,您将在类似 N->N a b 其中N为非端子,a、b为端子 通过维护一组出现在产生式规则左侧的非终结符,并在我们对它们进行一次解释后忽略它们,可以递归地解决这个问题吗 这似乎适用于nullable。首先呢 编辑:这是我从游戏中学到的。源代码链接在底部 在计算第一个时不能忽略非端子,除非它们可
N->N a b
其中N为非端子,a、b为端子
通过维护一组出现在产生式规则左侧的非终结符,并在我们对它们进行一次解释后忽略它们,可以递归地解决这个问题吗
这似乎适用于nullable。首先呢
编辑:这是我从游戏中学到的。源代码链接在底部
在计算第一个时不能忽略非端子,除非它们可以为空
考虑:
N -> N a
N -> X
N ->
这里我们可以忽略na
中的N
,因为N
是可以为空的。我们可以将N->na
替换为N->a
,并推断a
是first(N)
的成员
在这里,我们不能忽略N
:
N -> N a
N -> M
M -> b
如果我们忽略N->na
中的N
,我们将推断a
位于first(N)
中,这是错误的。相反,我们看到N是不可为空的,因此,当首先计算时,我们可以忽略任何产生式,其中N
是RHS中的第一个符号
这将产生:
N -> M
M -> b
这告诉我们b
在first(N)
中
源代码:
所以。。。这听起来可以吗?我建议继续读下去:)
3.13为LL(1)解析重写语法
,尤其是3.13.1消除左递归
请注意,您也可能遇到间接的左递归:
A -> Bac
B -> A
B -> _also something else_
但这里的解决方案与第一个示例中消除直接左递归非常相似
你可能想用一种更直接的方式来解释它。更少的理论:)您不仅有一个无限递归程序,而且即使在一台具有无限计算能力的计算机上,您也没有提供任何终止此生产的方法-N可以有哪些其他值不包括N?对不起,这只是一个示例规则来说明我的观点。我将在午休时间尝试填写问题,并展示一些代码、示例数据等。