我正在使用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手册中没有找到任何相关信息。有人遇到过类似的错误吗?为什么令牌在语义操作的范围内不可见?
发布于 2015-07-29 21:53:36
由于您没有透露足够的信息,因此无法猜测您的问题出在哪里。我可以猜测,您不知何故误读了错误消息,问题出在另一个文件中。例如,以下文件:
%{
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中,标记始终在作用域中,因此您在该文件中看不到此错误。通常,您可以在您的lexer中执行此操作。因此,请确保在词法分析器的intro部分中有open Parser。
https://stackoverflow.com/questions/31699101
复制相似问题