计算不仅仅包含注释的函数行

时间:2015-06-20 19:33:10

标签: javacc

我想计算不仅仅包含评论的函数行。

.jj文件的附件:

    options
{
    ……..
  COMMON_TOKEN_ACTION = true ;
  LOOKAHEAD= 2;
}
PARSER_BEGIN(MyParseur)
……………
PARSER_END(MyParseur)

TOKEN_MGR_DECLS:
{


    static  int interestingLineCount=0;
    static int lineNumberOfLastInterestingLine=0;
    static Map <Integer, Integer> f = new HashMap<Integer, Integer>();
    void CommonTokenAction(Token t)
    {

       if(t.beginLine != lineNumberOfLastInterestingLine)
       {
        interestingLineCount++;

       lineNumberOfLastInterestingLine= t.beginLine;
       f.put(lineNumberOfLastInterestingLine, interestingLineCount);

       }
    }
}


    void  MyFunction : { int firstLine, lastLine;}
{
<begin> <id> "(" (Argument ())* ")"

{m = getToken(1).beginLine ; }

(Statement ())*

{n = getToken(0).beginLine ; }


<end>
}

我的问题是如何利用TOKEN_MGR_DECLS中定义的CommonTokenAction来计算MyFunction()的lignes数量。 提前谢谢你。

1 个答案:

答案 0 :(得分:0)

我将假设空白行仅被视为由评论组成。 (因为他们这样做。)其次,我假设评论被跳过或特殊令牌。让我们调用第一行包含令牌感兴趣的行1,第二行调用有趣的行2,依此类推。

我要做的是计算文件的非注释行。

  • 在令牌管理器中创建一个新字段,比如interestingLineCount。这会计算包含注释之外的标记的行。将其初始化为0。

  • 在令牌管理器中创建第二个字段,记录上一次interestingLineCount递增时的实际行号。称之为lineNumberOfLastInterestingLine。例如。如果interestingLineCount为10,则lineNumberOfLastInterestingLine是第10个有趣行的行号。将其初始化为0。

  • 在令牌管理器中创建一个字段,而不是表示从int到int的可变映射。我称之为f。

  • 创建执行以下操作的公共令牌操作。如果令牌在lineNumberOfLastInterestingLine上开始,则无需执行任何操作,因为已知当前行很有趣。否则:递增interestingLineCount,将lineNumberOfLastInterestingLine设置为令牌的行号,并将(lineNumberOfLastInterestingLine,interestingLineCount)添加到地图中。

  • 现在函数的第一个和最后一个标记有行号,比如m和n。函数定义中的行数为f(n)-f(m)+1。