计算不仅仅由注释组成的函数行数
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.
我想计算不仅仅由注释组成的函数行数。
.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.