2010-11-05 42 views
2

我有一個我想要解析的特定格式的文件。在這個文件中,我在一行中有一個數字,它指定了跟隨它的行數。從文件解析javacc中的特定行數

示例摘錄:

3 // number of lines to follow = 3 
1 3 // 1st line 
3 5 // 2nd line 
2 7 // 3rd line 

我想讀(在本實施例3)的數目,然後只讀下面3行。如果有更少或更多的行我想生成一個錯誤。我如何在javacc中執行此操作?

謝謝

回答

1

這裏有一個辦法:

/* file: Lines.jj */ 
options { 
    STATIC = false ; 
} 

PARSER_BEGIN(Lines) 

class Lines { 
    public static void main(String[] args) throws ParseException, TokenMgrError { 
     Lines parser = new Lines(System.in); 
     System.out.println("diff="+parser.parse());   
    } 
} 

PARSER_END(Lines) 

SKIP : { " " } 
TOKEN : { <NL : ("\r\n" | "\n" | "\r")> } 
TOKEN : { <NUMBER : (["0"-"9"])+> } 

int parse() : 
{ 
    int linesToRead = 0; 
    int linesRead = 0; 
    Token n = null; 
} 
{ 
    n = <NUMBER> <NL> {linesToRead = Integer.parseInt(n.image);} 
    (
     (<NUMBER>)+ <NL> {linesRead++;} 
    )* 
    <EOF> 
    {return linesToRead - linesRead;} 
} 

Lines.parse() : int方法返回它應該讀線的數目和線的實際數量被讀取的區別。

生成這樣的解析器:

javacc Lines.jj 

編譯所有的類:

java *.java 

和飼料它的測試數據(test.txt):

3 
1 3 
3 5 
2 7 

這樣的:

java Lines < test.txt 

它產生輸出:

diff=0