LL(1),LR(1),LR(0),LALR(1)语法的例子?

tem*_*def 56 grammar parsing lalr ll-grammar lr-grammar

对于一些主要的解析算法(LL(1),LR(1),LR(0),LALR(1)),是否有一个很好的在线资源和一组语法?我发现许多单独的语法属于这些家庭,但我知道没有好的资源,有人编写了大量的示例语法.

有谁知道这样的资源?

Pra*_*ate 37

来自维基百科的例子

LL(1)

语法

S -> F
S -> ( S + F )
F -> a
Run Code Online (Sandbox Code Playgroud)

输入

( a + a )
Run Code Online (Sandbox Code Playgroud)

解析步骤

S -> "(" S "+" F ")"
  -> ( "F" + F ) 
  -> ( "a" + F ) 
  -> ( a + "a" )       
Run Code Online (Sandbox Code Playgroud)

LR(0)

语法

(1) E ? E * B
(2) E ? E + B
(3) E ? B
(4) B ? 0
(5) B ? 1 
Run Code Online (Sandbox Code Playgroud)

输入

1 + 1
Run Code Online (Sandbox Code Playgroud)

解析步骤

need to build a parser table and traverse through states.
Run Code Online (Sandbox Code Playgroud)

LR(1)

语法

S’ -> S S 
S  -> C C 
C  -> c C | d
Run Code Online (Sandbox Code Playgroud)

输入

cd
Run Code Online (Sandbox Code Playgroud)

解析步骤

large table
Run Code Online (Sandbox Code Playgroud)

LALR

语法

A -> C x A | ?
B -> x C y | x C
C -> x B x | z
Run Code Online (Sandbox Code Playgroud)

输入

xxzxx
Run Code Online (Sandbox Code Playgroud)

解析步骤

traverse large parser table
Run Code Online (Sandbox Code Playgroud)

您可能还想看看

  • 你能告诉我如何证明一个语法是LR(0)还是SLR(1)吗? (2认同)
  • 我不相信给定的语法是 LR(0)。在状态: [S -> E .], [E -> E . + B] 我们有一个 shift/reduce 冲突。我们需要使用lookahead的token来决定是否减少,S -> E。在 $ 前瞻,或继续转移。使用 S 的通用 FOLLOW 集解决冲突,使语法 SLR 不是 LR(0)。 (2认同)

Jas*_*ore 20

解析技术 - 实用指南有几个例子(即每种类型可能有六个左右)几乎所有类型的语法.您可以购买第2版书籍,虽然第1版可以在作者的网站上以PDF格式免费获得(链接底部附近).

作者还有一些测试语法,他与第二版的代码示例捆绑在一起,可以在这里找到.

注意:所有这些语法都很小(不到几十条规则),因为这显然是一本出版的书.