首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ocamlyacc标记在执行语义操作时不可见

Ocamlyacc标记在执行语义操作时不可见
EN

Stack Overflow用户
提问于 2015-07-29 19:24:04
回答 1查看 120关注 0票数 4

我正在使用ocamlyacc作为一个小型解析器,它还可以对大多数解析规则执行一些语义操作。

我在开始时定义了一组令牌:

代码语言:javascript
复制
%token T_plus
%token T_minus
%token <int> T_int_const

%left T_plus T_minus

执行语义操作的解析器规则如下:

代码语言:javascript
复制
exp:  exp T_plus exp
      {
          checkType T_plus $1 $3
      }

其中checkType是外部帮助器函数。但是,我收到了这个奇怪的警告(它引用了我的Parser.mly文件中的一行)

代码语言:javascript
复制
 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手册中没有找到任何相关信息。有人遇到过类似的错误吗?为什么令牌在语义操作的范围内不可见?

EN

回答 1

Stack Overflow用户

发布于 2015-07-29 21:53:36

由于您没有透露足够的信息,因此无法猜测您的问题出在哪里。我可以猜测,您不知何故误读了错误消息,问题出在另一个文件中。例如,以下文件:

代码语言:javascript
复制
%{
 let f PLUS _ =  ()
%}

%token PLUS
%left PLUS

%start exp
%type <unit> exp

%%

exp : exp PLUS exp {f PLUS $1}

编译任何问题或警告。

代码语言:javascript
复制
ocamlbuild Parser.byte

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

一般来说,这条消息意味着你引用的是一个构造函数,它没有被带到作用域中。在Parser.mly中,标记始终在作用域中,因此您在该文件中看不到此错误。通常,您可以在您的lexer中执行此操作。因此,请确保在词法分析器的intro部分中有open Parser

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31699101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档