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