解析 – 执行语义操作时,Ocamlyacc令牌不可见

我使用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手册中找到任何相关信息.有没有人遇到过类似的错误?为什么令牌在语义操作的范围内不可见?

最佳答案 因为你没有透露足够的信息,所以无法猜出你身边出了什么问题.我猜,你以某种方式误读了错误信息,问题出在另一个文件中.例如,以下文件:

%{
 let f PLUS _ =  ()
%}

%token PLUS
%left PLUS

%start exp
%type <unit> exp

%%

exp : exp PLUS exp {f PLUS $1}

编译任何问题或警告

ocamlbuild Parser.byte

我只能建议,看看生成的Parser.ml,看看那里发生了什么.

通常,此消息表示您指的是未引入范围的构造函数.在Parser.mly中,令牌始终在范围内,因此您无法在该文件中看到此错误.通常,您可以在词法分析器中执行此操作.因此,请确保您在词法分析器的介绍部分中打开了Parser.

点赞