一部の入力に対して、パーサーは「より長い一致の可能性のある種類: { <式>, <テキスト> }」を提示しますが、何らかの奇妙な理由で間違ったものを選択します。
これはソースです:
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) " となります。
私の質問は、入力を <TEXT> ではなく <EXPRESSION>として解析することを選択したのはなぜですか?
また、パーサーに正しいパスを選択させるにはどうすればよいですか? 私は無数の LOOKAHEAD シナリオを試しましたが、成功しませんでした。
正しいパスは、たとえば"a.bc.d"を入力として使用する 場合は<TEXT>であり、 "{a.bc.d}"の場合は<EXPRESSION>です。
前もって感謝します。