コンパイラー - 構文指向の変換標準

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

1.代入 → ident = Expr; //Assignノード
2.Expr → Expr + Termを作成 //プラスノードを作成

3. | Expr - Term //マイナスノードの作成

4. | 学期

5.Term → Term * Factor //Multノードの作成

6. | 項 / 因子 //div ノードの作成

7. | 要素

8.Factor → ident //identノードの作成

9. | num //num ノードを作成します

10. | ( 式 )

x = a * 3 + b ;

解析ツリー

 AST の目的はコードを生成することなので、本質的には解析ツリー上の冗長な情報を削除しますが、元のトークン情報と構造
AST は保持します。

a→r1をロード

ロード3→r2

r1,r2→r3が多い

負荷b→r4

r3,r4→r5を追加

r5→xを保存

yacc (Yet Another Compiler Compiler) は、構文アナライザーを生成するための古典的なツールですyacc によって生成されるコンパイラは、主に C 言語で書かれた構文パーサー (パーサー) であり、字句パーサー Lex と一緒に使用する必要があり、2 つの部分によって生成された C プログラムを一緒にコンパイルします。

GNU Bison は、LALR (1) 解析テーブルを使用して、注釈付き文脈自由文法を決定論的 LR または一般化 LR (GLR) パーサーに変換する汎用パーサー ジェネレーターです。Bison は、IELR (1) または正規 LR (1) 解析テーブルを生成することもできます。Bison に習熟したら、それを使用して、単純なデスクトップ電卓で使用されるものから複雑なプログラミング言語に至るまで、幅広い言語のパーサーを開発できます。

Bison は Yacc と上位互換性があります。適切に記述された Yacc 文法はすべて Bison で動作します。Yacc に精通している人であれば、Bison を問題なく使用できるはずです。

率直に言うと、Yacc と Bison が行うことは、文法と関連する動作からクロージャ ActionTable GotoTable                                                                   を生成し
。つまり、コンパイルされた文法によって生成された C コードはコンパイルされます。の終わりの部分

 YaccやBisonでは、左辺を$$、右辺を$numで表現しており、例えば上記5行目は
$$ → $1 $2 $3
$$ = MakingMultNode($1,$3)と表現されます。

 この行は Term を Factor に置き換えるだけであり、新しいノード 
$$ = $1は生成しません。

$本質的にノードへのポインタ
MakingMultNode(Node * n1, Node * n2)
createNewNode n
n.left = n1
n.right = n2
return &n

つまり、LR(1) 文法で Reduce 7 が実行されるたびに、$$ = $1 が実際に実行されて AST が生成されます。



8 行目と 9 行目では、この置換はターミナルのMakingIdentNode(token)
MakingNumNode(num)に行われます。 

コスト(追加) = 1
コスト(サブ) = 1
コスト(マルチ) = 3
コスト(div) = 7
コスト(ロード識別子) = 4
コスト(ストア) = 3
コスト(ロード番号) = 1

0.目標 → 経験値 //$$ = $1

1.代入 → ident = Expr; //$$ = $3 + コスト(ストア)
2.Expr → Expr + Term //$$ =$1 +コスト(追加) + $3

3. | Expr - 期間 //$$ =$1 +cost(sub) + $3

4. | 用語 //$$ = $1

5.期間 → 期間 * 係数 //$$ = $1 +cost(mult) + $3

6. | 項 / 係数 //$$ = $1 + コスト (div) + $3

7. | 因数 //$$ = $1

8.Factor → ident //$$ =cost(loadident)

9. | num //$$ = コスト(loadnum)

10. | ( Expr ) //$$ = $2

 ident のコストは 4 であり、Factor への置換には再びコストがかからないことがわかります。これらはリンクされているだけであり、最終的に Term に渡されるのも 4 です。同様に、num はコスト 1 で Factor に渡されます。 Term は $1 、mult は $2 、Factor は $3 として使用され、
コストは 4、3、1 で合計 8 になります。それを上の $$ に渡します。
他の分岐も同様です。 

 

 

おすすめ

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