任何人都可以给我一个LL解析与LR解析的简单例子吗?
我正在研究我的编译器概念但是我有点困惑...谷歌搜索让我无处可寻.
SLR和LR(0)解析器是同一个吗?如果没有,那么差异是什么?
如何识别语法是LL(1),LR(0)还是SLR(1)?
任何人都可以使用此示例或任何其他示例来解释它吗?
X→Yz | 一个
Y→bZ | ε
Z→ε
对于一些主要的解析算法(LL(1),LR(1),LR(0),LALR(1)),是否有一个很好的在线资源和一组语法?我发现许多单独的语法属于这些家庭,但我知道没有好的资源,有人编写了大量的示例语法.
有谁知道这样的资源?
我理解LR和LALR都是自下而上的解析算法,但两者之间有什么区别?
LR(0),LALR(1)和LR(1)解析之间有什么区别?如何判断语法是LR(0),LALR(1)还是LR(1)?
compiler-construction parsing lalr context-free-grammar lr-grammar
LL解析器比LR解析器有什么优势可以保证它们在今天的解析器生成器工具中相对流行?
根据维基百科,LR解析似乎比LL更有优势:
LR解析可以处理比LL解析更大范围的语言,并且在错误报告方面也更好,即它在输入不尽快符合语法时检测语法错误.这与LL(k)(或甚至更糟的LL(*)解析器)形成对比,LL(k)可能由于回溯而将错误检测推迟到语法的不同分支,通常使错误难以在具有长公共前缀的分离上进行本地化. .
注意:这不是作业.当我发现Antlr是一个LL解析器生成器(尽管名字中有"LR")时,我感到很惊讶.
我曾经认为C++是"怪异"的一个与所有与歧义<和>,而是试图实现一个解析器我想我找到打破一个例子之后几乎每一个使用的语言<和>泛型类型:
f(g<h, i>(j));
Run Code Online (Sandbox Code Playgroud)
这可以在语法上解释为泛型方法call(g),也可以解释为给出f两次比较的结果.
这些语言(特别是Java,我认为应该是LALR(1) - 可解决的?)如何克服这种语法模糊性?
我无法想象任何非hacky/context-free方式来解决这个问题,我对这种语言如何无上下文感到困惑,更不用说LALR(1)-parsable ......
(值得注意的是,即使是GLR解析器也无法为此语句返回单个解析而没有上下文!!)
所有LL语法都是LR语法,但不是相反,但我仍然很难处理这种区别.我很好奇LR示例中没有等效LL表示的小例子(如果有的话).
我无法理解如何计算LR(1)-items的前瞻.
让我们说我有这个语法:
S -> AB
A -> aAb | a
B -> d
Run Code Online (Sandbox Code Playgroud)
LR(1)-item是具有前瞻的LR(0)项.所以我们将为状态0得到以下LR(0)-item:
S -> .AB , {lookahead}
A -> .aAb, {lookahead}
A -> .a, {lookahead}
Run Code Online (Sandbox Code Playgroud)
州:1
A -> a.Ab, {lookahead}
A -> a. ,{lookahead}
A -> .aAb ,{lookahead}
A ->.a ,{lookahead}
Run Code Online (Sandbox Code Playgroud)
有人可以解释如何计算前瞻吗?一般方法是什么?
先感谢您
我一直在维基百科上阅读,并注意到虽然存在LR(0)解析器,但是没有LL(0)解析器这样的东西.
根据我的阅读,我理解LL(k)/ LR(k)中的k表示解析器在当前正在处理的当前字符之外可以看到多少个字符.
所以我的问题是,为什么即使LR(0)存在,也没有LL(0)解析器这样的东西?
lr-grammar ×10
parsing ×10
ll-grammar ×6
grammar ×3
lalr ×3
algorithm ×2
dfa ×1
java ×1
lookahead ×1