对于某些输入,解析器会显示“可能的较长匹配类型:{ <EXPRESSION>, <TEXT> } ”,但由于某些奇怪的原因,它选择了错误的。
这是来源:
SKIP :
{
" "
| "\r"
| "\t"
| "\n"
}
TOKEN :
{
< DOT : "." >
| < LBRACE : "{" >
| < RBRACE : "}" >
| < LBRACKET: "[" >
| < RBRACKET: "]" >
| < #LETTER : [ "a"-"z" ] >
| < #DIGIT : [ "0"-"9" ] >
| < #IDENTIFIER: < LETTER > (< LETTER >)* >
| < EXPRESSION : (< IDENTIFIER> < DOT > < IDENTIFIER> < DOT > < IDENTIFIER> ((< DOT > < IDENTIFIER> )* | < LBRACKET > (< DIGIT>)* < RBRACKET >)*)*>
| < TEXT : (( < DOT >)* ( < LETTER > )+ (< DOT >)*)* >
}
void q0() :
{Token token = null;}
{
(
< LBRACE > expression() < RBRACE >
| ( token = < TEXT >
{
getTextTokens().add( token.image );
}
)
)* < EOF >
}
void expression() :
{Token token = null;}
{
< EXPRESSION >
}
如果我们尝试使用这个语法解析“a.bc.d”,它会说“FOUND A <EXPRESSION> MATCH (a.bc.d)”
我的问题是为什么它选择将输入解析为<EXPRESSION> 而不是 <TEXT>?
另外,如何强制解析器选择正确的路径?我尝试了无数的 LOOKAHEAD 场景,但都没有成功。
例如,当使用 "a.bc.d"作为输入时,正确的路径是 <TEXT>,而对于" { a.bc.d } " 则使用<EXPRESSION>。
提前致谢。