unicode - 日本 COBOL 代码 : rules for G literals and identifiers?

标签 unicode cobol literals

我们正在处理 IBM Enterprise 日语 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>"

其中 是一个宏,它是另一个正则表达式。想必他们
命名得足够好,因此您可以猜出它们包含什么。

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

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

类似地,COBOL 标识符可以明显地组成
带有 DBCS 字符。标识符到底允许什么?
同样,正则表达式将是理想的。

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

最佳答案

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

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

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

编辑:我以为你让所有其他 DBCS 文字都可以工作,只是在 G 字符串方面有问题,所以我只是指出了 N 和 G 之间的区别。现在我仔细看看你的 RE。它有问题。在我使用的 Cobol 中,您可以将 ASCII 与日语混合,例如,
  G"ABC<ヲァィ>" <> are Shift-out/shift-in

您 RE 仅承担 DBCS。我会放宽这个限制,然后再试一次。

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

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

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

关于unicode - 日本 COBOL 代码 : rules for G literals and identifiers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1397646/

相关文章:

perl - Perl 中元音变音 "ü"的正确存储值是多少?

file - 具有可变记录长度的 Cobol 索引文件

file - 使用 COBOL 将 Unicode 字符串写入文件

c++ - C++11中是否需要u8字符串文字

php - 在 PHP 中将数字文字与数组一起使用 (preg_replace)

android - 如何检查任何设备是否支持表情符号?

正则表达式匹配所有 unicode 引号

数字文字后面的 C# 后缀

javascript - 如何将表情符号字符写入文本区域

Cobol 作用域终止符