2012-05-04 7 views
1

私はOCamlにパーサーを書いています。私はすでにパーサーを書いています。今私はASTを構築するためにトークンを関連させようとしています。ここでは、パーサからのサンプルです:ASTのyacc ocamlでアンカーを作成するには

PARSER:ASTで

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

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

、私は$2$4をリンクしたいです。私はハッシュテーブルを使用することを考えているが、私はそれを行う方法を知らない。 $1と「電話」すると、$4とリンクするにはどうすればよいですか?

答えて

1

私はあなたが「アンカーを作成する」ことで何を意味するのか見当がつかないので、私はあなたのコードに基づいて推測します

ルールのタイプはその右側のタイプなので、そう

boiluser: 
    | USER boiluser USER {} 

別のルールでのご使用、それを::

あなたのケースで boiluserのタイプは ユニット(同じ価値のために行く)です3210
expr: 
    | THE boiluser HAS l_ent {structural($2,$4)} 

$ 2の値は常に単位です!ルールのタイプexprのは、構造機能の種類、構造$ 2$ 4の具体的な値のために返されますどのような値になります。

2

あなたの質問は不明です:私は英語を理解するのに苦労しており、あなたが求めていることを理解することはさらに困難な時間(解読された後)です。

一般的なアドバイスは、構文解析フェーズで分析/処理を行うことではなく、入力を解析し、それを忠実に表すASTを返します(モジュロ曖昧さや具体的な構文の詳細)。返されたASTで実行される関数として、(識別子とデータの間に関連テーブルを作成するなどの)後続の処理を実装することができます。それははるかにクリーンで、はるかに簡単です。

古いプログラムocamlyaccを使用しています。あなたはMenhirについて知っていましたか?使いやすく、より良い文法の説明を得られるパーサジェネレータです(たとえば、$1 $2 $3の代わりに変数名を使用)。チャンスがある場合は、切り替えを検討する必要があります。学生の場合は教師に報告することを検討してください。そうすれば、彼はコースでメンシュールを使用してすべての人の生活を改善できます。

関連する問題