私が観察していたいくつかの非常に紛らわしい動作の根本的な原因を発見しました。ここにテストがあります:
@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()
未登録のオペレーター/キーワードをトークン化するのはなぜですか? そして、どうすればこれを回避できますか?