Java 为我的开始规则捕获所有第二个备选方案

Java 为我的开始规则捕获所有第二个备选方案,java,parsing,antlr3,Java,Parsing,Antlr3,我正在尝试为一个小查询语言编写一个ANTLR语法。查询是仅限于特定字段的搜索词列表: 字段1:a字段2:b字段3:c 它应该返回一个实体列表,其中field1匹配a,field2匹配b,依此类推。查询也可以完全不受限制: abc 它应该返回与abc匹配的任何字段的实体。以下是ANTLR语法: @members { String unrestrictedQuery; } FIELD1_OPERATOR: 'field1:'; FIELD2_OPERATOR: 'field2:'; FIELD

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

字段1:a字段2:b字段3: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解析器字段解析为查询的最后一个字符。当我真的需要整个字符串时,似乎会为查询的每个字符调用该操作

谢谢你的阅读

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

field1:a :abc field2:b

无限制查询=.*
中的
*
匹配任意数量的令牌。它不匹配任何数量的字符!差别很大,你完全正确。非常感谢。