jflex - 解析 CUP 中的 EOF token

标签 jflex cup

我在使 CUP 解析器解析 EOF 标记时遇到问题。我在文档中读到,在 Jflex 代码中使用 %cup 标志意味着存在如下内容:

%eofval{
  return new java_cup.runtime.Symbol(<CUPSYM>.EOF);
%eofval}
%eofclose

这一切都很好,但是当我在语法(CUP 文件)中尝试以下第一条规则时:

program                 ::=   program declaration EOF
                          | /* Empty */
                          ;

我收到错误消息,指出 CUP 未声明 EOF。

Error : java_cup.runtime.Symbol "EOF" has not been declared

好吧,所以我将以下内容添加到我的 CUP 文件中:

terminal EOF;

不,因为 CUP 告诉我:

Fatal : JavaCUP Internal Error Detected: Duplicate terminal (EOF) created
enter code here

但是,在没有定义终端 EOF 的情况下,我查看了 Cup 生成的 sym.java 类,发现:

  public static final int EOF = 0;

所以我非常不知道如何解决这个问题。两者的文档在这个问题上都非常模糊。

编辑: 我想解析 EOF token 的主要原因是因为我想最后打印出我的符号表和其他内容以用于调试目的。

最佳答案

好吧,所以我没有显式解析 EOF 标记来执行一些代码,而是将以下“包装器”添加到我的语法中,这使我能够准确地执行我想做的事情。

而不是:

program                 ::=   program declaration
                          | /* Empty */
                          ;

我现在有:

initial                 ::=   program   {: /* Code for EOF here */ :}
                          ;
program                 ::=   program declaration EOF
                          | /* Empty */
                          ;

这允许我在每次成功解析结束时执行代码。

关于jflex - 解析 CUP 中的 EOF token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22772799/

相关文章:

parsing - 正确设置 Cup/JLex 解析

java - 无法在 Windows 8.1 中运行 jflex.bat

java - 从 GNUMake 迁移到 Maven

java - 区分 "Class brackets"和 "Method bracket"的 JFlex Lexer

compiler-construction - yy 在扫描器/词法分析器(例如 jflex)中的意义

java - 移动/减少 java 杯中的冲突 - 其他问题悬而未决

正则表达式匹配除三个连续双引号之外的所有内容

java - BYACCJ : How do I include line number in my error message?

parsing - 移动/减少杯子误差