ANTLR3语法适用于空格,但在省略空格时会产生NoViableAltException

时间:2013-04-03 10:49:33

标签: antlr antlr3

我需要解析定义查询到系统的用户输入。这些查询的核心是三元组,它们也可以组合形成复杂的查询(这个想法是将结果集限制为只显示满足这些查询的条目)。以下是3个示例输入:

field1 = simpleValueNoQuotes
field2 ~ "valueWithQuotes"
(field1 = simpleValueNoQuotes OR field2 ~ "valueWithQuotes") AND field3 = foobar

如果用户的值包含任何保留字符(如双引号或括号以及空格),则用户必须使用带引号的值。

到目前为止,我的语法处理得很好,但现在出现了新的要求。应允许用户省略空格,输入field1=simpleValueNoQuotes等查询。我的语法无法解决这个问题,我似乎无法弄明白为什么(这是我的第一个使用antlr的项目)。

这是我的语法,略有简化形式:

grammar simple;

querytree   :   query EOF;

query   :   subquery (operator subquery)* ;

subquery    :   leaf | composite;

operator    :   'and' | 'or';

leaf    :   fieldname comparison value;

value   :   DOUBLEQUOTE_DELIMITED_VALUE | SIMPLE_VALUE;

composite   :   leftParenthesis query rightParenthesis; 

fieldname   :   'field1' | 'field2'; //this has many keywords in reality

comparison  :   '=' | '~';

leftParenthesis     :   '(';
rightParenthesis    :   ')';

fragment
ESCAPE  :   '\\' ( '"' | '\\') ;

DOUBLEQUOTE_DELIMITED_VALUE 
:   '"' ( ~( '"' | '\\' ) | ESCAPE )* '"'
;   

SIMPLE_VALUE
:   ('\u0021'|'\u0023'..'\u0027'|'\u002A'..'\u007E'|'\u00A1'..'\uFFFF')*;   /*all unicode characters except control characters, doublequotes, parentheses and whitespace defined below*/

WHITESPACE
:   ('\u0009'|'\u000A'|'\u000C'|'\u000D'|'\u0020'|'\u00A0')+    {$channel = HIDDEN;}   /*\t, \n, \f, \r, space, nonbreaking space*/
;   

有关为何能够解析field1 = simpleValueNoQuotes但无法解析field1=simpleValueNoQuotes的任何想法?

1 个答案:

答案 0 :(得分:0)

您忘记从=中排除SIMPLE_VALUE,这意味着field1=simpleValueNoQuotes是一个SIMPLE_VALUE令牌。