2012-05-11 13 views
1

エラーを取得することは通常不快ですが、期待していないと取得できないこともあります。私のパーサーはこの文字列 "2)"のエラーを生成しません。私に解決策を教えてください?最後に解析されていないトークンはエラーを生成しません

grammar BasicArithmetic; 

options { 
    language = Java; 
    output = AST; 
} 

expression returns [double value]: 
p1=pm{$value=$pm.value;}; 

// never never reference FRAGMENTS from parsers 
pm returns [double value]: 
p1=dm{$value = $p1.value;} 
    (PLUS^p2=dm{$value += $p2.value;}| 
    MINUS^p2=dm{$value -= $p2.value;} 
    )*; 

dm returns [double value]: 
    p1=atom {$value = $p1.value;} 
    (DIV^ p2=atom {$value /= $p2.value;}| 
     MUL^ p2=atom {$value *= $p2.value;}| 
     POW^ p2=atom {$value = Math.pow($value, $p2.value);} 
    )*; 

atom returns [double value]: 
    p1=Number {$value = Double.parseDouble($p1.text);} 
    | LP p2=pm RP{$value = $p2.value;}; 

Number: Digit+; 
MUL : '*'; 
DIV : '/'; 
PLUS : '+'; 
MINUS : '-'; 
POW : '^'; 
LP : '('; 
RP : ')'; 
fragment Digit:'0'..'9'; 
WS :('\t'| ' '| '\r'| '\n'| '\u000C')+{$channel = HIDDEN;}; 

答えて

1

あなたはあなたのトップレベルのルールが終了した後EOFトークンを期待するように指定するには、あなたの文法を変更する必要があります。

expression returns [double value]: 
p1=pm EOF {$value=$pm.value;}; 
+0

はどうもありがとうございました。それは全く意味をなさない。私は終了規則が必要でした。 –

関連する問題