具体的には、ANTLR に RegExp パーサーを実装しようとしています。
私の文法の関連部分は次のとおりです。
grammar JavaScriptRegExp;
options {
language = 'CSharp3';
}
tokens {
/* snip */
QUESTION = '?';
STAR = '*';
PLUS = '+';
L_CURLY = '{';
R_CURLY = '}';
COMMA = ',';
}
/* snip */
quantifier returns [Quantifier value]
: q=quantifierPrefix QUESTION?
{
var quant = $q.value;
quant.Eager = $QUESTION == null;
return quant;
}
;
quantifierPrefix returns [Quantifier value]
: STAR { return new Quantifier { Min = 0 }; }
| PLUS { return new Quantifier { Min = 1 }; }
| QUESTION { return new Quantifier { Min = 0, Max = 1 }; }
| L_CURLY min=DEC_DIGITS (COMMA max=DEC_DIGITS?)? R_CURLY
{
var minValue = int.Parse($min.Text);
if ($COMMA == null)
{
return new Quantifier { Min = minValue, Max = minValue };
}
else if ($max == null)
{
return new Quantifier { Min = minValue, Max = null };
}
else
{
var maxValue = int.Parse($max.Text);
return new Quantifier { Min = minValue, Max = maxValue };
}
}
;
DEC_DIGITS
: ('0'..'9')+
;
/* snip */
CHAR
: ~('^' | '$' | '\\' | '.' | '*' | '+' | '?' | '(' | ')' | '[' | ']' | '{' | '}' | '|')
;
ここで、中括弧の内側では「,」を COMMA としてトークン化したいのですが、外側では CHAR としてトークン化したいと考えています。
これは可能ですか?
これが起こっている唯一のケースではありません。これが問題になる他の多くのインスタンスがあります (10 進数字、文字クラスのハイフンなど)。
編集:
これが文脈依存の字句解析と呼ばれることを私は知っています。これはANTLRで可能ですか?