2014-03-31 10 views
0

내 CUP 파서가 EOF 토큰을 구문 분석하는 데 문제가 있습니다. 이 같은 존재하는 무언가가 나의 Jflex 코드에서 %cup 플래그를 사용하는 것은 의미 문서에 읽기 :CUP에서 EOF 토큰 구문 분석

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

이 모두가 좋은이 잘, 그러나 나는 (내 문법 CUP를 다음의 첫 번째 규칙을하려고 할 때 파일) :

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

EOF가 CUP에 의해 선언되지 않는다는 오류 메시지가 나타납니다. 터미널 EOF를 정의하지 않고,

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

그러나, 및 :

terminal EOF; 

아니오, 다음 CUP 저를 알려주기 때문에 :

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

Allrighty는, 그래서 내 CUP 파일에 다음을 추가 컵이 생성되는 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

';'을 잊지 않았는지 확인하십시오. "file.cup"에 해당하는 모든 문법 작품에서.