2017-06-01 8 views
0

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.

Antwort

0

Ihr Beispiel lexes nur gut für mich. Hier ist die TestRig Ausgang mit -tokens eingeschaltet:

C:\prj\ANTLR_SO_BENCH\Bench>java org.antlr.v4.gui.TestRig Grammar1 program -tokens SOURCE.txt 
[@0,0:0='3',<INTNUM>,1:0] 
[@1,1:1='+',<'+'>,1:1] 
[@2,2:2='2',<INTNUM>,1:2] 
[@3,5:4='<EOF>',<EOF>,2:0] 

Und REALNUM Token zu arbeiten:

C:\prj\ANTLR_SO_BENCH\Bench>java org.antlr.v4.gui.TestRig Grammar1 program -tokens SOURCE.txt 
[@0,0:3='3.14',<REALNUM>,1:0] 
[@1,5:5='*',<'*'>,1:5] 
[@2,7:9='2.1',<REALNUM>,1:7] 
[@3,12:11='<EOF>',<EOF>,2:0] 

So sicher bin ich nicht mehr, was auf Ihre Frage basiert empfehlen.

Verwandte Themen