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

时间:2015-07-29 11:24:04

标签: parsing compiler-construction ocaml yacc 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手册中找到任何相关信息。有没有人遇到过类似的错误?为什么令牌在语义操作的范围内不可见?

1 个答案:

答案 0 :(得分:2)

由于您没有披露足够的信息,因此无法猜出您身边出了什么问题。我猜,你以某种方式误读了错误信息,问题出在另一个文件中。例如,以下文件:

Grid

使用

编译任何问题或警告
%{
 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