我正在使用antlr4,我想解析和分析任何c代码,以检测任何c源代码中的任何循环,对它们进行依赖性分析,我想检测外循环,如果它有内环,我想将其检测为内环, 但是我在源代码中检测不到任何循环。
我所做和尝试的:
这是我在antlr中用于“for循环”的规则:
forBlock: 'for' '(' (classicFor | forEach) ')' controlStructureBody ;
forExpression: primaryExpression (',' primaryExpression)* ;
我打印出代码中的代币:
# include <iostream>
using namespace std;
int main()
{
for (int i = 0; i <= 5; i++) {
for (int j = 0; j <= 5; j++) {
cout << i << j << " \t";
}
cout << "\n";
}
return 0;
}
使用此代码 与jave:
public void printToken(String inputFile) throws FileNotFoundException, IOException {
System.out.println("The tokens of the source code is: \n");
CharStream inputStream = CharStreams.fromFileName(inputFile);
TokensLexer tokensLexer = new TokensLexer(inputStream);
CommonTokenStream tokenStream = new CommonTokenStream(tokensLexer);
tokenStream.fill();
for (Token token : tokenStream.getTokens()) {
System.out.println("<" + token.getText() + "> " + "<" + token.getType() + ">");
}
}
它给了我每个for循环的类型:
<for> <45>
<for> <45>
我试过这个代码:
CharStream inputStream = CharStreams.fromFileName(inputFile);
// lexing the code
TokensLexer tokensLexer = new TokensLexer(inputStream);
CommonTokenStream tokenStream = new CommonTokenStream(tokensLexer);
// parsing the code
TokensParser tokensParser = new TokensParser(tokenStream);
tokenStream.fill();
for (Token token : tokenStream.getTokens()) {
if (token.getType() == 45)
System.out.println("loop is found");
}
}
当我把“45”打印出来 ““找到循环” 两次,当我把号码改成“39”时,它就会打印出来 ““找到循环” 只有一次。 我尝试了“39”,因为我从antlr语法生成的文件中有这个值。
代币。代币-> 对于=45。
tokens.lexer.tokens-> 对于=45
tokensparser.java-> 规则\u forblock=39; 规则\u forexpression=40;
当我尝试添加更多循环时:
# include <iostream>
using namespace std;
int main()
{
for (int i = 0; i <= 5; i++)
{
for (int j = 0; j <= 5; j++) {
cout << i << j << " \t";
}
cout << "\n";
}
for (int i = 0; i < 100; i++)
{
cout<<"Test"<<endl;
} return 0;
}
使用数字39,仍然只检测一个循环。
有没有一种方法可以使用antlr检测源代码中的循环并区分外循环和内循环?
1条答案
按热度按时间vc9ivgsu1#
您没有提供足够的代码/语法来重现您所描述的内容。因此,我将演示如何使用antlr存储库中的c++语法来解决这个问题。
我只是稍微改变了一条规则。而不是:
我给它加了一些标签:
通过这些更改,以下演示类:
将提供以下输出: