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

时间:2011-06-25 21:26:48

标签: parsing grammar lalr lr ll

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

有人知道这样的资源吗?

4 个答案:

答案 0 :(得分:36)

维基百科的例子

LL(1)

<强>语法

S -> F
S -> ( S + F )
F -> a

<强>输入

( a + a )

解析步骤

S -> "(" S "+" F ")"
  -> ( "F" + F ) 
  -> ( "a" + F ) 
  -> ( a + "a" )       

LR(0)

<强>语法

(1) E → E * B
(2) E → E + B
(3) E → B
(4) B → 0
(5) B → 1 

<强>输入

1 + 1

解析步骤

need to build a parser table and traverse through states.

LR(1)

<强>语法

S’ -> S S 
S  -> C C 
C  -> c C | d

<强>输入

cd

解析步骤

large table

LALR

<强>语法

A -> C x A | ε
B -> x C y | x C
C -> x B x | z

<强>输入

xxzxx

解析步骤

traverse large parser table

您可能还想查看

答案 1 :(得分:19)

Parsing Techniques - A Practical Guide有几个例子(即每种类型大概有六个左右)几乎所有类型的语法。您可以购买第2版书籍,但第1版可以作者的website以PDF格式免费获得(链接底部附近)。

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

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

答案 2 :(得分:2)

我不希望你找到那些故意组织的大量语法集合。组织者将获得什么回报?

您可能有机会做的是找到与每个系列对应的解析器生成器(例如,LL(1)),然后查找该解析器生成器的输入实例,所有这些都是LL( 1)根据定义。例如,ANTLR的语法都是LL(k)的各种版本,具体取决于您选择的ANTLR版本(ANTLR版本的描述将告诉它接受的是什么); Bison语法都是LALR(1)[忽略最近的GLR选项]。如果你去我的网站(参见bio),你会看到一个几乎都没有上下文的语法列表(也就是说,不在你描述的任何类中)。

编辑:注意@Bart Kier澄清ANTLR可以明确地将语法标记为特定k的LL(k)。

答案 3 :(得分:1)

大多数yacc及其克隆或替代产品(如btyacc,hyacc,bison)的安装都有测试套件。这些测试套件中的语法一起构成了示例列表。我认为LL解析器生成器也是如此。但是我对它们了解不多。由于提到了ANTLR,因此我可能还会指出,快速搜索将显示ANTLR https://github.com/antlr/grammars-v4下的以下大型示例存储库。因此,我想这也可以作为答案。