私の質問は基本的に「何がYACC /バイソンに良いスタイルを構成している?」されます関連して、私がバイソンにそれが良いことをさせるかどうかを問わず。Bisonスタイル:自分のスタックが悪いですか?グローバルは悪いですか?
たとえば、私のBisonプログラムは、元のコードよりもグローバルに大きな影響を受けています。次のことを考えてみましょう:
prog :
vents{ /*handle semantics...*/ }
unity{ /*handle semantics...*/ }
defs;
私は「通気口」と「統一」後2中括弧で区切られたブロック間の情報を渡したい場合は、私はグローバル変数(技術的には、ファイルレベルの変数を使用していることを考えますスコープと内部リンケージ)は、私が情報隠蔽の観点からできることです。私がこれらのブロック内で宣言した変数は、そのブロックのローカルなものです(私は思っています...)。そして、C++宣言を置くことができる他の指定された場所はファイルレベルのスコープになります。
"yyparse()"関数に変数宣言を挿入することができれば、これは私のニーズに適しています。このようなコードや、そのような変数を注入するためのフックがありますか?または、グローバルはBisonを使用するには受け入れられる部分ですか?
このように、これらのセクション間で情報を渡したいとは思わないかもしれません。しかし、ちょうど$$、$ 1、$ 2などを使って周りをすべて渡すことは、私にとっては難しいようです。私はちょうどそれを "持っていない"ですか?
残りの部分を受け入れる場合でも、私のグローバル変数の1つが特に疑わしいと感じます。これはstd :: stack型であり、入力言語の条件文のサポートに関連しています。
コンパイラの入力に条件( "if/else")が発生すると、結果としてシーケンスからプルされた数字が続くテキスト文字列で構成される3つのアセンブリ言語ラベルが出力されます。
私は最初に "if"に出会ったときにシーケンス番号を取得しています(if構造体がネストされているのでスタックにプッシュしてから、後で "peeks"や "pops" ")、必要なラベルやジャンプを作成します。例えば、私の状態の後、私の" if "ブロック、そして" else "ブロックです。
代わりに$ -2のようなものを使ってこの作業をしようとしましたが、この識別子は私の条件の始めではなく、ちょうどコンパイルされたブロックの終わりに関係していました。 $で抽象化されたシステムは、コードが左から右に読み込まれているように見えますが、その中の構造がどのようにネストされているかについての概念はありません。
私はあなたのすべてが私のためにこの仕事をすることを期待していませんが、私は$$、$ 1、$ -1などを使用しようとすると、少なくとも正しい道のりでしたか?それは私があまりにもすぐにあきらめ、および/または私はすなわち完全に私の古いアドホックコードを投げから、きれいなシートアプローチを取ってから利益を得るであろうことはかなり可能です。
その場合ですか?または、スタックとそのグローバルで正常にスタックされたアプローチですか?
ありがとうございます。あなたの記事を読んで、私は自分のプログラムを改善する方法を間違いなく見ている。要約すると、それは – user1172763
のように見えます。あなたの文法のその他の要素を表すクラスのライブラリを持っているのは、あなたが望むだけ多くのことをすることができるからです。それらを型チェックしたり、ツリーを剪定したり、構造を最適化したり、ASMコードを再帰的に訪問するだけで生成することができます。 – Jack