0

我在我的 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"])+)*

非常感谢到目前为止的帮助

4

2 回答 2

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是分隔符 - 它不是图片字符串的一部分。但是后面的逗号DISP-NBR-4是图片字符串的一部分,因为它后面没有空格。

欢迎来到 COBOL!

于 2011-09-27T15:51:24.383 回答
0

我发现当我得到 PICTURE 时,我必须将词法分析器切换到另一种模式。COBOL PICTURE 字符串具有与其他语言完全不同的“词汇”,您必须阻止杠杆使用句点、逗号等进行任何操作,而不是将它们累积到图片字符串中。有关了解何时停止图片扫描的一些示例,请参阅 NealB 的答案。

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

于 2012-05-06T01:04:26.330 回答