在 java 中获取 COBOL 程序的静态函数调用图
Getting static function call graph of a COBOL program in java
我必须解析 COBOL 代码,以生成一个简单易懂的程序概览。我想使用 Java 作为它的 effienciency/security 妥协。
我不知道周围的所有工具,但我知道拥有适合此任务的正确工具会使事情变得容易得多!
所以我需要一个工具来生成函数调用图,对我来说这基本上意味着编写一个解析器...
我觉得JavaCC是个不错的选择,还有ANTLR...这些工具可以创建函数调用图结构吗?
为了绘制函数调用图,使用词法分析器的好方法是什么?我的意思是我不想重写已经在这些工具中实现但我不知道的代码。
谢谢
免责声明:我是 ProLeap COBOL 解析器的维护者。
您可以使用 Java-based ProLeap COBOL parser to extract calls to paragraphs, sections, data 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 解析器已获得开源许可,因此可以免费使用。
我必须解析 COBOL 代码,以生成一个简单易懂的程序概览。我想使用 Java 作为它的 effienciency/security 妥协。 我不知道周围的所有工具,但我知道拥有适合此任务的正确工具会使事情变得容易得多!
所以我需要一个工具来生成函数调用图,对我来说这基本上意味着编写一个解析器... 我觉得JavaCC是个不错的选择,还有ANTLR...这些工具可以创建函数调用图结构吗?
为了绘制函数调用图,使用词法分析器的好方法是什么?我的意思是我不想重写已经在这些工具中实现但我不知道的代码。
谢谢
免责声明:我是 ProLeap COBOL 解析器的维护者。
您可以使用 Java-based ProLeap COBOL parser to extract calls to paragraphs, sections, data 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 解析器已获得开源许可,因此可以免费使用。