2016-03-26 9 views
0

ich eine Grammatik erstellen möchten, die die Eingabeanweisungantlr4 does't offensichtlich Baum analysieren

myvar ist 43 + 23

und

othervar von myvar wird parsen ist "Hallo"

Aber der Parser erkennt hier nichts. (Entschuldigung, ich darf keine Bilder posten :(Stellen Sie sich einen Statement-Knoten mit den Token [myvar] [is] [43] [+] [23] als Kinder vor, alle rot markiert. Gleiches gilt für die andere Anweisung)

ich erhalte Fehlermeldungen, die mich verwirren:

Linie 2: 7 keine Alternative am Eingang 'myvaris'

Linie 3.19 keine brauchbare Alternative am Eingang 'otherVarofmyvaris'

W Hier sind die Räume weg? Ich nehme an, es ist etwas mit meinem Lexer, aber ich kann nicht sehen, was das Problem ist. Für den Fall, hier ist die Grammatik für diese Aussagen:

statement 
     : envCall     #call_Environment_Function 
     | identifier IS expression # assignment_statement // This one should be used 
     | loopHeader statement_block # loop_statement 
     etc... 

expression 
    : '(' expression ')'    #bracket_Expression 
    | mathExpression     #math_Expression 
    | identifier      #identifier_Expression // this one should be used 
    | objectExpression     #object_Expression 
    etc ... 

identifier //both of these should be used 
: selector=IDENTIFIER OF object=expression #ofIdentifier 
| selector=IDENTIFIER #idLocal 
; 

hier sind alle Lexer Regeln, die ich bisher habe:

IdentifierNamespace: IDENTIFIER '.' IDENTIFIER; 
FromIn: FROM | IN; 

OPENBLOCK: NEWLINE? '{'; 
CLOSEBLOCK: '}' NEWLINE; 

NEWLINE: ['\n''\t']+; 
NUMBER: INT | FLOAT; 
INT: [0-9]+; 
FLOAT: [0-9]* '.' [0-9]+; 

IsAre: IS | ARE; 

OF: 'of'; 
IS: 'is'; 
ARE: 'are'; 
DO: 'do'; 
FROM: 'from'; 
IN: 'in'; 
IDENTIFIER : [a-zA-Z]+ ; 
//WHITESPACE: [ \t]+ -> skip; 
fragment UNICODE : 'u' HEX HEX HEX HEX ; 
fragment HEX : [0-9a-fA-F] ; 
fragment ESC : '\\' (["\\/bfnrt] | UNICODE) ; 
STRING : '"' (ESC | ~["\\])* '"' ; 
END: 'END'[.]* EOF; 
WHITESPACE : ('\t' | ' ')+ -> skip ; 

Antwort

1

Ok, es gefunden. Für den Parser wurde ein CompOP definiert, der die Baumgeneration durcheinander brachte.

compOP: '<' 
    | '>' 
    | '=' // the programmers '==' 
    | '>=' 
    | '<=' 
    | '<>' 
    | '!=' 
    | 'in' 
    | 'not' 'in' 
    | 'is' <- removed this one and it works now 
    ; 

Also: nie das gleiche Schlüsselwort zu Parser und Lexer zuweisen, denke ich.