什么';这个ANTLR语法怎么了?

什么';这个ANTLR语法怎么了?,antlr,antlr4,context-free-grammar,Antlr,Antlr4,Context Free Grammar,我想解析如下所示的查询表达式: 人名=%John% (人名=约翰%,地址=%1%) 人员全名\u 3=“约翰C.史密斯” 但我对Antlr4完全陌生,甚至不知道如何解析一个表字段=查询子句。当我在Go as target中运行下面的语法时,我得到 line 1:7 mismatched input 'Name' expecting {'not', '(', FIELDNAME} 对于一个简单的查询,如 人名=约翰 为什么语法不能通过解析fieldsearch->FieldEQ searcht

我想解析如下所示的查询表达式:

人名=%John%

(人名=约翰%,地址=%1%)

人员全名\u 3=“约翰C.史密斯”

但我对Antlr4完全陌生,甚至不知道如何解析一个表字段=查询子句。当我在Go as target中运行下面的语法时,我得到

line 1:7 mismatched input 'Name' expecting {'not', '(', FIELDNAME} 
对于一个简单的查询,如

人名=约翰

为什么语法不能通过解析fieldsearch->FieldEQ searchterm->FIELDNAME解析FIELDNAME

我想我在这里误解了一些关于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
    : FIELDNAME
    ;

table
    : TABLENAME
    ;

searchterm
    : 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')
    ;

TABLENAME
    : VALID_ID_START VALID_ID_CHAR*
    ;

FIELDNAME
    : VALID_ID_START VALID_ID_CHAR*
    ;

STRING: '"' ~('\n'|'"')* ('"' | { panic("syntax-error - unterminated string literal") } ) ;

WS
   : [ \r\n\t] + -> skip
;

尝试使用
grun Mdb tokens-tokens
查看为该输入生成的令牌。它将告诉您输入由两个表名组成,一个等号,然后是另一个表名。为了匹配您的语法,它需要一个表名、一个字段名、一个等号和一个字符串

第一个问题是
TABLENAME
FIELDNAME
具有完全相同的定义。如果两个lexer规则在当前输入上产生相同长度的匹配,ANTLR会选择语法中第一个规则。因此,它永远不会生成
字段名
标记。要解决这个问题,只需用一个
ID
规则替换这两个规则。如果需要,可以引入解析器规则
tableName:ID
字段名:ID如果要保留名称


另一个问题更直截了当:
John
根本不符合字符串的规则,因为它不在引号中。如果您确实希望允许
John
作为有效的搜索词,您可能希望将其定义为
searchterm:STRING | ID
不再只允许
STRING
s.

完美的回复,我现在理解了这个问题。非常感谢你!