парсинг определенного количества строк в javacc - PullRequest
2 голосов
/ 05 ноября 2010

У меня есть файл с определенным форматом, который я хотел бы проанализировать. В этом файле у меня есть номер в строке, который указывает количество строк, которые следует за ним.

пример выдержки из файла:

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

Я хочу прочитать число (3 в этом примере), а затем прочитать только следующие 3 строки. Если строк меньше или больше, я хочу выдать ошибку. Как я могу сделать это в javacc?

Спасибо

1 Ответ

1 голос
/ 06 ноября 2010

Вот способ:

/* 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
...