2017-09-25 9 views
1

これは私が使ってきたコードですhere(13頁以降)から、数字と数字を含むinput.txtファイルから追加の例を実行して解析することができました。 +印sintactically正しいすなわち4 + 2 returns sixが、4 ++ 2 gives an errorjavaCCパーサジェネレータは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 

は、正しく私は

とエラーや警告なしでコンパイルするすべてのそれらを必要なすべてのJavaファイルを生成しますその後、
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行に1つの式が必要です。それは意図的な設計決定でした。多分、このチュートリアルではその決定をより良く説明できたでしょう。 –

答えて

1

解決策が見つかりました。それはそのPDF上の小さなバグであり、私はそれを解決することができました。そのバグを修正するために3文字だけ追加する必要がありました。

答えは変更することです:

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

「バグ」という言葉は少し厳しいようです。 :-) –

+0

はい。その唯一の問題は、 'Expression'sが' 'を使わずに互いに続くことができることです。元のバージョンでは許可されていませんでした。 –

関連する問題