Antlr проблема с очень простой грамматикой и лексером - PullRequest
0 голосов
/ 12 ноября 2018

Приведенная ниже грамматика выдает ошибку для ввода «Адрес человека =% Джон%» (без кавычек). Он корректно обрабатывает токены, но затем возвращает, что ожидает идентификатор:

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
;
...