LL(1)-parser需要一个前瞻性符号来决定使用哪种产品。这就是为什么我总是认为“展望”这个词是使用的,当解析器查看下一个输入令牌而不“消费”它(也就是说,它仍然可以在下一个操作中从输入中读取)。然而,LR(0)解析器使我怀疑这是否正确:
我看到的LR(0)-parsers的每个例子都使用下一个输入令牌来决定是移位还是减少。在减少的情况下,不消耗输入令牌。
我使用免费软件工具"ParsingEmu“生成LR表,并在下面对单词"aab”执行LR评估。如您所见,列头包含标记。从计算中可以看到,解析器通过查看下一个输入令牌来决定使用哪一列。但是,当解析器在步骤4-6中减少时,输入不会改变(尽管解析器在执行到下一个状态的转换时需要知道下一个输入令牌"$“)。
语法:
S -> A
A -> aA
A -> b表:

评价:

现在,由于我的困惑,我做了以下假设:
现在,什么是正确的,1,2或3或完全不同的东西?
发布于 2015-03-14 18:52:11
准确地说,这一点很重要:
LR(k)解析器使用当前解析器状态和k个前瞻性符号来决定是否减少产生,如果是,则决定生产。
它还使用一个shift转换表来决定在移动下一个输入令牌之后应该移动到哪个解析状态。不管k的值如何,shift转换表都是由当前状态和正在移动的(单个)令牌键决定的。
如果在给定的解析器状态下,可能同时产生shift和reduce操作,那么解析器就会有shift/reduce冲突,并且它是无效的。因此,从理论上讲,上述两种判定都是不确定的。
如果在给定的解析器状态下,不可能进行约简,并且下一个输入符号不能移动(也就是说,该状态与该输入符号没有转换),则解析失败,算法终止。
另一方面,如果移位转换导致指定的接受状态,则解析成功,算法终止。
所有这一切意味着,前瞻性是用来预测哪一个,如果有的话,应该减少。在LR(0)解析器中,必须在读取下一个输入令牌之前决定转换(更准确地说,是尝试移位),但是要转换到do的状态的计算是在读取令牌之后进行的,此时如果不可能发生移位,则会发出错误信号。
LL(k)解析器必须预测哪种产品一看到非终端就用非终端代替非终端。基本LL算法从包含$的堆栈开始,并在完成之前执行以下任何一项操作:
在这两种情况下,查找都有相同的含义:它包括在不移动输入光标的情况下查看输入标记。
如果k为0,那么:
https://stackoverflow.com/questions/29049554
复制相似问题