これが可能かどうかは、パーサジェネレータによって異なります。
レクサーはその周囲を認識する必要があります(コンテキスト依存)。Num
行の先頭にのみトークンを作成する必要があります。ANTLRでは、ルールgetCharPositionInLine()==0
の前に述語を追加することでこれを行うことができます。Num
そして、パーサールールでは、カウンターがゼロより大きい(カウンターがの値である)限り、トークン(ダブル文字)をline
消費し続ける必要があります。Block
Num
簡単なANTLRデモ:
grammar T;
parse
: line* EOF
;
line
@init{int n = 0;}
: Num {n = Integer.valueOf($Num.text);} ({n > 0}?=> Block {n--;})*
;
Num
: {getCharPositionInLine()==0}?=> Digit Digit Digit
;
Block
: AlphaNum AlphaNum
;
Space
: (' ' | '\t' | '\r' | '\n')+ {skip();}
;
fragment Digit : '0'..'9';
fragment Letter : 'a'..'z' | 'A'..'Z';
fragment AlphaNum : Letter | Digit;
入力を解析します:
0051A2B3C4D5E
0031G2T3H
次のように:
