2

flexとbisonを使用して独自のスクリプト言語を作成しようとしています。基本的なパーサーがあり、C言語のforステートメントに非常によく似たforステートメントを追加したいと思います。forステートメントに関連付けられたアクションをコーディングする方法がわかりません

'for'ステートメントに対して次のプロダクションがあるとします。

forStatement: FOR '(' expr ';' expr ';' expr ')' statements END; {}

この作品に関連するアクションで何をすべきかは私にはわかりません。

直感的に、前のステートメントに関連付けられたアクションで、次のような何かを行う必要があることを理解しています。

evaluate($3);
while(evaluate($5)) { execute($9); evaluate($7); }
evaluate($7);

ここで、evaluateとexecuteは2つのC関数です。

だから私は2つの質問があります(文法の生成に関連するアクションのCコードを書くと仮定します):

  1. 「評価」のタスクは何ですか。つまり、式の値がループのすべてのステップで変化する可能性があることを考慮して、すべてのループで式を評価するにはどうすればよいですか?
  2. 「実行」のタスクは何ですか。つまり、各ステートメントがループのすべてのステップで異なる結果をもたらすことを考慮して、forループ内のステートメントをどのように評価しますか。

3つの式'expr'の値は実行時に変更され、forbody内のステートメントにも同じことが当てはまります。

4

2 に答える 2

2

2つの質問を見ると、実行エンジン(ソフトウェアCPUの一種)が必要であることがわかりません。このエンジンは、変数の状態を記憶し、ループの「アドレス」を返す必要があります...(選択した実装方法によって異なります)。

したがって、構文解析は最初のステップにすぎません。ステートメントと式ごとにデータ構造を作成することを検討し、これらをこのエンジンで実行します。

スタックベースのシステムを見てください。

于 2013-09-30T06:58:50.163 に答える
1

これは、SOだけでなく、Bisonに関するFAQです。ドキュメントをお読みください:http ://www.gnu.org/software/bison/manual/html_node/Implementing-Gotos_002fLoops.html

于 2013-03-25T06:13:11.600 に答える