Ich bin auf meinen ersten Schritten mit ANTLR 4 mit IntelliJ. Ich versuche, einen einfachen rekursiven Kletterparser für mathematische Ausdrücke zu erstellen. Ich erhalte einen FehlerANTLR 4 nicht übereinstimmende Eingabe beim Parsen
line 1:0 mismatched input '3' expecting {VARIABLE; REALNUM, INTNUM}
Es scheint, wie die Lexer nicht richtig die 3 in die Token aktivieren, verwendet der Parser, aber ich kann das Problem dort nicht finden.
Lexer:
lexer grammar testLexer;
PLUS: '+';
MINUS: '-';
TIMES: '*';
DIV: '/';
SIN: 'sin'|'Sin'|'SIN';
COS: 'cos'|'Cos'|'COS';
TAN: 'tan'|'Tan'|'TAN';
LN: 'ln'|'LN'|'Ln';
LOG: 'Log'|'log'|'LOG';
SQRT: 'sqrt'|'Sqrt'|'SQRT';
LBRACE: '(';
RBRACE: ')';
POW: '^';
SPACE: ' ' -> skip;
EQUAL: '=';
VARIABLE: [a-zA-Z][a-zA-Z0-9]*;
INTNUM: [0-9]+;
REALNUM: [0-9]+[,|.][0-9]+;
WS: [\r\t\n]+ -> skip;
SEMICOLON: ';';
Parser:
Parser
grammar testParser;
expression returns [double value]
: exp=additiveExpression {$value = $exp.value;};
equalityExpression returns [double value]
: m1 = additiveExpression (EQUAL additiveExpression)* {$value = $m1.value;};
additiveExpression returns [double value]
: m2 = multiplikativeExpression {$value = $m2.value;}
(PLUS m1=multiplikativeExpression {$value += $m1.value;}
|MINUS m1=multiplikativeExpression {$value -= $m1.value;}
)* ;
multiplikativeExpression returns [double value]
: m3 = powExpression {$value = $m3.value;}
(TIMES powExpression {$value *= $m3.value;}
|DIV powExpression {$value /= $m3.value;}
)* ;
powExpression returns [double value]
: (bracedExpression)
(POW (m4=expression) {$value = Math.pow($value, $m4.value);}
)*;
bracedExpression returns [double value]
: (LBRACE m5 = expression RBRACE {$value = $m5.value;}
|LBRACE m6 = unaryExpression RBRACE {$value = $m6.value;}
| m7 =unaryExpression {$value = $m7.value;});
unaryExpression returns [double value]
: m7= atomExpression {$value = $m7.value;}
| (SIN m6=bracedExpression {$value = Math.sin($m6.value);}
|COS m6=bracedExpression {$value = Math.cos($m6.value);}
|TAN m6=bracedExpression {$value = Math.tan($m6.value);}
|LOG m6=bracedExpression {$value = Math.log($m6.value);}
|SQRT m6=bracedExpression {$value = Math.sqrt($m6.value);}
)
|EOF;
atomExpression returns [double value]
: VARIABLE {$value = 1;}
|m7 = REALNUM {$value = Double.parseDouble($m7.text);}
| m7 = INTNUM {$value = Integer.parseInt($m7.text);};
Der Eingang ist nur der einfache Ausdruck 3, aber der Fehler tritt auch auf längere Eingabezeichenfolgen wie 2 + 3.