我想计算不仅仅包含评论的函数行。
.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数量。 提前谢谢你。
答案 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。