1

私は OCaml でパーサーを書いています。私はすでにパーサーを書きました。今、トークンを関連付けて AST を構築しようとしています。パーサーのサンプルを次に示します。

パーサー:

expr: 
  | THE boiluser HAS l_ent {structural($2,$4)}
;
boiluser:
  | USER boiluser USER {}
;

l_ent: 
  boiluser {[$1]}
  | l_ent boiluser{ [$2::$1] }   ;

$2AST で、 と をリンクしたい$4。ハッシュテーブルの使用を考えていますが、その方法がわかりません。を「呼び出す」とき$1、それを とリンクする方法をどのように知ることができ$4ますか?

4

2 に答える 2

2

あなたの質問は不明確です: 私は英語を理解するのに苦労しています.

一般的なアドバイスは、解析段階で分析/処理を行わないことです。入力を解析し、それを忠実に表す AST を返します (モジュロの曖昧さの解消と些細な具体的な構文の詳細)。返された AST に対して実行される関数として、追加の処理 (いくつかの識別子といくつかのデータの間の関連付けテーブルの構築など) を実装できます。それははるかにクリーンで、はるかに簡単です。

古いプログラム ocamlyacc を使用しているようです。より使いやすく、より優れた文法記述 (たとえば、変数名の代わりに) を生成するパーサー ジェネレーターであるMenhirについて知っていました$1 $2 $3か? 機会があれば、切り替えを検討する必要があります。また、学生の場合は、教師に報告することを検討してください。そうすれば、コースでメンヒルを使用して、すべての人の生活を向上させることができます。

于 2012-05-04T11:19:24.883 に答える
1

「アンカーを作成する」という意味がわからないので、コードに基づいて推測します。

ルールのタイプ右側のタイプであるため、あなたの場合、boiluserのタイプはunitです(その値についても同様です)。

boiluser:
  | USER boiluser USER {}

したがって、別のルールで使用する場合:

expr: 
  | THE boiluser HAS l_ent {structural($2,$4)}

$2の値は常にunitです! ルールexprの型は、関数structureの型であり、 $2および$4の具体的な値に対して structure が返す値です

于 2012-05-04T05:50:43.690 に答える