如何区分主函数内部的循环和主函数外部的其他方法中的循环? 我用java语言编写了以C++语言为目标的语法文件。

如何区分主函数内部的循环和主函数外部的其他方法中的循环? 我用java语言编写了以C++语言为目标的语法文件。,java,function,loops,for-loop,antlr4,Java,Function,Loops,For Loop,Antlr4,我的主要目标是在输入文件中定位循环,并对其中的语句进行一些分析。我通过在visitor中访问循环(for、while和do-while)部分实现了这一目标。我将从ArrayList中的getText获得的字符串保存在另一个类中,以便对其进行分析 public Object visitClassicForStatement(GrammarParser.ClassicForStatementContext ctx) { String Str1 = ctx.statement().compound

我的主要目标是在输入文件中定位循环,并对其中的语句进行一些分析。我通过在visitor中访问循环(for、while和do-while)部分实现了这一目标。我将从ArrayList中的getText获得的字符串保存在另一个类中,以便对其进行分析

public Object visitClassicForStatement(GrammarParser.ClassicForStatementContext ctx) {
  String Str1 = ctx.statement().compoundstatement().statementseq().statement().getText();
  check.checlLoops(Str1);
  if (check.flag()) {
    String message = "true";
    rewriter.insertBefore(ctx.start, message);
  }
但是在使我的工具变得更加成熟的过程中,我现在面临一个问题,这个问题正在发生,因为如果我在输入文件中有函数,如下面的示例所示:

void add(int a[]);
int main()
{
    int a[11] = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };
    add(a);
    for (int i = 0; i < 10; i++) {
        printf("%d\n", a[i]);
    }
    return 0;
}
void add(int a[])
{
    for (int i = 0; i < 10; i++) {
        a[i] = a[i + 1];
    }
}
void add(int a[]);
int main()
{
inta[11]={10,20,30,40,50,60,70,80,90,100};
添加(a);
对于(int i=0;i<10;i++){
printf(“%d\n”,a[i]);
}
返回0;
}
无效添加(int a[])
{
对于(int i=0;i<10;i++){
a[i]=a[i+1];
}
}
我的工具将进入函数并对循环内的语句进行分析,并在循环上方写入,这很好,但在分析之后,我想将函数内循环下的语句保存在另一个ArrayList中,就像我在开始时对getText()所做的那样,以进行进一步的分析,因为循环下的所有语句都将出现在Str1中,但我无法进入函数体并获取文本,就像我在前面的代码片段中处理循环时所做的那样

如何获取在函数(而非main函数)中出现的循环中的语句,并将它们保存在与前一个ArrayList不同的ArrayList中,以及如何保存任何函数标识符的名称,和代码中的函数调用,而不是两个ArrayList中的主函数,一个用于标识符,另一个用于函数调用

下面是我上面提到的示例的解析树


提前感谢您

如果您正确理解了,那么您可以使用访问者获取解析树中循环的内容,但是您无法区分不同的循环(因为它们都在相同的访问者方法中处理)。对吗


如果是这样,那么使用解析树路径来确定执行访问者时的位置。给定的上下文有一个父成员,而父成员又有一个父成员。因此,您可以为访问者方法的每个调用创建一个调用链。使用它来查找输入中的位置(顶级、某些函数、嵌套或匿名函数等)。

谢谢你的回答,Mike,是的,你从我的问题中理解的是正确的。我为我的英语感到抱歉。我在处理解析树时遇到了一个问题,特别是当涉及到父级和子级时,正如您所看到的,我使用解析树直接获取文本,而不处理父级或子级,你能给我举一些处理同一问题的例子吗?因为我试图理解与父母和孩子打交道的概念,但找不到很好的实施方法来向我说明这个概念,提前谢谢你,如果循环位于主函数内部,则从树的根到达主函数的方法是通过以下方式:声明序列->声明->函数定义->函数体->复合语句->语句序列->语句序列->语句->然后将听到循环。如果循环出现在main函数之外,那么它几乎会遵循前面在main方法内部循环的路径,如果在main方法之外有多个方法,那么它会变得更加困难