计算不仅仅由注释组成的函数行数

count lines of Function that don't consist solely of comments

我想计算不仅仅由注释组成的函数行数。

.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() 的行数。 提前谢谢你。

我假设空行只包含注释。 (因为他们这样做了。)其次,我假设评论要么被跳过,要么被特殊标记。让我们将包含令牌的第一行称为有趣的行 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.