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

时间:2009-09-09 05:08:33

标签: 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>"

其中&lt; name&gt;是一个宏,是另一个正则表达式。大概是他们 被命名得足够好,你可以猜出它们包含什么。

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

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

同样,可以明确地组合COBOL标识符 使用DBCS字符。究竟是什么允许标识符? 再一次,正则表达式将是理想的。

EDIT2:我开始认为问题可能不是RE。 我们正在阅读Shift-JIS编码的文本。我们的读者转换了 将文本转换为Unicode。但DBCS字符确实如此 不是Shift-JIS;相反,它们是二进制编码数据。容易 发生的事情是DBCS数据正在被翻译 好像它是Shift-JIS,这会破坏这种能力 识别“两个字节”作为DBCS元素。例如, 如果DBCS字符对是:81:1F,则为ShiftJIS读取器 将此对转换为单个Unicode字符, 然后它的双字节性质就会丢失。如果你不能数对, 你找不到最终报价。如果找不到最终报价, 你无法识别文字。所以问题会出现 我们需要在中间切换输入编码模式 lexing过程。育。

2 个答案:

答案 0 :(得分:2)

尝试在规则中添加单引号以查看是否通过进行此更改

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

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

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

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

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

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

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

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

答案 1 :(得分:1)

&lt; NotLineOrParagraphSeparatorNorApostropheNorShiftInNorShiftOut&gt;还包括单引号和双引号,还是只包含撇号?那将是一个问题,因为它会消耗文字结束字符序列&gt;' ...

我会检查所有其他宏的定义以确保。我能看到的唯一明显的问题是&lt; squote&gt;&lt; squote&gt;你似乎已经意识到了。