ANTLR-接受具有多个单词的属性的字段

ANTLR-接受具有多个单词的属性的字段,antlr,grammar,antlr3,Antlr,Grammar,Antlr3,我的语法文件(请参见下文)解析以下类型的查询: (name = Jon AND age != 16 OR city = NY); 但是,它不允许出现以下情况: (name = 'Jon Smith' AND age != 16); 也就是说,它不允许将多个单词的值分配给字段,并用空格分隔。我如何修改语法文件以接受它 options { language = Java; output = AST; } tokens { BLOCK; RETURN; Q

我的语法文件(请参见下文)解析以下类型的查询:

(name = Jon AND age != 16 OR city = NY);
但是,它不允许出现以下情况:

(name = 'Jon Smith' AND age != 16);
也就是说,它不允许将多个单词的值分配给字段,并用空格分隔。我如何修改语法文件以接受它

options
{
    language = Java;
    output = AST;
}

tokens {
    BLOCK;
    RETURN;
    QUERY;
    ASSIGNMENT;
    INDEXES;
}

@parser::header {
    package pt.ptinovacao.agorang.antlr;
}
@lexer::header {
    package pt.ptinovacao.agorang.antlr;
}

query
    :   expr ('ORDER BY' NAME AD)? ';' EOF
    ->  ^(QUERY expr ^('ORDER BY' NAME AD)?)    
    ;

expr
    :   logical_expr
    ;

logical_expr
    :   equality_expr (logical_op^ equality_expr)*
    ;

equality_expr
    :   NAME equality_op atom   -> ^(equality_op NAME atom)
    |   '(' expr ')'    ->  ^('(' expr)
    ;

atom
    :   ID
    |   id_list
    |   Int
    |   Number
    ;

id_list
    :   '(' ID (',' ID)* ')' 
    ->  ID+
    ;

NAME
    :   'equipType'
    |   'equipment'
    |   'IP'
    |   'site'
    |   'managedDomain'
    |   'adminState'
    |   'dataType'
    ;

AD  :   'ASC'   | 'DESC'    ;

equality_op
    :   '='
    |   '!='
    |   'IN'
    |   'NOT IN'
    ;

logical_op
    :   'AND'
    |   'OR'
    ;

Number
    :   Int ('.' Digit*)?
    ;

ID
    :   ('a'..'z' | 'A'..'Z' | '_' | '.' | '-' | Digit)* 
    ;

String
@after {
    setText(getText().substring(1, getText().length()-1).replaceAll("\\\\(.)", "$1"));
    }
    :  '"'  (~('"' | '\\')  | '\\' ('\\' | '"'))* '"' 
    |  '\'' (~('\'' | '\\') | '\\' ('\\' | '\''))* '\''
    ;

Comment
    :  '//' ~('\r' | '\n')* {skip();}
    |  '/*' .* '*/'         {skip();}
    ;

Space
    :  (' ' | '\t' | '\r' | '\n' | '\u000C') {skip();}
    ;

fragment Int
    :  '1'..'9' Digit*
    |  '0'
    ;

fragment Digit 
    :  '0'..'9'
    ;

indexes
    :  ('[' expr ']')+ -> ^(INDEXES expr+)
    ;
在atom规则中包含字符串标记作为替代:

atom
    :   ID
    |   id_list
    |   Int
    |   Number
    |   String
    ;