谁能给我一个LL解析和LR解析的简单例子?
发布于 2019-06-08 11:15:54
与LR相比,LL解析是有缺陷的。以下是LL解析器生成器的噩梦语法:
Goal -> (FunctionDef | FunctionDecl)* <eof>
FunctionDef -> TypeSpec FuncName '(' [Arg/','+] ')' '{' '}'
FunctionDecl -> TypeSpec FuncName '(' [Arg/','+] ')' ';'
TypeSpec -> int
-> char '*' '*'
-> long
-> short
FuncName -> IDENTIFIER
Arg -> TypeSpec ArgName
ArgName -> IDENTIFIER
在遇到';‘或'{’之前,FunctionDef看起来与FunctionDecl完全一样。
LL解析器不能同时处理两个规则,因此它必须选择FunctionDef或FunctionDecl。但要知道哪一个是正确的,它必须提前查找';‘或'{’。在语法分析时,前视(k)看起来是无限的。在解析时,它是有限的,但可能很大。
LR解析器不必向前看,因为它可以同时处理两个规则。因此,LALR(1)解析器生成器可以轻松地处理此语法。
给定输入代码:
int main (int na, char** arg);
int main (int na, char** arg)
{
}
LR解析器可以解析
int main (int na, char** arg)
而不关心什么规则被识别,直到它遇到';‘或'{’。
LL解析器在'int‘处挂起,因为它需要知道哪个规则正在被识别。因此,它必须提前查找';‘或'{’。
LL解析器的另一个噩梦是语法中的左递归。左递归在语法中是正常的,对于LR解析器生成器来说没有问题,但是LL不能处理它。
所以你必须用LL以一种不自然的方式来写你的语法。
https://stackoverflow.com/questions/5975741
复制相似问题