5

我正在尝试为一种小查询语言编写 ANTLR 语法。查询是仅限于特定字段的搜索词列表:

字段 1:a 字段 2:b 字段 3:c

这应该返回一个实体列表,其中 field1 匹配 a,field2 匹配 b,依此类推。查询也可以完全不受限制:

美国广播公司

这应该返回具有与 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) 当我将它插入我的网络服务器时,unrestrictedQuery 解析器字段解析为查询的最后一个字符。当我真的想要整个字符串时,似乎对查询的每个字符都调用了该操作。

谢谢阅读!

4

1 回答 1

1

“我希望不受限制的查询是与查询规则的第一个替代项不匹配的任何文本”。这是一个糟糕的设计决策。如果将来要添加 Field4 怎么办?然后出现不兼容。更好地更改语法,以便轻松识别不受限制的查询。用引号将字段值(a、b、c)括起来,或用冒号开始不受限制的查询:

field1:a :abc field2:b
于 2012-11-09T05:55:11.530 回答