Ich habe eine sehr einfache Grammatik geschaffen, das Problem zu zeigen, die ich gestoßen:antlr4 - Parser nicht richtig funktioniert, wenn Token mit
grammar Expr;
test: funcDecl;
//-----------------------------------------------------------------------
funcDecl: funcHead ';';
funcHead: type '*'? IDENTIFIER '(' formParList? ')';
formParList: ('void' |
type '*'? IDENTIFIER ('[' ']')?
(',' type '*'? IDENTIFIER ('[' ']')?)*
);
type: 'void' | 'bool' | 'int';
// ----------------------------------------------------------------------
Whitespace: [ \t]+ -> skip;
LineComment: '//' ~[\r\n]* -> skip;
NEWLINE : ('\r' '\n'? | '\n') -> skip;
IDENTIFIER: CHARACTER (CHARACTER | DIGIT)*;
fragment
CHARACTER: [a-zA-Z_];
fragment
DIGIT: [0-9];
Die Grammatik oben erzeugt folgenden AST mit diesem Beispielcode:
void Sieve(int n); // declaration
So sieht die Grammatik aus, nachdem die type
in ein Token geändert wurde (Änderung type
bis TYPE
):
...
funcHead: TYPE '*'? IDENTIFIER '(' formParList? ')';
...
TYPE: 'void' | 'bool' | 'int';
...
Nach so tun, ich die folgende Fehlermeldung erhalten:
line 1:0 mismatched input 'void' expecting TYPE
Warum ist das so? Sobald ich einen Token für den Typ verwende, löst der Parser diesen Fehler aus. Aber das Token IDENTIFIER
funktioniert unabhängig ...
Wie ich mich erinnere die längste erste übereinstimmende Regel gewinnt und 'void' wird von TYPE und IDENTIFIIER verglichen. Also ist die Definition von TYPE oben IDENTIFIER? – CoronA
Richtig, das tut der Parser, aber der 'TYPE' ist vor' IDENTIFIER' definiert. "TYPE" ist in Zeile 10 definiert, während "IDENTIFIER" in Zeile 18 definiert ist. (Im Grunde habe ich "type" in "TYPE" von meinem ursprünglichen Code-Snippet umbenannt) – Johannes
Haben Sie es unter IDENTIFIER versucht? – CoronA