這是否可能取決於解析器生成器。
您的詞法分析器需要了解其周圍環境(上下文相關)。您只需要在行的開頭創建一個Num
令牌。在ANTLR中,您可以通過在Num
規則前添加謂詞getCharPositionInLine()==0
來完成此操作。
,然後在解析器規則,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
如下: