我正在开发一个解析Cobol程序的应用程序。在这些程序中,有些人尊重传统的编码风格(第8列到第72列的程序文本),有些是较新的,不遵循这种风格。
在我的应用程序中,我需要确定编码样式,以便知道我是否应该在第72列之后解析内容。
我已经能够确定程序是从第1列还是第8列开始,但从第1列开始的prog也可以遵循第72列之后的注释规则。
所以我试图找到允许我确定第72列之后的文本是评论还是有效代码的规则。
我找到了一些,但很难说它是否会每次都有效:
在第72列之后点,确定句末但我担心点也可以在评论中
在第72列后找到对帐单的关闭字符:" ' ) }
在第71-72-73栏查找字符,如果没有空格则找到整个单词,并检查它是关键字还是变量。问题,它可以是来自COPY或替换等的变量......
我想知道您对这些规则的看法以及是否有任何想法可以帮助我确定Cobol计划的编码风格。
我不需要API,也不需要我能够依赖的可靠规则。
答案 0 :(得分:2)
我认为你需要知道每个程序的COBOL编译器。它的文档应该告诉你它使用什么约定/配置/开关来决定源代码是否在第72列结束。
那么....哪个编译器?
如果您认为第72列问题很痛苦,请等到您实际解析COBOL本身。如果你还没有准备好处理语言的词汇问题,你可能已经非常准备好处理语法问题了。
答案 1 :(得分:1)
没有算法可以100%确定地执行此操作,因为如果注释可以是任何内容,它们也可以是可编译的COBOL代码。因此,理论上你可以编写一个程序,如果注释被忽略则意味着一件事,如果注释被视为COBOL的一部分则完全不同。
但这种可能性极小。最有可能发生的是,如果您尝试在错误的约定下编译代码,它将失败。因此,唯一准确的方法是尝试以一种方式编译/解析程序,如果你找到一条无法理解的行,请切换到另一种样式。当样式已知时,您还可以支持将参数传递给编译器。
您可以尝试使用您所描述的启发式方法,但这绝不会完全准确。他们能给你的最多的是概率,代码是一种或另一种风格,随着它们检查越来越多的代码行,这种风格会增加。在开始编译之前,它们可以帮助您猜测样式,或者用于确定问题何时只是代码中的拼写错误。
关于启发式的想法,很难说。如果在其他语言中有//
或#
等标准评论符号,则会更容易(actually, there is,但听起来您的代码不符合此惯例)。我唯一能想到的就是检查每一行(或者99%的行,不计算空行或用*
注释的行)是否在第72位之前的某个地方有一段时间。
您不想做的一件事是将任何启发式方法应用于位置72之后的部分。也就是说,您不希望检查注释以查看它们是否有效COBOL。您想先检查知道的内容是否为COBOL,然后查看它是否有效。这有几个原因:
考虑到这一点,我的意见是你根本不应该使用启发式方法。除非明确指定,否则应始终尝试在两种约定下编译程序。代码可以在两种约定下成功编译,然后你将有两个不同的程序,无法分辨哪一个是正确的。
如果发生这种情况,您需要比较两个结果(可能使用哈希或其他内容)来查看它们是否是同一个程序。如果它们是相同的,那么很好,但如果不是,则需要强制用户明确选择约定。
答案 2 :(得分:1)
没有绝对可靠的方法来确定是否有COBOL程序 是基于源代码的固定或自由格式。哎,有时很难识别 编程语言仅基于源代码。查看 这个经典polyglot - 它在8种不同的语言编译器下有效。那 说,你可以尝试一些可能产生的启发式方法 正确的答案往往是。
源代码中嵌入的编译器指令
请注意确定代码格式的某些编译器指令。 不幸的是,每个编译器供应商都使用他们自己的指令风格。
例如,Microfocus COBOL使用
SOURCEFORMAT
指令。该指令将出现在程序顶部附近,因此预扫描很短
可以用来找到它。另一方面,OpenCobol使用>>SOURCE FORMAT IS FREE
和
>>SOURCE FORMAT IS FIXED
在自由格式和固定格式之间切换,同一程序的不同部分
格式可能不同!
这里的底线是你必须支持多个COBOL编译器的约定。
编译器开关
也可以使用编译器开关指定源代码格式。在这种情况下,没有具体的
线索继续下去。但是,您可以合理地确定整个源程序也是如此
固定或免费。你在这里所能做的只是猜测。除非程序员外出“乱七八糟”
你的头脑“(和一些意志),免费格式的程序将在第8列之前开始使用关键字IDENTIFICATION DIVISION
或ID DIVISION
。
每个COBOL程序都将以这些关键字开头,因此您可以将它们用作确定代码格式的锚点
没有嵌入的编译器指令。
警告 - 这远非傻瓜证明,但可能是一个好的开始。
答案 3 :(得分:0)
大多数COBOL编译器都允许您生成和分析后文本操作阶段。
可以看到文本预处理器输出(使用OpenCOBOL作为示例)
cobc -E program.cob
文本操作处理器处理任何COPY ... REPLACING编译器指令,以及将SOURCE FORMAT IS FIXED(带行连续,字符串文字连接,注释行删除等)转换为实际的自由格式编译器词法分析器需要。很多OpenCOBOL工具包(交叉引用器和Animator,两个名称)在预处理器传递之后使用源代码。如果你的解析器程序依赖于经过后处理的源代码文件,我认为你不会失去任何街头信誉。