我希望javacc生成的解析器通过程序语句计算调用MyFunction的次数。
我的问题是如何通过put文件流中的其他语句来计算函数MyFunction的调用次数。
MyFunction由以下JavaCC规则定义:
void MyFunction () {}
{
<method> <id> "(" Argument () ")" {}
(Statement ()) *
<end_method>
}
void Argument () {}
{
<STRING> id
<STRING> id
}
void statement () {}
{
CallMyFonction ()
statementType2 () // here is another statement that can call method // by CallMyFonction ()
...........
}
void CallMyFunction () {}
{
<id> "(" (
ExpressionTreeStructure ()
(
"," ExpressionTreeStructure ()
) *
) *
")"
}
void ExpressionTreeStructure () {}
{
......
}
非常感谢,
答案 0 :(得分:1)
目前尚不清楚是否要计算声明或调用。而且,如果你想计算通话数,你是否想要为每个功能分别计算。
(a)您想要计算声明。添加一个int字段&#34; declCount&#34;到解析器类。 (如果解析器是静态的,则使其成为静态。)向MyFunction添加一行
void MyFunction () {}
{
<method> <id> "(" Argument () ")" {}
(Statement ()) *
<end_method>
{ ++declCount ; } // add this line
}
(b)您想要对呼叫进行计数。将一个int字段添加到名为&#34; callCount&#34;的解析器类中。 (如果解析器是静态的,则使其为静态。)向CallMyFunction
添加一行 void CallMyFunction () {}
{
<id> "(" (
ExpressionTreeStructure ()
(
"," ExpressionTreeStructure ()
) *
) *
")"
{ ++callCount ; } // add this line.
}
(c)您希望按功能名称分解呼叫计数。向解析器添加字段
HashMap<String,Integer> callCounts = new HashMap<String,Integer>() ;
(如果解析器是静态的,请将其设置为静态。)修改CallMyFunction
void CallMyFunction () {
Token name ; // Add this line
}
{
name = <id> "(" (
ExpressionTreeStructure ()
(
"," ExpressionTreeStructure ()
) *
) *
")"
{ // Add this block.
int count = callCounts.containsKey( name.image )
? callCounts.get( name.image )
: 0 ;
callCounts.put( name.image, count + 1 ) ;
}
}