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 回答