我正在尝试为一个小查询语言编写一个ANTLR语法。查询是限制在特定字段中的搜索字词列表:
field1:field2:b field3:c
那应该返回一个实体列表,其中field1匹配a,field2匹配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解析器字段解析为查询的最后一个字符。当我真的想要整个字符串时,似乎会为查询的每个字符调用该操作。
感谢阅读!
答案 0 :(得分:1)
"我希望不受限制的查询成为与查询规则的第一个替代"不匹配的任何文字。 这是一个糟糕的设计决定。如果将来你想添加Field4怎么办?然后发生不兼容。更好地更改语法,以便轻松识别不受限制的查询。带引号的环绕字段值(a,b,c),或用冒号开始不受限制的查询:
field1:a :abc field2:b