Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 这个';算法';对于可空和第一个工作(在解析器中)?_Parsing_Compiler Theory - Fatal编程技术网

Parsing 这个';算法';对于可空和第一个工作(在解析器中)?

Parsing 这个';算法';对于可空和第一个工作(在解析器中)?,parsing,compiler-theory,Parsing,Compiler Theory,为了好玩,完成这项工作: nullable和first的示例计算使用定点计算。(见第3.8节) 我在Scheme中做事情,并且非常依赖递归 如果您尝试通过递归实现nullable或first,那么应该很清楚,您将在类似 N->N a b 其中N为非端子,a、b为端子 通过维护一组出现在产生式规则左侧的非终结符,并在我们对它们进行一次解释后忽略它们,可以递归地解决这个问题吗 这似乎适用于nullable。首先呢 编辑:这是我从游戏中学到的。源代码链接在底部 在计算第一个时不能忽略非端子,除非它们可

为了好玩,完成这项工作:

nullable和first的示例计算使用定点计算。(见第3.8节)

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

如果您尝试通过递归实现nullable或first,那么应该很清楚,您将在类似

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?对不起,这只是一个示例规则来说明我的观点。我将在午休时间尝试填写问题,并展示一些代码、示例数据等。