2014-03-31 106 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」相對應的語法制作中。