2017-09-25 14 views
1

이것은 내가 사용하고있는 코드이며 here (13 페이지의 복사)에서 숫자와 숫자가 포함 된 input.txt 파일의 추가 예제를 성공적으로 실행하고 구문 분석 할 수 있습니다. + sintactically 정확한 사인 즉 4 + 2 returns six하지만 4 ++ 2 gives an error)javaCC 파서 생성기가 EOF를 처리 할 수 ​​없다

options { 
    STATIC = false ; 
} 

PARSER_BEGIN (Calculator) 
    import java.io.PrintStream ; 

class Calculator 
{ 
    public static void main (String [] args) 
    throws ParseException, TokenMgrError, NumberFormatException 
    { 
     Calculator parser = new Calculator(System.in) ; 
     parser.Start(System.out) ; 
    } 
    double previousValue = 0.0 ; 
} 
PARSER_END (Calculator) 

SKIP : { " " } 
TOKEN : { < EOL : "\n" | "\r" | "\r\n" > } 
TOKEN : { < PLUS : "+" > } 
TOKEN : { < NUMBER : <DIGITS> | <DIGITS> "." <DIGITS> | <DIGITS> "." | "." <DIGITS> > } 
TOKEN : { <#DIGITS : (["0"-"9"])+ > } 

void Start(PrintStream printStream) throws NumberFormatException : 
{} 
{ 
    (
     previousValue = Expression() 
     <EOL> 
     {printStream.println(previousValue) ; } 
    )* 
    <EOF> 
} 

double Expression() throws NumberFormatException : 
{ 
    double i ; 
    double value ; 
} 
{ 
    value = Primary() 
    (
     <PLUS> 
     i = Primary() 
     { value += i ; } 
    )* 
    { return value ; } 
} 

double Primary() throws NumberFormatException : 
{ 
    Token t ; 
} 
{ 
    t = <NUMBER> 
    { return Double.parseDouble(t.image) ; } 
} 

'

C:\Users\Jay\workspace\javaCC>javacc calculator0.jj 

가 제대로 필요한 모든 자바 파일, 내가

01,235,164와 오류없이 나 경고와 함께 컴파일 모든를 생성
javac *.java 

하지만, input.txt를이 새로운 버전의 몇 가지 이유로

4 + 2 + 2

을 포함 어디

java Calculator < input.txt 

를 실행하려고하면 나는

Exception in thread "main" ParseException: Encountered "<EOF>" at line 1, column 11. 
Was expecting one of: 
    <EOL> ... 
    "+" ... 

     at Calculator.generateParseException(Calculator.java:218) 
     at Calculator.jj_consume_token(Calculator.java:156) 
     at Calculator.Start(Calculator.java:27) 
     at Calculator.main(Calculator.java:10) 

어떻게 해결할 수 있습니까?

+0

문법은 한 줄에 하나의 표현식을 필요로합니다. 그것은 의도적 인 디자인 결정이었습니다. 아마 튜토리얼은 그 결정을 더 잘 설명 할 수있었습니다. –

답변

1

해결책을 찾았습니다. 그 PDF에 약간의 버그가있어서 그것을 해결할 수있었습니다. 버그를 수정하기 위해 세 문자 만 추가해야했습니다.

대답은 변경하는 것입니다 :

void Start(PrintStream printStream) throws NumberFormatException : 
{} 
{ 
    (
     previousValue = Expression() 
     <EOL> 
     {printStream.println(previousValue) ; } 
    )* 
    <EOF> 
} 

void Start(PrintStream printStream) throws NumberFormatException : 
{} 
{ 
    (
     previousValue = Expression() 
     (<EOL>)* 
     {printStream.println(previousValue) ; } 
    )* 
    <EOF> 
} 

을 위해 그리고 그것이 마치 마법처럼 작동합니다.

+0

"bug"라는 단어는 약간 가혹한 것 같습니다. :-) –

+0

예. 유일한 문제는'표현식'이' '이 없으면 서로 따라갈 수 있다는 것입니다. 원래 버전에서는 허용되지 않았습니다. –