我刚刚发现了我观察到的一些非常令人困惑的行为的根本原因。这是一个测试:
@Test
public void test2() {
Terminals terminals = Terminals.caseInsensitive(new String[] {}, new String[] { "true", "false" });
Object result = terminals.tokenizer().parse("d");
System.out.println("Result: " + result);
}
这输出:
Result: d
我期待返回的解析器terminals.tokenizer()不返回任何内容,因为“d”不是有效的关键字或运算符。
我关心的原因是因为我希望我自己的解析器的优先级低于返回的优先级terminals.tokenizer():
public static final Parser<?> INSTANCE =
Parsers.or(
STRING_TOKENIZER,
NUMBER_TOKENIZER,
WHITESPACE_TOKENIZER,
(Parser<Token>)TERMINALS.tokenizer(),
IDENTIFIER_TOKENIZER);
以上IDENTIFIER_TOKENIZER从未使用过,因为TERMINALS.tokenizer()总是匹配。
为什么要Terminals.tokenizer()标记未注册的运算符/关键字?我该如何解决这个问题?