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 の構文解析は簡単ではありません。実際、高品質のパーサーを構築するのが最も難しい言語の 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ただし、その後にスペースがないため、次のコンマはピクチャ文字列の一部です。

コボルへようこそ!

于 2011-09-27T15:51:24.383 に答える
0

PICTURE を取得したときに、レクサーを別のモードに切り替える必要があることがわかりました。COBOL PICTURE 文字列は、言語の残りの部分とは完全に異なる「字句」を持っているため、レバーがピリオドやコンマなどをピクチャ文字列に蓄積する以外のことをしないようにする必要があります。画像スキャンを停止するタイミングを知る例については、NealB の回答を参照してください。

REDEFINES 句を単語に組み込みたい理由がわかりません。パーサーで通常どおり解析するだけです。

于 2012-05-06T01:04:26.330 に答える