ANTLR を使用してコンテキスト依存のレクサー ルールをコーディングしようとしていますが、必要な処理を行うことができません。ルールは、ルールの先頭にある文字に基づいて、2 つの選択肢のうちの 1 つに一致する必要があります。以下は、問題の大幅に簡略化されたバージョンです。
この例の文法:
lexer grammar X;
options
{
language = C;
}
RULE :
SimpleIdent {ctx->someFunction($SimpleIdent);}
(
{ctx->test != true}?
//Nothing
| {ctx->test == true}?
SLSpace+ OtherText
)
;
fragment SimpleIdent : ('a'..'z' | 'A'..'Z' | '_')+;
fragment SLSpace : ' ';
fragment OtherText : (~'\n')* '\n';
ctx->testが false の場合、レクサーはこのルールを終了し、SimpleIdent の後のすべての文字を無視すると思います。残念ながら、ANTLR は述語がテストされる前に SimpleIdent の後に文字をテストするため、そこにスペースがある場合は常に 2 番目の選択肢が使用されます。これは、C コードで明確に示されています。
// X.g:10:3: ({...}?|{...}? ( SLSpace )+ OtherText )
{
int alt2=2;
switch ( LA(1) )
{
case '\t':
case ' ':
{
alt2=2;
}
break;
default:
alt2=1;
}
switch (alt2)
{
case 1:
// X.g:11:5: {...}?
{
if ( !((ctx->test != true)) )
{
//Exception
}
}
break;
case 2:
// X.g:13:5: {...}? ( SLSpace )+ OtherText
{
if ( !((ctx->test == true)) )
{
//Exception
}
ANTLR が実行時にレクサーで特定のパスを取るようにするにはどうすればよいですか?