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!