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

Unicode 日语COBOL代码:G文本和标识符的规则?,unicode,cobol,literals,Unicode,Cobol,Literals,我们正在处理IBMEnterprise日语COBOL源代码 准确描述G类型文字中允许的内容的规则, 标识符允许使用什么也不清楚 IBM手册指出,G'..'文字 引号中的第一个字符必须是SHIFT-OUT, 并在结束引号前的最后一个字符中输入一个SHIFT-IN。 我们的COBOL lexer“知道”这一点,但对象是G文本 在真实代码中找到。结论:IBM手册是错误的, 或者我们误读了它。客户不让我们看代码, 所以很难诊断这个问题 编辑:为清晰起见,修订/扩展以下文本: 有人知道G字的确切规则吗,

我们正在处理IBMEnterprise日语COBOL源代码

准确描述G类型文字中允许的内容的规则, 标识符允许使用什么也不清楚

IBM手册指出,G'..'文字 引号中的第一个字符必须是SHIFT-OUT, 并在结束引号前的最后一个字符中输入一个SHIFT-IN。 我们的COBOL lexer“知道”这一点,但对象是G文本 在真实代码中找到。结论:IBM手册是错误的, 或者我们误读了它。客户不让我们看代码, 所以很难诊断这个问题

编辑:为清晰起见,修订/扩展以下文本:

有人知道G字的确切规则吗, 以及它们如何(不)符合IBM参考手册所说的内容? 理想的答案是G文本的正则表达式。 这就是我们现在正在使用的(由另一位作者编写,叹气):

#标记非数字文字[字符串]
" (  
(||)  
(|)
|  ( |
|)
| 
)* "
其中是另一个正则表达式的宏。大概是吧 名称足够好,因此您可以猜出它们包含什么

这是你的电话号码。 第3章“字符串”,第32页副标题“DBCS文字”为相关阅读。 我希望通过提供确切的参考资料,一位有经验的IBM人可以告诉我们我们是如何误读它的:{我特别不清楚“DBCS字符”这个短语的含义 当它说“任意字节的一个或多个字符在X'00…X'FF范围内” DBCS字符怎么可能不是一对8位字符代码? 如果进行检查,现有的重新匹配3种类型的字符对

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

类似地,COBOL标识符显然可以组合 使用DBCS字符。标识符允许使用什么? 同样,正则表达式也是理想的

EDIT2:我开始认为问题可能不在于RE。 我们正在读取Shift JIS编码的文本。我们的阅读器将其转换 文本转换为Unicode。但DBCS字符实际上是 不是Shift-JIS,而是二进制编码的数据 现在发生的是DBCS数据正在被转换 就好像它是轮班JIS,那会弄糟它的能力 将“两个字节”识别为DBCS元素。例如, 如果DBCS字符对为:81:1F,则为ShiftJIS读取器 将此对转换为单个Unicode字符, 然后它的两个字节的性质就消失了如果你不能数对, 找不到结束引号。如果找不到结束引号, 您无法识别文字。因此问题会出现 我们需要在中间切换输入编码模式
试着在规则中添加一个引号,看看它是否通过了此更改

  <squote><squote> => <squote>{1,2}
=>{1,2}
如果我没记错的话,N和G文本之间的一个区别是G允许单引号,而正则表达式不允许

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

  G"ABC<ヲァィ>" <> are Shift-out/shift-in
G“ABC”是移出/移入
您仅重新假定DBC。我将取消此限制并重试

我不认为完全用正则表达式处理G文本是可能的。单用有限状态机无法跟踪匹配的引号和SO/SI。您的RE非常复杂,因为它试图做不可能的事情。我只想简化它并手动处理不匹配的标记

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

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

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


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

您是指开头还是结尾的引号?中间字符串中的squote对旨在表示中间字符串中的squote,而不是开头或结尾的squote。我会仔细检查语法,但你确定吗?根据我的记忆,你不需要在G-string中转义中间字符串引号。对于N-string,你需要将它加倍,这样你的规则就是N-string。我几年前扔掉了我的手册,所以我无法证实这一点。啊,曙光开始亮了。为了帮助你,我指向手册,这样你就可以再次阅读它了。咧嘴笑;我也重新开始重组后,我必须让它更容易理解,但没有改变它。手册中关于G文本中的引号显然是安静的,但它显然没有说它们应该加倍,所以我将在这一部分假设你是正确的(勾选!).对我的修订文本有任何进一步的评论吗?IBM手册明确规定G文本必须以shift in和shift out开始和结束。您的示例表明手册的一部分是错误的(即使意图良好,但它应该是参考手册)。其他(非特殊)根据手册,字符串文字可以按照您所展示的方式混合DBC和SBC。我们在Shift JIS中看到了代码,但我们的工具在内部将其转换为Unicode。我将检查SI和SO字符是如何映射的。您确定您正确阅读了手册吗?它可能说DBC必须正确
  G"ABC<ヲァィ>" <> are Shift-out/shift-in