2014-03-31 69 views
0

我无法让我的杯子解析器解析EOF标记。我在我的JFLEX代码使用%cup标志意味着文档中读到,有目前这样的:解析EOF令牌CUP

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

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

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

我收到EOF未由CUP声明的错误消息。

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,和我在sym.java类,杯生成一看我就发现:

public static final int EOF = 0; 

所以我很失去了对如何解决这一问题。双方的文件在这个问题上确实含糊不清。

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

回答

1

好了,所以,而不是明确地解析EOF标记来执行一些代码,我增加了以下“包装”我的语法,这让我怎么做我想做的事。

相反的:

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

我现在有:

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

这让我在每一个成功的解析结束执行代码。

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

在这个生产中你不需要EOF。这是隐含的。

+0

所以,你对我怎么能插入我的EOF被解析之后执行代码块的想法?我想打印出我的符号表格,并用于调试目的。 –

0

确保您didn't忘了 “;”在任何与你的“file.cup”相对应的语法制作中。