JavaCC附带的例子是寻找匹配的花括号个数的,我写的例子在它的基础上稍微延伸,可以实现对多行的处理,每行的信息都能表现出来。
options{
STATIC = false;
}
PARSER_BEGIN(Simple2)
public class Simple2 {
public static int lineNumber = 0;
public static void main(String args[]) throws ParseException {
Simple2 parser = new Simple2(System.in);
parser.Run();
System.out.println("Total Line = "+ (lineNumber+1));//计算行数
}
}
PARSER_END(Simple2)
SKIP :
{
" "
| "/t"
| "/r"
}
TOKEN:
{
<NEWLINE : "/n">//考虑到系统不同,仅选择对/n标记
{
Simple2.lineNumber++; //因为此处是在TokenManager处理需要标识作用域
}
}
void Run():{}
{
( Input() )*<EOF>
}
void Input() :
{
int count;
}
{
( count = MatchedBraces() )+ (<NEWLINE>)*
{System.out.println("This line:" + count);}
}
int MatchedBraces() :
{ int nested_count = 0;}
{
"{" [ nested_count = MatchedBraces() ] "}"
{ return ++nested_count; }
}
不足的地方时,如此写法会出现冗余代码,原因在MatchedBraces函数中的花括号出现,因此待我研究明白LOOKAHEAD之后再做改进。