这个cobol语法不处理--9图片

时间:2011-09-27 15:01:37

标签: cobol bnf javacc ebnf

我在javacc中使用此网站上的语法。除了一些图片陈述之外,它工作得很好。例如----,---,---。99或--9。

  

http://mapage.noos.fr/~bpinon/cobol.jj

它似乎不喜欢多个破折号。

我需要在此更改以支持我的图片示例。

我和

搞混了
void NumericConstant() :
{}
{
  (<PLUSCHAR>|<MINUSCHAR>)? IntegerConstant() [ <DOTCHAR> IntegerConstant() ]
} 

但似乎没有任何效果。非常感谢任何帮助

编辑:

<COBOL_WORD: ((["0"-"9"])+ (<MINUSCHAR>)*)*
    (["0"-"9"])* ["a"-"z"] ( ["a"-"z","0"-"9"] )*
    ( (<MINUSCHAR>)+ (["a"-"z","0"-"9"])+)*
>

这是整行的正则表达式:

07 STRINGFIELD2 PIC AAAA. ??

如果我想接受05 TEST3 REDEFINES TEST2 PIC X(10).,我会将正则表达式更改为:

<COBOL_WORD: ((["0"-"9"])+ (<MINUSCHAR>)*)*
(<REDEFINES> (["0"-"9"])* ["a"-"z"] ( ["a"-"z","0"-"9"] )*)?
    (["0"-"9"])* ["a"-"z"] ( ["a"-"z","0"-"9"] )*
    ( (<MINUSCHAR>)+ (["a"-"z","0"-"9"])+)*

非常感谢你们迄今提供的帮助

2 个答案:

答案 0 :(得分:1)

为什么在尝试解析时遇到NumericConstant() COBOL PICTURE字符串?

根据你所拥有的JavaCC来源,COBOL PICTURE应解析:

void DataPictureClause() :
{}
{
  ( <PICTURE> | <PIC> ) [ <IS> ] PictureString()
}

--9位是图片字符串,应该使用PictureString()函数进行解析:

void PictureString() :
{}
{
    [ PictureCurrency() ]
    ( ( PictureChars() )+ [ <LPARENCHAR> IntegerConstant() <RPARENCHAR> ] )+
    [ PicturePunctuation() ( ( PictureChars() )+ [ <LPARENCHAR> IntegerConstant() <RPARENCHAR> ] )+ ]
}

PictureCurrency()显示为空,请转到PictureChars()

void PictureChars() :
{}
{
    <INTEGER> | <COBOL_WORD>
}

COBOL_WORD似乎不支持许多“有趣”的有效PICTURE子句定义:

<COBOL_WORD: ((["0"-"9"])+ (<MINUSCHAR>)*)*
    (["0"-"9"])* ["a"-"z"] ( ["a"-"z","0"-"9"] )*
    ( (<MINUSCHAR>)+ (["a"-"z","0"-"9"])+)*
>

解析COBOL并不容易,事实上它可能是构建高质量解析器的最困难的语言之一 对于。我现在可以告诉你了 你工作的JavaCC源代码不会削减它 - 除了一些非常简单和可能的 完全是人为的COBOL程序示例。

回答评论

COBOL图片字符串往往会弄乱最好的解析器。你是减号 遇到麻烦只是冰山一角!图片字符串 很难 解析因为句号和逗号 可能是图片字符串的一部分,但在字符串之外用作分隔符。这意味着 解析器无法以上下文无关的方式明确地对句点或逗号进行分类。他们需要 “了解”遇到它的上下文。这可能听起来微不足道,但事实并非如此。

从技术上讲,分隔符句点和逗号后面必须跟一个空格(或行尾)。这个 由于图片字符串,很少有事实可以确定句点/逗号角色非常简单 不能包含空格。但是很多 商业COBOL编译器是“智能”足够正确识别分隔符周期/逗号 没有空格。 所以 有很多COBOL程序员编写非法分隔符句点/逗号,这意味着你 可能要处理它们。

最重要的是,无论你做什么,那些小的图片串都会发生 困扰你他们需要付出相当大的努力来处理。

只是一些未来的事情,你将如何解析以下内容:

01 DISP-NBR-1 PIC -99,999.
01 DISP-NBR-2 PIC -99,999..
01 DISP-NBR-3 PIC -99,999, .
01 DISP-NBR-4 PIC -99,999,. 

DISP-NBR-1后的句号终止图片字符串。这是一个分隔期。该 DISP-NBR-2后面的句点是字符串的一部分,第二个句点是分隔符。逗号 以下DISP-NBR-3是分隔符 - 它不是Picture字符串的一部分。但是逗号 以下DISP-NBR-4是图片字符串的一部分,因为它后面没有空格。

欢迎来到COBOL!

答案 1 :(得分:0)

我发现当我得到PICTURE时,我必须将词法分析器切换到另一种模式。 COBOL PICTURE字符串与其他语言完全不同的“词汇”,你必须阻止杠杆用句号,逗号等做任何事情,除了将它们累积到图片字符串中。有关知道何时停止图片扫描的一些示例,请参阅NealB的答案。

我不知道为什么要将REDEFINES短语合并到单词中。只需在解析器中解析它。