【发布时间】:2010-11-03 22:36:19
【问题描述】:
LL 解析器与 LR 解析器相比有哪些优势以保证它们在 today's parser generator tools 中的相对受欢迎程度?
根据Wikipedia,LR 解析似乎比 LL 更有优势:
LR 解析比 LL 解析可以处理更大范围的语言,并且在错误报告方面也更好,即当输入不符合语法时,它会尽快检测到语法错误。这与 LL(k)(或者更糟糕的是,LL(*) 解析器)形成对比,后者可能会由于回溯而将错误检测推迟到语法的不同分支,这通常会使错误更难在具有长公共前缀的析取中定位.
注意:这不是家庭作业。当我发现 Antlr 是一个 LL 解析器生成器时,我感到很惊讶(尽管它的名称中有“LR”!)。
【问题讨论】:
-
谈论解析器(而不是语法):LL(*) 可以用简单的递归方式编写。这是我书中的 +1。
-
@pst:没错,我只是希望“因为它们更容易实现”不是主要优势。 :)
-
请注意,ANTLR 中的“LR”仅代表“语言识别”,与它接受的语法类别无关。
-
其实在 Terrence Parr 的心目中,它代表的是Anti-LR。至少我记得有一次采访他,他承认这个内涵并非偶然。他说他专门创建了 ANTLR,因为他觉得几乎完全专注于 LR 解析是一个很大的错误,他厌倦了告诉所有人 LR 很烂,没有人在听,所以他决定创建世界上最好的解析器生成器,粉碎所有其他人,只留下 LL 站着……或类似的东西。
-
@Jörg:我刚刚给他发了电子邮件,邀请他参加这次讨论。他可能很忙,但也许他还会加入!
标签: parsing parser-generator lalr ll lr