Re:どのように読むのですか?
あなたは最初にexpr
を認識しなければならない左回帰文法を持っています。これはstmt
に縮小され、make_new_stmt_list
によって生成された意味値はstmt1
の意味値になります。これは$$ = $1;
です。
これは、「最初のシンボルの意味値を(唯一のものになります)右側の意味値とし、それを左側の意味値として伝播する」という意味です。
別expr
が見られる場合、解析は、他の生産を継続すると:
ここ
stmt : ...
| stmt expr { $$ = insert_stmt_list($1, $2); }
、$1
が右側にstmt
から来ることに$$
に割り当てられたセマンティック値であります前もっての削減はstmt
を生じた。
expr
がstmt
として機能するようにシステムを設計しました。さらに、expr
は、insert_stmt_list
のいずれかの引数として適切な値を生成します。式はリストです。
ので:
あなたの入力だけで一つの発現Eを持っている場合には、出てくるstmt
だけでは表現です。
次の2つの式E1およびE2を持っている場合は、emeges stmt
が結果です:あなたは3つの式を持っている場合は、全体的なstmt
は、これらの呼び出しの結果である
insert_stmt_list(E1, E2)
:
insert_stmt_list(insert_stmt_list(E1, E2), E3)
などとなる。それが意味をなさないかどうかは、この「挿入」操作のセマンティクスによって決まります。
出典
2012-04-23 22:58:32
Kaz
大きな疑問は、実際に私が声明を期待していた場合、代わりに表現をどう扱うかでしたか?私はこれに対処することができました汎用構造体を使用して、どこにフラグ{is_STATEMENT、is_EXPRESSION、...}とそれぞれの構造体へのポインタがあります。これはCがポインタの型を知ることを許さないためです。 – Nitrate
Lisp抽象構文を見ることができます。評価の基本的な統語単位は式です。単一の式が期待されるところで複数の式の副作用が評価されるようにするには、 'progn'のような演算子を使います:'(progn expr1 expr2 ... exprn) '。これは不必要なノードではありません。 – Kaz