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 ;