11

我们正在处理 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 字符,然后它的双字节性质就会丢失。如果你不能数对,你就找不到结束报价。如果找不到结尾引号,则无法识别文字。所以问题似乎是我们需要在词法分析过程中切换输入编码模式。玉。

4

2 回答 2

2

尝试在您的规则中添加一个单引号,以查看它是否通过进行此更改,

  <squote><squote> => <squote>{1,2}

如果我没记错的话,N 和 G 文字之间的一个区别是 G 允许单引号。您的正则表达式不允许这样做。

编辑:我以为你让所有其他 DBCS 文字都在工作,只是在 G-string 上有问题,所以我只是指出了 N 和 G 之间的区别。现在我仔细看看你的 RE。它有问题。在我使用的 Cobol 中,您可以将 ASCII 与日语混合,例如,

  G"ABC<ヲァィ&gt;" <> are Shift-out/shift-in

您 RE 仅假定 DBCS。我会放松这个限制,然后再试一次。

我认为不可能完全用正则表达式处理 G 文字。仅使用有限状态机无法跟踪匹配的报价和 SO/SI。你的 RE 非常复杂,因为它试图做不可能的事情。我只是简化它并手动处理不匹配的令牌。

您还可能面临编码问题。代码可以是 EBCDIC(片假名)或 UTF-16,将其视为 ASCII 将不起作用。SO/SI 有时会在 Windows 上转换为 0x1E/0x1F。

我只是想帮助您在没有看到实际代码的情况下在黑暗中拍摄:)

于 2009-09-15T01:50:30.760 回答
1

<NotLineOrParagraphSeparatorNorApostropheNorShiftInNorShiftOut> 是否还包括单引号和双引号,或者只是撇号?这将是一个问题,因为它会消耗文字结束字符序列 >' ...

我会检查所有其他宏的定义以确保。我能看到的唯一明显的问题是您似乎已经意识到的 <squote><squote> 。

于 2009-09-15T15:29:27.070 回答