对于一些主要的解析算法(LL(1),LR(1),LR(0),LALR(1)),是否有一个良好的在线资源和一组语法?我发现许多单独的语法属于这些家庭,但我知道没有好的资源,有人写了大量的示例语法。
有人知道这样的资源吗?
答案 0 :(得分:36)
维基百科的例子
<强>语法强>
S -> F
S -> ( S + F )
F -> a
<强>输入强>
( a + a )
解析步骤
S -> "(" S "+" F ")"
-> ( "F" + F )
-> ( "a" + F )
-> ( a + "a" )
<强>语法强>
(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.
<强>语法强>
S’ -> S S
S -> C C
C -> c C | d
<强>输入强>
cd
解析步骤
large table
<强>语法强>
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下的以下大型示例存储库。因此,我想这也可以作为答案。