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

时间:2014-05-27 11:03:08

标签: antlr grammar antlr3

My Grammar文件(见下文)解析类型的查询:

(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+)
    ;

1 个答案:

答案 0 :(得分:0)

String规则中添加atom令牌作为替代:

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