我使用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.