javaCC put文件流中的调用函数数

时间:2015-05-25 11:28:29

标签: javacc

我希望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  () {}
    {
    ......
    }

非常感谢,

1 个答案:

答案 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 ) ;
      }
}