2

我无法让我的 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 的情况下,我查看了sym.javaCup 生成的类,我发现:

  public static final int EOF = 0;

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

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

4

3 回答 3

2

好的,所以我没有显式地解析 EOF 令牌来执行一些代码,而是在我的语法中添加了以下“包装器”,这让我可以做我想做的事。

代替:

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

我现在有:

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

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

于 2014-04-01T18:06:41.990 回答
0
program                 ::=   program declaration EOF
                          | /* Empty */
                          ;

在此生产中您不需要 EOF。这是隐含的。

于 2014-03-31T23:58:07.617 回答
0

确保你没有忘记一个“;” 在与您的“file.cup”相对应的任何语法作品中。

于 2017-06-08T18:57:21.060 回答