javaCC Count of call Function in put file stream

javaCC Count of number of call Function in put file stream

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

非常感谢,

不清楚是要计算声明数还是调用数。而且,如果你想计算调用次数,你想为每个函数单独计数吗?

(a) 你想对声明进行计数。 添加一个 int 字段 "declCount" 到解析器 class。 (如果解析器是静态的,则将其设为静态。)向 MyFunction

添加一行
  void  MyFunction () {}
    {
        <method> <id> "(" Argument () ")" {}
        (Statement ()) *
        <end_method>
        { ++declCount ; } // add this line
    }

(b) 您想对调用进行计数。 将一个 int 字段添加到解析器 class,称为 "callCount"。 (如果解析器是静态的,则将其设为静态。)向 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 ) ;
      }
}