Warum tritt 'keine brauchbare alternative am Eingang'?
Schrieb ich die folgenden kombinierten Grammatik:
grammar KeywordGrammar;
options{
TokenLabelType = MyToken;
}
//start rule
start: sequence+ EOF;
sequence: keyword filter?;
filter: simpleFilter | logicalFilter | rangeFilter;
logicalFilter: andFilter | orFilter | notFilter;
simpleFilter: lessFilter | greatFilter | equalFilter | containsFilter;
andFilter: simpleFilter AND? simpleFilter;
orFilter: simpleFilter OR simpleFilter;
lessFilter: LESS (DIGIT | FLOAT|DATE);
notFilter: NOT IN? (STRING|ID);
greatFilter: GREATER (DIGIT|FLOAT|DATE);
equalFilter: EQUAL (DIGIT|FLOAT|DATE);
containsFilter: EQUAL (STRING|ID);
rangeFilter: RANGE? DATE DATE? | RANGE? FLOAT FLOAT?;
keyword: ID | STRING;
DATE: DIGIT DIGIT? SEPARATOR MONTH SEPARATOR DIGIT DIGIT (DIGIT DIGIT)?;
MONTH: JAN
| FEV
| MAR
| APR
| MAY
| JUN
| JUL
| AUG
| SEP
| OCT
| NOV
| DEC
;
JAN : 'janeiro'|'jan'|'01'|'1';
FEV : 'fevereiro'|'fev'|'02'|'2';
MAR : 'março'|'mar'|'03'|'3';
APR : 'abril' |'abril'|'04'|'4';
MAY : 'maio'| 'mai'| '05'|'5';
JUN : 'junho'|'jun'|'06'|'6';
JUL : 'julho'|'jul'|'07'|'7';
AUG : 'agosto'|'ago'|'08'|'8';
SEP : 'setembro'|'set'|'09'|'9';
OCT : 'outubro'|'out'|'10';
NOV : 'novembro'|'nov'|'11';
DEC : 'dezembro'|'dez'|'12';
SEPARATOR: '/'|'-';
AND: ('e'|'E');
OR: ('O'|'o')('U'|'u');
NOT: ('N'|'n')('Ã'|'ã')('O'|'o');
IN: ('E'|'e')('M'|'m');
GREATER: '>' | ('m'|'M')('a'|'A')('i'|'I')('o'|'O')('r'|'R') ;
LESS: '<' | ('m'|'M')('e'|'E')('n'|'N')('o'|'O')('r'|'R');
EQUAL: '=' | ('i'|'I')('g'|'G')('u'|'U')('a'|'A')('l'|'L');
RANGE: ('e'|'E')('n'|'N')('t'|'T')('r'|'R')('e'|'E');
FLOAT: DIGIT+ | DIGIT+ POINT DIGIT+;
ID: (LETTER|DIGIT+ SYMBOL) (LETTER|SYMBOL|DIGIT)*;
STRING: '"' ( ESC_SEQ | ~('\\'|'"') )* '"';
DIGIT: [0-9];
WS: (' '
| '\t'
| '\r'
| '\n') -> skip
;
POINT: '.' | ',';
fragment
LETTER: 'A'..'Z'
| 'a'..'z'
| '\u00C0'..'\u00D6'
| '\u00D8'..'\u00F6'
| '\u00F8'..'\u02FF'
| '\u0370'..'\u037D'
| '\u037F'..'\u1FFF'
| '\u200C'..'\u200D'
| '\u2070'..'\u218F'
| '\u2C00'..'\u2FEF'
| '\u3001'..'\uD7FF'
| '\uF900'..'\uFDCF'
| '\uFDF0'..'\uFFFD'
;
fragment
SYMBOL: '-' | '_';
fragment
HEX_DIGIT: ('0'..'9'|'a'..'f'|'A'..'F');
fragment
ESC_SEQ: '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
| UNICODE_ESC
| OCTAL_ESC
;
fragment
OCTAL_ESC: '\\' ('0'..'3') ('0'..'7') ('0'..'7')
| '\\' ('0'..'7') ('0'..'7')
| '\\' ('0'..'7')
;
fragment
UNICODE_ESC: '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT;
Aber ein keine brauchbare alternative am Eingang Fehler tritt nur versuchen analysiert der folgenden Sätze: Schlüsselwort OPERATOR ZIFFER; zum Beispiel:
- filter = 2
- filter < 2
- filter - > 2
Null als einen Wert, es funktioniert!!!
Wo ist der Fehler???
Dank, durch Ihre Hilfe,
Yenier
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie eine Menge von Unklarheiten in Ihrem lexer-Regeln. Was gibt es speziell in Ihrem Fall ist Ziffern
1-9
abgestimmt werden können, um sowohlDIGIT
undMONTH
,JAN
usw. Ziffer0
ist immun gegen dieses problem. Verwendengrun
mit-tokens
zu diagnostizieren Probleme in der Art auftreten:Wie Sie sehen können,
0
im ersten Fall hase token-Typ<23>
im zweiten Fall2
ist token-Typ<1>
. Schauen Sie auf Ihre generiertenKeywordGrammar.tokens
:So ist es nicht ein
DIGIT
oderFLOAT
- es istMONTH
. Als Ergebnis, Ihrefilter
Regel nicht überein. Und ja, die Reihenfolge der Regeln wichtig, denn im Zweifelsfall ANTLR nimmt die erste Regel.Entfernen Sie die Zweideutigkeit aus dem lexer. Machen Monate und ähnliche Token in der Grammatik Regeln. Und Sie haben viele andere Orte, wie Sie Ihre
FLOAT
machtDIGIT
unmöglich erscheinen eigenständige, noch beziehen Sie sich aufDIGIT
zusammen mit derFLOAT
in den Regeln. WennDIGIT
hat keine Bedeutung in der Grammatik-Niveau, machen es ein fragment, und verwenden Sie nurFLOAT
im parser-Regeln.Und machen Sie es sich zur Gewohnheit zu verwenden
grun
- und/oder ANTLR-plugins für die IDE, um sicherzustellen, dass Sie wissen, was Ihre lexers und Parser tatsächlich sehen.testen hier sah ich, dass das problem verschwindet, die Platzierung der SCHWIMMER definition token vor der DATUM-definition.
Ich weiß nicht, warum. Spielt die Reihenfolge eine Rolle?