2017-01-10 8 views
-1

yacc/bisonファイルの中のルールセクションの中括弧に使用される言語と、それに関する良い参考文献があるかどうかは分かります。bison/yaccファイルで使用される言語

stmts : stmt { $$ = new NBlock(); $$->statements.push_back($<stmt>1); } 
    | stmts stmt { $1->statements.push_back($<stmt>2); } 
    ; 

、それが$<stmt>$2だけでなく$2

答えて

1

を書かれている理由は、上記のコードでは、例えば、それは実際にカスタムマクロプリプロセッサとCコードです。

yacc/bisonは、$$のすべての出現を、ルールの対象コンポーネントの意味値を参照するCコードと置き換え、$ nをルール要素#nの意味値で置き換えます。

コードは実際にはC(拡張子はC++)で、$$と$ nはbison自体に置き換えられ、Cコードはルールのターゲットまたはルール要素の意味値を参照します。

See this chapter of bison's documentation詳細については、

+0

私はリファレンスを読むでしょう。第2部にお答えください。私は{$ 1-> statements.push_back($ 2)の間に何の違いも見ませんでした。 }と{$ 1-> statements.push_back($ 2); }。私が見た多くのコードでは、それらは異なった使い方をしています。 –

+1

これは、私が提供したリンクのBisonのドキュメントで完全に説明されています。他のWebサイトの内容をコピーしてstackoverflow.comにコピーしても、何も役立たない。 –

+0

"カスタムマクロプロセッサ"がプロセスの最良の記述であるかどうかはわかりません。 Bisonは 'm4'をマクロプロセッサーとして使用します(あるいはテンプレート言語を言う方がよいでしょう)。 'm4'は多かれ少なかれ標準的なマクロ言語です。 '$'と '@ 'トークンを適切なマクロに置き換えることは、コードの字句スキャン中に行われます。' scan-code.l'の関数 'handle_action_dollar'を参照してください。私はあなたがそれをマクロ置換と呼ぶことができると思いますが、それは私にはより透明なようです。とにかく、upvoted。 – rici

関連する問題