Приведенная ниже грамматика выдает ошибку для ввода «Адрес человека =% Джон%» (без кавычек). Он корректно обрабатывает токены, но затем возвращает, что ожидает идентификатор:
ID ("Person")ID ("Address")
EQ ("=")
STRING ("%John%")
line 1:21 mismatched input '<EOF>' expecting ID
Как ожидать идентификатора после разбора поискового запроса? Следует ожидать EOF. Я абсолютно новичок в ANTLR, так что я уверен, что это моя ошибка, но что я делаю не так?
Является ли причиной того, что NOT_SPECIAL + соответствует EOF? Я пытался поместить EOF в набор, но это не поддерживается.
[ Примечание: я также спрашивал об этом в antlr-обсуждение, но этот список кажется нерегулярным или очень низкий объем. ]
/* ANTLR Grammar for Minidb Query Language */
grammar Mdb;
start
: searchclause EOF
;
searchclause
: table expr
;
expr
: fieldsearch
| unop fieldsearch
| LPAREN expr relop expr RPAREN
;
unop
: NOT
;
relop
: AND
| OR
;
fieldsearch
: field EQ searchterm
;
field
: ID
;
table
: ID
;
searchterm
: ID
|STRING
;
AND
: 'and'
;
OR
: 'or'
;
NOT
: 'not'
;
EQ
: '='
;
LPAREN
: '('
;
RPAREN
: ')'
;
fragment VALID_ID_START
: ('a' .. 'z') | ('A' .. 'Z') | '_'
;
fragment VALID_ID_CHAR
: VALID_ID_START | ('0' .. '9')
;
NOT_SPECIAL
: ~(' ' | '\t' | '\n' | '\r' | '\'' | '"' | ';' | '.' | '=' )
;
ID
: VALID_ID_START VALID_ID_CHAR*
;
STRING
: NOT_SPECIAL+
| '"' ~('\n'|'"')* ('"'
| { panic("syntax-error - unterminated string literal") } )
;
WS
: [ \r\n\t] + -> skip
;