是否有一个很好的在线资源,其中包含一些主要解析算法(LL(1)、LR(1)、LR(0)、LALR(1))的语法集合?我发现许多属于这些家族的单独语法,但我不知道有人写过大量示例语法的好资源。
有人知道这样的资源吗?
来自维基百科的例子
语法
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
您可能还想看看
Parsing Techniques - A Practical Guide有几个几乎每种语法类型的例子(即每种类型可能有六个左右)。您可以购买第 2 版书籍,尽管第 1 版可在作者网站上以 PDF 格式免费获得(靠近链接底部)。
作者还有一些测试语法,他与第二版的代码示例捆绑在一起,可以在这里找到。
注意:所有这些语法都很小(不到几十条规则),因为这显然是一本出版的书。
我不希望您找到大量以这种方式组织的语法。主办方会得到什么回报?
您可能有机会做的是找到对应于每个系列的解析器生成器(例如,LL(1)),然后查找该解析器生成器的输入实例,所有这些都将是 LL(1)定义。例如,ANTLR 的语法都是 LL(k) 的不同版本,具体取决于您选择的 ANTLR 版本(ANTLR 版本的描述会告诉它接受什么 k);Bison 语法都是 LALR(1) [忽略最近的 GLR 选项]。如果您访问我的网站(参见 bio),您会看到一个几乎与上下文无关的语法列表(也就是说,不在您描述的任何类中)。
编辑:请注意@Bart Kier 的说明,即 ANTLR 可以将特定 k 的语法显式标记为 LL(k)。
大多数 yacc 及其克隆或替换(如 btyacc、hyacc、bison)的安装都有测试套件。这些测试套件中的语法共同构成了一个示例列表。我假设 LL 解析器生成器也是如此。但我对他们了解不多。既然提到了 ANTLR,那么我也可能会指出,快速搜索将在 ANTLR https://github.com/antlr/grammars-v4下显示以下大型示例存储库所以,我想这也算是一个答案。