【问题标题】:Getting static function call graph of a COBOL program in java在java中获取COBOL程序的静态函数调用图
【发布时间】:2018-03-18 23:01:42
【问题描述】:

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

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

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

谢谢

【问题讨论】:

  • 您会发现,为真正的编程语言编写解析器比看起来要困难得多,因为语言/方言设计者多年来添加的所有内容。然后你会发现你需要对代码进行语义分析以获得你想要的任何东西(在这种情况下,函数调用信息)[你会发现间接函数调用]。您不想从头开始执行此操作。找一个可以完成大部分工作的工具,否则您将永远无法完成您想要完成的部分。
  • FAR 太宽泛了。即使在解析器生成器的帮助下,编写 Cobol 解析器也不是开玩笑。
  • 也许我可以将任务减少到只搜索函数调用,而不解析所有代码(它是有效代码,所以我不需要检查它)。但是,我认为最后我需要解析它以区分函数和其他指令......但我可以用函数/其他一切简化语法。所以解析 COBOL 可能很困难,但出于我的需要,我不会编写完整的 COBOL 解析器,而是编写一些用于 COBOL 输入的解析器。

标签: java parsing call-graph


【解决方案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 解析器是在开源许可下获得许可的,因此可以免费使用。

【讨论】:

  • 相当不错!我也在考虑使用 ANTLR,因为它已经编写了一个 COBOL 语法文件。我可能会在你的程序上启发我的程序,谢谢!
  • 其实ProLeap COBOL解析器是基于ANTLR和你提到的COBOL语法文件。我为这个解析器编写了 ANTLR COBOL 语法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 2020-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多