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 の構文解析は簡単ではありません。実際、高品質のパーサーを構築するのが最も難しい言語の 1 つです。あなたが作業している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
は、Picture 文字列を終了します。区切りの時期です。次のピリオドDISP-NBR-2
は文字列の一部で、2 番目のピリオドは区切り文字です。次のコンマDISP-NBR-3
は区切り記号です。ピクチャ文字列の一部ではありません。DISP-NBR-4
ただし、その後にスペースがないため、次のコンマはピクチャ文字列の一部です。
コボルへようこそ!