日语COBOL代码:G文字和标识符的规则?

Ira*_*ter 11 unicode cobol literals

我们正在处理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>"
Run Code Online (Sandbox Code Playgroud)

其中<name>是另一个正则表达式的宏.据推测,它们的名字足够好,所以你可以猜出它们包含的内容.

这是IBM Enterprise COBOL Reference.第3章"字符串",副标题"DBCS文字"第32页是相关阅读.我希望通过提供准确的参考,经验丰富的IBM员工可以告诉我们我们如何误读它: - {我特别不清楚"DBCS-characters"这个短语在什么时候表示" 该范围内有一个或多个字符 "对于任一字节,X'00 ...... X'FF"除了8位字符代码对之外,DBCS字符怎么样?如果你检查它,现有的RE匹配3种类型的字符对.

下面的一个答案表明<squote> <squote>配对是错误的.好吧,我可能会相信,但这意味着RE只会拒绝包含单个<squote>的文字字符串.我不相信这是我们遇到的问题,因为我们似乎绊倒了G字面的每个实例.

类似地,COBOL标识符可以用DBCS字符组成.究竟是什么允许标识符?同样,正则表达式将是理想的.

编辑2:我开始认为问题可能不是RE.我们正在阅读Shift-JIS编码的文本.我们的读者将该文本转换为Unicode.但是DBCS字符实际上不是Shift-JIS; 相反,它们是二进制编码数据.可能正在发生的事情是DBCS数据被翻译为就像它是Shift-JIS一样,这会破坏将"两个字节"识别为DBCS元素的能力.例如,如果DBCS字符对是:81:1F,则ShiftJIS读取器会将此对转换为单个Unicode字符,然后丢失其双字节性质.如果您不能计算对,则无法找到最终报价.如果找不到最终引用,则无法识别文字.所以问题似乎是我们需要在lexing过程中切换输入编码模式.育.

ZZ *_*der 2

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

\n\n
  <squote><squote> => <squote>{1,2}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n
  G"ABC<\xef\xbd\xa6\xef\xbd\xa7\xef\xbd\xa8>" <> are Shift-out/shift-in\n
Run Code Online (Sandbox Code Playgroud)\n\n

您 RE 假定仅使用 DBCS。我会放松这个限制并重试。

\n\n

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

\n\n

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

\n\n

我只是想帮助你在黑暗中拍摄而不看到实际的代码:)

\n