parsing - 执行语义操作时 Ocamlyacc token 不可见

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

最佳答案

不可能猜测你这边出了什么问题,因为你没有透露足够的信息。我可以猜测,您以某种方式误读了错误消息,问题出在另一个文件中。例如,以下文件:

%{
 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 中,标记始终位于范围内,因此您在该文件中看不到此错误。通常,您可以在词法分析器中执行此操作。因此,请确保您的词法分析器的介绍部分已打开解析器

关于parsing - 执行语义操作时 Ocamlyacc token 不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31699101/

相关文章:

python - 将 .txt 文件处理成字典 (Python v2.7)

c# - 适用于任何文化的 DateTime.TryParse

c++ - 从文件获取数字输入的(非常)简单的 C++ 程序中的编译器问题

compiler-construction - 使用引用计数混合标记和扫描

Java asm编译器

ocaml - 使用 "ocamlfind"使 OCaml 编译器和顶层查找(项目特定)库

java - 如何从 Scala/Java 执行 OCaml 代码?

css - Lemon Parser Generator 的二义性语法

python - 在 python 中解析大型二进制文件的最快方法

module - 如何定义模块签名,其模块实现由仿函数参数化