首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >LL解析和LR解析有什么不同?

LL解析和LR解析有什么不同?
EN

Stack Overflow用户
提问于 2011-05-12 17:08:48
回答 1查看 83.8K关注 0票数 251

谁能给我一个LL解析和LR解析的简单例子?

EN

回答 1

Stack Overflow用户

发布于 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以一种不自然的方式来写你的语法。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5975741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档