非常简单的语法和词法分析器的Antlr问题

时间:2018-11-12 14:41:59

标签: parsing antlr antlr4 context-free-grammar

下面的语法对于输入“人员地址=%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
;

0 个答案:

没有答案