2010-11-05 2 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