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

时间:2018-03-18 23:01:42

标签: java parsing call-graph

我必须解析COBOL代码,以便生成一个简单易懂的程序概述。我想使用Java来实现其效率/安全性。 我不知道所有的工具,但我知道有适合这项任务的工具会让事情变得更容易!

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

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

谢谢

1 个答案:

答案 0 :(得分:1)

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

您可以使用基于Java的ProLeap COBOL parser来解压缩对paragraphssectionsdata description entries等的调用。解析器将为您提供调用图,但是图形必须添加绘图。

所以,例如这段话叫......

 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解析器是根据开源许可证授权的,因此可以免费使用。