0

私が次のような私の.y文法の一部を持っているとしましょう:

stmt : expr { $$ = $1; }
      | stmt expr { $$ = insert_stmt_list($1, $2); }

ここで、式を与えるステートメントを使用することも、ステートメントリストを作成する複数の式を使用することもできます。後者については、insert_stmt ...関数を使用して保存しますが、最初はスタックの一番上に送信します。

私の質問は、$$ = $1をどのように処理するかです。つまり、insert_stmt_listはすべてを構造体に配置し、そこにあることを知っていて、それらの値などを出力できますが、$$ = S1はどこに行くのでしょうか?読み方は?:-)

ありがとうございました!

4

2 に答える 2

1

Re:読み方は?

最初に . を認識しなければならない左再帰文法がありexprます。これは に縮小されstmt、 によって生成される意味値は によって の意味値になりmake_new_stmt_listます。stmt1$$ = $1;

これは、「右側から最初のシンボルのセマンティック値 (たまたま唯一のシンボル) を取得し、それを左側のセマンティック値として伝播する」ことを意味します。

次に、別のプロダクションが見つかった場合expr、解析は別のプロダクションで続行されます。

stmt : ...
     | stmt expr { $$ = insert_stmt_list($1, $2); }

ここで、右側の$1から来る は、を生成した以前の還元で割り当てられた意味値です。stmt$$stmt

exprがとして機能するようにシステムを設計しましたstmt。さらに、 anexprは、 の引数として適切な値を生成しますinsert_stmt_list: 式はリストです。

そう:

  1. 入力に式 E が 1 つしかない場合、stmt出現するのはその式だけです。

  2. E1 と E2 の 2 つの式がある場合、stmtwhich emeges は次の結果になります。

    insert_stmt_list(E1, E2)
    
  3. 3 つの式がある場合、全体stmtはこれらの呼び出しの結果です。

    insert_stmt_list(insert_stmt_list(E1, E2), E3)
    

等々。それが意味を成すかどうかは、この「挿入」操作のセマンティクスに依存します。

于 2012-04-23T22:58:32.533 に答える
0

次のように書く方が慣用的です。

stmt : expr { $$ = make_new_stmt_list($1); }
      | stmt expr { $$ = insert_stmt_list($1, $2); }

いずれにせよ、式のデータ構造をステートメントリストのデータ構造でラップする必要があります。

于 2012-04-23T19:26:13.233 に答える