2

我正在开发一个解析 Cobol 程序的应用程序。在这些程序中,有些尊重传统的编码风格(第 8 列到第 72 列的程序文本),有些较新,不遵循这种风格。

在我的应用程序中,我需要确定编码风格,以便知道是否应该解析第 72 列之后的内容。

我已经能够确定程序是从第 1 列还是第 8 列开始,但是从第 1 列开始的 prog 也可以遵循第 72 列之后的注释规则。

所以我试图找到允许我确定第 72 列之后的文本是注释还是有效代码的规则。

我找到了一些,但很难说它是否每次都有效:

  • 第 72 列后的点,确定句子的结尾,但我担心点也可以在评论中

  • 在第 72 列之后找到语句的结束字符:" ' ) }

  • 在第 71 - 72 - 73 列查找 char,如果没有空格,则查找整个单词,并检查它是关键字还是 var。问题,它可以是 COPY 中的 var 或替换等...

我想知道您对这些规则有何看法,以及您是否有任何想法可以帮助我确定 Cobol 程序的编码风格。

我不需要 API 或其他我可以依赖的可靠规则。

4

4 回答 4

2

我认为您需要了解每个程序的 COBOL 编译器。它的文档应该告诉您它使用哪些约定/配置/开关来决定源代码是否在第 72 列结束。

那么....哪个编译器?

如果您认为第 72 列的问题很麻烦,请等到您开始真正解析 COBOL 本身。如果你没有准备好处理语言的词汇问题,那么你可能没有准备好处理句法问题。

于 2012-05-23T21:01:59.080 回答
1

不会有一种算法可以 100% 确定地做到这一点,因为如果注释可以是任何东西,它们也可以是可编译的 COBOL 代码。所以理论上你可以编写一个程序,如果注释被忽略,则意味着一件事,如果注释被视为 COBOL 的一部分,则完全是另一回事。

但这极不可能。最有可能发生的是,如果您尝试在错误的约定下编译代码,它只会失败。因此,唯一准确的方法是尝试以一种方式编译/解析程序,如果遇到无法理解的行,请切换到另一种样式。当样式已知时,您还可以支持将参数传递给编译器。

您可以尝试使用您所描述的启发式方法,但这永远不会完全准确。他们能给你的最多的是代码是一种或另一种风格的可能性,随着他们检查越来越多的代码行,这种可能性会增加。它们可能有助于在开始编译之前帮助您猜测样式,或者用于确定问题何时真的只是代码中的拼写错误。

编辑:

关于启发式的想法,很难说。如果有类似//#其他语言的标准注释符号,这会容易得多(实际上,有,但听起来你的代码不遵循这个约定)。我唯一能想到的就是检查每一行(或者可能是 99% 的行,不计算空行或用 注释的行*)是否在位置 72 之前的某个地方有一个句点。

您不想做的一件事是将任何启发式方法应用于位置 72之后的部分。也就是说,您不想检查评论以查看它们是否是有效的 COBOL。您想首先检查您所知道的是 COBOL,然后看看它是否可以自行工作。有几个原因:

  • 用英文写的评论中可能有句号和引号,所以你的第一个和第二个要点都没有了。
  • 自然语言比 COBOL 更难解析。
  • 注释中很容易包含 COBOL(也许有人注释掉了该行的先前版本)。
  • 注释的一个重要规则是它们永远不应该影响程序的功能。如果更改注释可以更改程序的编译方式,那么您就违反了。

记住所有这些,我的意见是你根本不应该使用启发式方法。除非明确指定,否则您应该始终尝试在两种约定下编译程序。代码有可能在这两种约定下都成功编译,然后你将拥有两个不同的程序,并且无法判断哪个是正确的。

如果发生这种情况,您需要比较两个结果(可能使用哈希或其他东西)以查看它们是否是同一个程序。如果它们相同,那就太好了,但如果不是,则需要强制用户明确选择约定。

于 2012-05-23T21:21:51.593 回答
1

仅基于源代码,没有绝对可靠的方法来确定 COBOL 程序是固定格式还是自由格式。哎呀,有时很难仅根据源代码来识别编程语言。看看这个经典的多语言- 它在 8 种不同的语言编译器下有效。也就是说,您可以尝试一些可能会更频繁地产生正确答案的启发式方法。

嵌入在源代码中的编译器指令

注意确定代码格式的某些编译器指令。不幸的是,每个编译器供应商都使用自己的指令风格。

例如,Microfocus COBOL 使用该 SOURCEFORMAT指令。该指令将出现在程序顶部附近,因此可以使用简短的预扫描来找到它。另一方面,OpenCobol 使用>>SOURCE FORMAT IS FREE>>SOURCE FORMAT IS FIXED在自由格式和固定格式之间切换,同一程序的不同部分可以采用不同的格式!

这里的底线是您必须支持多个 COBOL 编译器的约定。

编译器开关

也可以使用编译器开关指定源代码格式。在这种情况下,没有具体的线索可以继续。但是,您可以合理地确定整个源程序将是固定的或免费的。你在这里能做的就是猜测。除非程序员想“弄乱你的脑袋”(有些人会这样),否则自由格式的程序将在第 8 列之前使用关键字IDENTIFICATION DIVISIONor ID DIVISION。每个 COBOL 程序都将以这些关键字开头,因此您可以将它们用作锚点在没有嵌入编译器指令的情况下确定代码格式的点。

警告 - 这远非万无一失,但可能是一个好的开始。

于 2012-05-24T15:55:28.790 回答
0

大多数 COBOL 编译器将允许您生成和分析后期文本操作阶段。

可以看到文本预处理器的输出(以 OpenCOBOL 为例)

cobc -E program.cob

文本操作处理器处理任何 COPY ... REPLACING 编译器指令,以及将 SOURCE FORMAT IS FIXED(包括行继续、字符串文字连接、注释行删除等)转换为编译器词法分析器的实际自由格式需要。许多 OpenCOBOL 工具包(Cross referencer 和 Animator,仅举两个例子)在预处理器通过之后使用源代码。如果您的解析器程序依赖于后处理的源代码文件,我认为您不会失去任何街头信誉。

于 2012-12-02T16:20:32.597 回答