4

ocamlyaccほとんどの解析ルールでいくつかのセマンティック アクションも実行する小さなパーサーに使用しています。

最初に一連のトークンを定義しました。

%token T_plus
%token T_minus
%token <int> T_int_const

%left T_plus T_minus

セマンティック アクションを実行するパーサー ルールは次のとおりです。

exp:  exp T_plus exp
      {
          checkType T_plus $1 $3
      }

checkType外部ヘルパー関数です。ただし、この奇妙な警告が表示されます (Parser.mlyファイル内の行を参照しています) 。

 warning: T_plus was selected from type Parser.token. 
 It is not visible in the current scope, 
 and will not be selected if the type becomes unknown.

ocamlyacc マニュアルに関連情報が見つかりませんでした。誰かが同様のエラーに遭遇しましたか? セマンティック アクションのスコープ内でトークンが表示されないのはなぜですか?

4

1 に答える 1

2

十分な情報を開示していないため、何が問題なのかを推測することはできません。どういうわけかエラーメッセージを読み違えていて、問題は別のファイルにあると推測できます。たとえば、次のファイルです。

%{
 let f PLUS _ =  ()
%}

%token PLUS
%left PLUS

%start exp
%type <unit> exp

%%

exp : exp PLUS exp {f PLUS $1}

問題や警告をコンパイルします

ocamlbuild Parser.byte

Parser.ml生成されたものを見て、そこで何が起こっているのかを確認することしか提案できません。

一般に、このメッセージは、スコープに持ち込まれなかったコンストラクターを参照していることを意味します。InParser.mlyトークンは常にスコープ内にあるため、そのファイルでこのエラーを確認することはできません。通常、これはレクサーで行うことができます。したがってopen Parser、レクサーのイントロセクションにあることを確認してください。

于 2015-07-29T13:53:35.687 に答える