BLOCK_COMMENT : '/*' .*? '*/' -> skip;
EOL_COMMENT : '//' ~[\r\n]* -> skip;
WS: [ \n\t\r]+ -> skip;
program: usingDirectives? EOF;
usingDirectives: usingDirective+;
usingDirective: USING
fullyQualifiedType
(usingAlias | USING_ALL)?
END;
USING: 'using';
fullyQualifiedType: identifier (DOT identifier)*;
identifier: (LETTER | UNDERSCORE)
(LETTER | DIGIT | UNDERSCORE)*;
DOT: '.';
usingAlias: AS identifier;
USING_ALL: '.*';
AS: 'as';
END: ';';
LETTER: [a-zA-Z];
DIGIT: [0-9];
UNDERSCORE: '_';
Das ist meine Grammatik.Antlr4 - eine Kennung als ein einzelnes Token
using IO.Console.Print as Print;
using IO.Console; // same as using IO.Console as Console;
using IO.Console.*;
Dies sind meine Testdaten.
Die Grammatik funktioniert wie vorgesehen, aber jeder Buchstabe in einem Bezeichner wird zu einem einzelnen Token, was ein wenig nutzlos ist.
Wenn ich versuche, eine Kennung Lexer Regel (IDENTIFIER) zu machen, dann bekomme ich den folgenden Fehler, wenn die Durchführung des Tests:
line 1:23 extraneous input 'as' expecting {'.', '.*', 'as', ';'}
Auch wenn ich versuche nur haben IDENTIFIER sein [a-Za Z], ohne Unterregeln, das gleiche passiert.
Wenn es wichtig ist, verwende ich Python3 als Zielsprache. Bitte weisen Sie auch auf andere Anfängerfehler hin, da dies mein erstes Projekt ist, das Antlr verwendet. Vielen Dank!
Danke. Ich nahm deinen Rat und vereinfachte die Grammatik. Außerdem stellt sich heraus, dass mein grundlegendes Verständnis dafür, wie Antlr funktioniert, fehlte. Sobald ich herausgefunden hatte, dass die Reihenfolge der Regeln wichtig war und dass die Lexer-Regeln alle vor den Parser-Regeln ausgewertet wurden, begann alles sehr sinnvoll. – MackThax
froh, dass es geholfen hat, Ihr Problem zu lösen, sind Sie willkommen. – Yevgeniy