下面的语法对于输入“人员地址=%John%”(不带引号)产生错误。它正确地标记了令牌,但随后返回期望的ID:
ID ("Person")ID ("Address")
EQ ("=")
STRING ("%John%")
line 1:21 mismatched input '<EOF>' expecting ID
解析了搜索子句后,如何期望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
;