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
;