2012-11-09 27 views
5

我想写一个小查询语言的ANTLR语法。查询是仅限于特定领域的搜索术语的列表:捕捉所有第二个替代我的开始规则

字段1:一个字段2:乙场3:C

这应该返回实体的列表,其中字段1相匹配的,场2匹配B,等等。查询还可以完全不受限制:

ABC

这应该与任何场匹配ABC返回实体。这是ANTLR语法:

@members { 
    String unrestrictedQuery; 
} 

FIELD1_OPERATOR: 'field1:'; 
FIELD2_OPERATOR: 'field2:'; 
FIELD3_OPERATOR: 'field3:'; 
DIGIT: '0'..'9'; 
LETTER: 'A'..'Z' | 'a'..'z'; 

query: subquery (' ' subquery)* 
    | UNRESTRICTED_QUERY=.* {unrestrictedQuery = $UNRESTRICTED_QUERY.text;} 
    ; 

我想要不受限制的查询是与查询规则的第一个备选不匹配的任何文本。

1)有没有更好的方法来抓取第二个替代方案匹配的文本?

2)当我将其插入到我的Web服务器时,unrestrictedQuery解析器字段将解析为查询的最后一个字符。当我真的需要整个字符串时,似乎这个动作被调用了查询的每个字符。

感谢您的阅读!

+1

的'''中UNRESTRICTED_QUERY = *'匹配的令牌的任何量。它*不*匹配任何数量的字符!巨大差距。 –

+0

你是对的。谢谢。 –

回答

1

“我想要不受限制的查询是与查询规则的第一个替代选项不匹配的任何文本”。 这是一个糟糕的设计决定。如果将来你想添加Field4?然后发生不兼容性。更好地更改语法,以便轻松识别不受限制的查询。环绕声场值(A,B,c)与报​​价,或用冒号开始不受限制查询:。

field1:a :abc field2:b