web-dev-qa-db-ja.com

LL(1)、LR(1)、LR(0)、LALR(1)文法の例?

主要な解析アルゴリズム(LL(1)、LR(1)、LR(0)、LALR(1))のいくつかの文法のコレクションを備えたオンラインのリソースがありますか?これらのファミリーに属する多くの個々の文法を見つけましたが、誰かが大量の文法例を作成した良いリソースがないことを知っています。

誰もがそのようなリソースを知っていますか?

55
templatetypedef

解析手法-実用ガイド には、ほぼすべてのタイプの文法のいくつかの例(つまり、タイプごとにおそらく半ダース程度)があります。第2版​​の本を購入できますが、第1版は著者の website in PDFフォーム(リンクの下部近く)で無料で入手できます。

著者には、第2版のコード例にバンドルしているテスト文法もあります。これは here にあります。

注:これらの文法はすべて、明らかに出版された本であるため、数十個のルールよりも小さいものです。

19
Jason Moore

ウィキペディアの例

LL(1)

文法

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

input

( 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 

input

1 + 1

解析ステップ

need to build a parser table and traverse through states.

LR(1)

文法

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

input

cd

解析ステップ

large table

[〜#〜] lalr [〜#〜]

文法

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

input

xxzxx

解析ステップ

traverse large parser table

また見たいかもしれません

36
Prashant Bhate

意図的にそのように編成された文法の大規模なコレクションを見つけることを期待しません。主催者は見返りに何を得ますか?

あなたがする可能性があるのは、各ファミリーに対応するパーサージェネレーター(たとえば、LL(1))を見つけ、そのパーサージェネレーターの入力のインスタンスを探すことです。すべてがLL(1)になります定義。たとえば、ANTLRの文法は、選択するANTLRのバージョンに応じて、LL(k)のすべてのさまざまなバージョンです(ANTLRバージョンの説明により、受け入れられるkがわかります)。バイソンの文法はすべてLALR(1)[最近のGLRオプションを無視]です。私のWebサイト(略歴を参照)にアクセスすると、文脈のほとんどない(つまり、説明するどのクラスにも属さない)文法のリストが表示されます。

編集:ANTLRが特定のkの文法をLL(k)として明示的にマークできるという@Bart Kierの説明に注意してください。

2
Ira Baxter