抓住我的开始规则的所有第二个选择

Jua*_*uno 5 java parsing antlr3

我正在尝试为一个小查询语言编写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;}
  ;
Run Code Online (Sandbox Code Playgroud)

我希望不受限制的查询是与查询规则的第一个替代方案不匹配的任何文本.

1)有没有更好的方法来获取第二个备选方案匹配的文本?

2)当我将其插入我的Web服务器时,unrestrictedQuery解析器字段解析为查询的最后一个字符.当我真正想要整个字符串时,似乎为查询的每个字符调用了该操作.

谢谢阅读!

Ale*_*dov 1

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

field1:a :abc field2:b
Run Code Online (Sandbox Code Playgroud)