コンパイラ - LR(1)

LL 文法では順列によって拡張し、最後に最後にすべての端子を取得しますが、LR 文法では文法分析はボトムアップで、すべての項から開始し、順列によって削減し、最終的に開始ルートを取得します。位置 S

→ aABe
A → Abc | b
B → d

文字列:abbcde

まず最初の文字 a を読んで、文法に置換があるかどうかを確認するため、スキップして
2 番目の文字 b を読むことを選択します。この時点では ab があります。次のルールに違反せずに置換できるものはありますか?セット?? b を A に置き換えて aA を形成できることがわかりました。問題ありません。a の後に続く文字列は A
の現在の文字列になります: aAbcde


次に、3 番目の文字 b を逆方向に読み続けます。このとき、aAb があります。フォロー セットに違反せずに置換できるものはありますか? 一見すると、b を A に置き換えて aAAA を形成できるように見えますが、A のフォローは A になる可能性があることに注意してください。明らかに違います!したがって、スキップして次の文字 c
現在の文字列の読み取りを続けることを選択します: aAbcde

この時点では aAbc がありますが、フォロー セットに違反せずに置き換えることができるものはありますか?
Abc を A に置き換えて aA を形成できることを見つけるのは難しくありません。これは、現在の文字列: aAde のセットに違反しません。

この時、次の文字を読み込んだ後にaAdがあるのですが、フォローセットに違反せずに置き換えられるものはありますか?
フォローセットに違反せずに d を B に置き換えることができることがわかり、現在の文字列aAB が形成されます: aABe

この時、aABeは次の文字を読み込んでから取得するのですが、フォローセットに違反せずに置き換えられるものはありますか?S は完全に一致することがわかり、 
最終的に
S の現在の文字列が形成されます。

古典的な式構文の例:

古典的な式の文法:
0.Goal → Expr
1.Expr → Expr + Term

2.| Expr - 期間

3.| 学期

4.期間→期間*係数

5.| 用語/要素

6.| 要素

7.因子→ID

8.| 番号

9.| ( 式 )

文字列 : x + 5 * y id + num * id

stack (スタックによって読み取られた内容) 入力(インプット) アクション(行動)
空の ID+番号*ID シフト
ID +番号*ID 8を減らす
要素 +番号*ID

6を減らす

学期 +番号*ID 3を減らす
エクスプレッション +番号*ID シフト
Expr+ それは? シフト
エクスプレッション *ID 7を減らす
式+係数 *ID 6を減らす
式+項 *ID シフト
式+項* ID シフト
Expr+Term*id えふ 8を減らす
Expr+Term*係数 えふ 4を減らす
式+項 えふ 1を減らす
エクスプレッション 0を減らす
ゴール

ここで注意すべき点がいくつかあります。最初の例では、置換後、二次置換は行われず、シフトは下に進み続けます。しかし、
この例では、シフトによって文字がスタックに読み込まれると、合理的な理由がある限り、置換メソッドは置換できるものがなくなるまで置換する必要があり、以下に従い、シフトを続けて次の文字をスタックに読み込みます。

2つ目の注意点は、表の下から3行目と4行目です。
 

Expr+Term*係数 えふ 4を減らす
式+項 えふ 1を減らす

 実際、ここには明確な代替手段はありません。たとえば、Expr+Term*Factor は 4 を減らすことができますが、同時に 6 を減らして Expr+Term*Term を形成することもでき、これも準拠しています。これは、表現ロジックやシステムを通じて簡単に選択を行うことができます 適切な選択を決定するための明確なアルゴリズムはありません 

簡単な例を見てみましょう。

0.ゴール→A

1.A → はい

2.| ある

クロージャーの生成:
この時点で、プレースホルダー「プレースホルダー」シンボルを追加します。

レベル0 目標 → • A,eof 
レベル1

A → • Aa,eof

| • a、eof     

レベル2

あ → • あ、あ

A → •a、a

 レベル 0 では、 • 現在の開始位置を表します。 Goal は文字列全体を表すため、eof は終了記号を表します。

レベル 1 では、A を Aa と a に置き換えると、a の後に eof を続けることができることがわかります。

レベル 2 では、Aaa などのネストされた置換が再度実行されると、a の後に a を続けることができることがわかります。そのため、a を使用して反映します。

アクションテーブル
ある えふ
s0 s2
s1 s3 受け入れる
s2 r2 r2
s3 r1 r1
テーブルに移動
s0 s1
s1 \
s2 \
s3 \

解析して次のようにします:

おすすめ

転載: blog.csdn.net/weixin_43754049/article/details/126304425