2

実際にバイナリ ファイルを処理する C++ のアプリがあります。バイナリ ファイルは、A/B/C などのイベントのコレクションであり、ファイルでイベント A を検出すると、アプリは「ハンドラー A」でイベントを処理します。

ここで、カスタム言語で別のスクリプトを作成する必要があります。このスクリプトは、バイナリ ファイル処理と直交して実行されます。スクリプトには次のようなものがあります。

define proc onA
{
 c= QueryVariable(cat)
print ( c )
}

そのため、アプリがバイナリ ファイルからイベント "A" を処理するとき、アプリはこのスクリプト ファイルを解析し、OnA をチェックして、OnA proc のステートメントをアプリでサポートされているルーチンに変換する必要があります。たとえば、QueryVariable は、アプリで定義された変数「cat」の値を変数「C」にコピーする必要があります。アプリは、スクリプト内の言語の構文/セマンティクスもチェックする必要があります。デザインを決定するための最良の情報はどこで入手できますか? 構文木/文法に関する私の知識は本当に弱体化しています。

ありがとう

4

2 に答える 2

2

インタープリターを構築する簡単な方法:

  • 構文から言語のパーサーを定義する
  • 抽象構文木 AST を構築する
  • ビジター関数を適用すると、AST を事前順序でトラバースし、AST ノードによって提案されたアクションを「実行」します。

一部の AST ノードは「定義」されます。たとえば、上記の「define proc onA」句などの名前付きエンティティの存在を宣言します。通常、アクションは、名前付きエンティティをコンテンツに関連付けることです。たとえば、トリプレット <onA,proc,<body>> を形成し、これを最初のエントリによってインデックス付けされたシンボル テーブルに格納します。これにより、そのような定義を簡単に見つけることができます。

後でイベント プロセスが A イベントに遭遇すると、アプリケーションはこのシンボル テーブルで「onA」を検索することを認識します。見つかった場合、AST はビジター関数によって走査され、コンテンツが実行されます。通常、中間式の値を記録するには、値スタックが必要です。AST リーフはオペランド (変数、定数) を表し、そのスタックに値をプッシュし、演算子 (+、-、​​<=) は値をポップしてプッシュする新しい結果を計算します。代入操作は、トップ スタック値を取得し、識別子名に関連付けられたシンボル テーブルに配置します。制御演算子 (if、do) は、スタックの一番上から値を取得し、それらを使用して、プログラムのどの部分 (たとえば、どのサブツリー) を次に実行するかを導きます。

これらはすべてよく知られており、コンパイラーとインタープリターに関するほとんどの本に記載されています。これに関する Peter Brown の本は、比較的古いように見えますが、特に素晴らしいものです。

対話型インタープリターとコンパイラーの作成.

于 2010-11-02T01:19:40.707 に答える
1

スクリプト言語用のインタプリタまたはコンパイラが必要です。CまたはC++での埋め込みをサポートしているかどうかを確認してください。ほとんどのスクリプト言語はそうします。

次の選択、またはおそらく最初の選択は、既存のコンパイラ/インタプリタを使用して、スクリプトを外部で実行することです。

最初の2つのオプションのいずれかが機能しない理由は考えられませんが、そうでない場合は、ANTLRまたは小さな言語のBoostSpiritを使用してインタープリターを作成することを検討してください。免責事項:私は最初のものを使用していません、そして私は小さなおもちゃの例のためにブーストスピリットを試しただけです。

乾杯&hth。、

PS:スクリプト言語を選択できる場合は、JavaScriptを検討し、Googleの優れた埋め込みAPIを使用してください。

于 2010-10-28T16:13:37.070 に答える