我们正在处理 IBMEnterprise 日语 COBOL 源代码。
准确描述 G 类型文字中允许的内容以及标识符允许的内容的规则尚不清楚。
IBM 手册指出 G'....' 文字必须将 SHIFT-OUT 作为引号内的第一个字符,并将 SHIFT-IN 作为结束引号之前的最后一个字符。我们的 COBOL 词法分析器“知道”这一点,但在实际代码中发现了 G 字面量的对象。结论:IBM手册是错误的,或者我们误读了它。客户不会让我们看到代码,因此很难诊断问题。
编辑:为清楚起见,在文本下方进行了修订/扩展:
有谁知道 G 文字形成的确切规则,以及它们如何(不)与 IBM 参考手册所说的相匹配?理想的答案是 G 文字的正则表达式。这就是我们现在使用的(由另一位作者编码,叹息):
#token non_numeric_literal_quote_g [STRING]
"<G><squote><ShiftOut> (
(<NotLineOrParagraphSeparatorNorShiftInNorShiftOut>|<squote><squote>|<ShiftOut>)
(<NotLineOrParagraphSeparator>|<squote><squote>)
| <ShiftIn> ( <NotLineOrParagraphSeparatorNorApostropheNorShiftInNorShiftOut>|
<ShiftIn>|<ShiftOut>)
| <squote><squote>
)* <ShiftIn><squote>"
其中 <name> 是一个宏,它是另一个正则表达式。大概它们的命名足够好,因此您可以猜测它们包含什么。
这是IBM Enterprise COBOL 参考。第 3 章“字符字符串”,副标题“DBCS 文字”第 32 页是相关阅读。我希望通过提供准确的参考资料,有经验的 IBM 人员可以告诉我们我们是如何误读它的:-{ 我特别不清楚“DBCS 字符”这个短语是什么意思,当它说“范围内的一个或多个字符”时X'00...X'FF for any byte" DBCS 字符除了成对的 8 位字符代码外,怎么可能是什么?如果您检查现有的 RE 匹配 3 种类型的字符对。
下面的一个答案表明 <squote><squote> 配对是错误的。好的,我可能相信,但这意味着 RE 只会拒绝包含单个 <squote> 的文字字符串。我不相信这是我们遇到的问题,因为我们似乎绊倒了 G 文字的每个实例。
类似地,COBOL 标识符显然可以由 DBCS 字符组成。标识符允许什么,究竟是什么?同样,正则表达式将是理想的。
EDIT2:我开始认为问题可能不是RE。我们正在阅读 Shift-JIS 编码的文本。我们的阅读器将文本转换为 Unicode。但是 DBCS 字符真的不是 Shift-JIS;相反,它们是二进制编码的数据。可能正在发生的事情是 DBCS 数据被翻译为好像它是 Shift-JIS 一样,这会破坏将“两个字节”识别为 DBCS 元素的能力。例如,如果 DBCS 字符对是 :81 :1F,则 ShiftJIS 读取器会将这对字符转换为单个 Unicode 字符,然后它的双字节性质就会丢失。如果你不能数对,你就找不到结束报价。如果找不到结尾引号,则无法识别文字。所以问题似乎是我们需要在词法分析过程中切换输入编码模式。玉。