我在javacc中使用此网站上的语法。除了一些图片陈述之外,它工作得很好。例如----,---,---。99或--9。
它似乎不喜欢多个破折号。
我需要在此更改以支持我的图片示例。
我和
搞混了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"])+)*
非常感谢你们迄今提供的帮助
答案 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短语合并到单词中。只需在解析器中解析它。