用java获取COBOL程序的静态函数调用图

用java获取COBOL程序的静态函数调用图,java,parsing,call-graph,Java,Parsing,Call Graph,我必须解析COBOL代码,以便生成一个简单易懂的程序概述。我想使用Java来提高效率/安全性。 我不知道周围的所有工具,但我知道拥有适合此任务的工具将使事情变得更容易 所以我需要一个工具来生成函数调用图,对我来说,这意味着基本上要编写一个解析器。。。 我认为JavaCC是一个不错的选择,还有ANTLR。。。这些工具能否创建函数调用图结构 为了绘制函数调用图,使用词法分析器的好方法是什么?我的意思是,我不想重写已经在这些工具中实现的代码,但我不知道 谢谢免责声明:我是ProLeap COBOL解析

我必须解析COBOL代码,以便生成一个简单易懂的程序概述。我想使用Java来提高效率/安全性。 我不知道周围的所有工具,但我知道拥有适合此任务的工具将使事情变得更容易

所以我需要一个工具来生成函数调用图,对我来说,这意味着基本上要编写一个解析器。。。 我认为JavaCC是一个不错的选择,还有ANTLR。。。这些工具能否创建函数调用图结构

为了绘制函数调用图,使用词法分析器的好方法是什么?我的意思是,我不想重写已经在这些工具中实现的代码,但我不知道


谢谢

免责声明:我是ProLeap COBOL解析器的维护者

您可以使用基于Java的方法提取对的调用等。解析器将为您提供调用图,但是必须添加图形绘制

例如,这段话叫

 IDENTIFICATION DIVISION.
 PROGRAM-ID. SECTIONCLL.
 DATA DIVISION.
 PROCEDURE DIVISION.
 INIT.
    PERFORM INIT.
。。。可以使用以下Java代码进行分析,在本例中返回1个调用:

package io.proleap.cobol.asg.call;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import java.io.File;

import org.junit.Test;

import io.proleap.cobol.CobolTestBase;
import io.proleap.cobol.asg.metamodel.CompilationUnit;
import io.proleap.cobol.asg.metamodel.Program;
import io.proleap.cobol.asg.metamodel.ProgramUnit;
import io.proleap.cobol.asg.metamodel.procedure.Paragraph;
import io.proleap.cobol.asg.metamodel.procedure.ProcedureDivision;
import io.proleap.cobol.asg.runner.impl.CobolParserRunnerImpl;
import io.proleap.cobol.preprocessor.CobolPreprocessor.CobolSourceFormatEnum;

public class ParagraphCallTest extends CobolTestBase {

    @Test
    public void test() throws Exception {
        final File inputFile = new File("src/test/resources/io/proleap/cobol/asg/call/ParagraphCall.cbl");
        final Program program = new CobolParserRunnerImpl().analyzeFile(inputFile, CobolSourceFormatEnum.TANDEM);

        final CompilationUnit compilationUnit = program.getCompilationUnit("ParagraphCall");
        final ProgramUnit programUnit = compilationUnit.getProgramUnit();
        final ProcedureDivision procedureDivision = programUnit.getProcedureDivision();

        final Paragraph paragraph = procedureDivision.getParagraph("Init");
        assertNotNull(paragraph);
        assertEquals(1, paragraph.getCalls().size());
    }
}

ProLeap COBOL解析器是根据开放源码许可证获得许可的,因此可以免费使用。

您会发现,为真正的编程语言编写解析器比看起来要困难得多,因为语言/方言设计者多年来添加了许多粗俗的东西。然后,您将发现需要对代码进行语义分析,以获得所需的任何内容(在本例中为函数调用信息)[并且您将发现间接函数调用]。你不想从头开始做这件事。找一个能完成大部分工作的工具,否则你永远无法完成你想要完成的部分。太宽泛了。编写Cobol解析器绝非易事,即使在解析器生成器的帮助下也是如此。也许我可以将任务简化为只搜索函数调用,而不解析所有代码(它是有效代码,所以我不需要检查)。但是,我仍然认为,最后我需要对它进行解析,以区分函数和其他指令。。。但是我可以用函数/其他一切来简化gramar。所以解析COBOL可能很难,但出于我的需要,我不会编写一个完整的COBOL解析器,而是为COBOL输入编写一些解析器。非常好!我考虑使用ANTLR也是因为它已经编写了一个COBOL语法文件。我可能会对你的计划有所启发,谢谢你!实际上,ProLeap COBOL解析器基于ANTLR和您提到的COBOL语法文件。ANTLR COBOL语法是我为这个解析器编写的。