3

解析したい特定の形式のファイルがあります。このファイルには、それに続く行数を指定する行に数字があります。

ファイルからの抜粋例:

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

数値 (この例では 3) を読み取り、次の 3 行のみを読み取りたいとします。行が少ないか多い場合は、エラーを生成します。javaccでこれを行うにはどうすればよいですか?

ありがとうございました

4

1 に答える 1

2

方法は次のとおりです。

/* 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
于 2010-11-06T07:57:54.240 に答える