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;};
4

1 に答える 1

1

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

expression returns [double value]: 
p1=pm EOF {$value=$pm.value;};
于 2012-05-11T09:41:54.443 に答える