微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何区分主函数内部的循环和主函数外部的另一种方法?

如何解决如何区分主函数内部的循环和主函数外部的另一种方法?

我正在使用此语法文件CPP14使用针对c ++语言的Java编程。

我的主要目标是在输入文件中定位循环,并对其中的语句进行一些分析,我通过访问访问者中的循环(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];
    }
}

我的工具将进入函数并在循环内对语句进行分析,并在循环上方编写,这很好。但是在分析之后,我想将语句保存在函数内的循环下在另一个ArrayList中,就像我一开始对getText()所做的那样,以进行进一步的分析,因为循环下的所有语句都将出现在Str1中,但是我无法以相同的方式进入函数体并获取文本之前的代码段中带有循环。

如何获取不在主函数之外的函数中发生的循环内的语句,并将其保存在与前一个ArrayList不同的单独的ArrayList中,以及如何保存任何函数标识符的名称以及代码中的函数调用除了两个ArrayList中的主函数以外,一个用于标识符,另一个用于函数调用

这是我上面提到的示例的解析树parse tree

提前谢谢

解决方法

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。