2012-04-19 64 views
1

在一個典型的解析器生成情況(如ANTLR或狸),怎麼可能一個處理以下情況:處理迭代次數字段解析器生成

0051A2B3C4D5E 
0031G2T3H 

如果它是告訴你3個字符數字字段在重複字段之後有多少次迭代。

我知道有後處理的可能性,但在某些情況下不會有用,所以我試圖找到解析器是否有某種方法來處理它。如果有一種解決方案在解析器讀取數字字段時與解析器交互,這將是可以接受的 - 不知怎的,它告訴它在基於某個生產的N個項目中閱讀。

回答

2

這是否可能取決於解析器生成器。

您的詞法分析器需要了解其周圍環境(上下文相關)。您只需要在行的開頭創建一個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 

如下:

enter image description here