在CUP中解析EOF令牌

时间:2014-03-31 21:43:27

标签: 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

Allrighty,所以我将以下内容添加到我的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令牌的主要原因是因为我想在最后打印出我的符号表以及其他用于调试目的的东西。

3 个答案:

答案 0 :(得分:1)

好的,所以我没有显式地解析EOF令牌来执行某些代码,而是在我的语法中添加了以下“包装器”,这使我能够完全按照自己的意愿去做。

而不是:

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

我现在有:

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

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

答案 1 :(得分:0)

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

您不需要在此作品中使用EOF。这是隐含的。

答案 2 :(得分:0)

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