我有一个要解析的特定格式的文件。在这个文件中,我在一行上有一个数字,它指定跟随它的行数。
该文件的示例摘录:
3 // number of lines to follow = 3
1 3 // 1st line
3 5 // 2nd line
2 7 // 3rd line
我想读取数字(本例中为 3),然后仅读取以下 3 行。如果有更少或更多的行,我想生成一个错误。我怎样才能在 javacc 中做到这一点?
谢谢
这里有一个方法:
/* 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