2

COBOL プログラムから情報を抽出する必要があります。COBOL の ANTLR 文法を使用しています。グループ変数全体を抽出する必要があります。パーサーはすべての変数の細分化/グループ項目を個々の要素として抽出するため、ANTLR でこれを抽出することはできません。グループアイテムをまとめて取得する必要があります。私は COBOL を初めて使用するので、どの要素をグループに含め、どこで停止するかをコンパイラがどのように理解するかを理解したいと考えています。

元:

  01 EMPREC.
  02 EEMPNAME.
  10 FIRSTNAME PIC X(10)
  10 LASTNAM PIC X(15)

  07 SNO PIC X(15)

上記の定義は有効ですか?コンパイラは、別の 01 または 77 に遭遇するまで、最初の項目 (01 EMPREC) の後にすべての要素 (=>2 および <=49) をグループ EMPREC に含めますか? これは想定しても安全ですか?レベル情報は、どの要素がグループに分類されるかを導き出すのに十分ですか? 任意のポインタをいただければ幸いです。

4

4 に答える 4

4

私は、ANTLR4 grammars プロジェクトで見つけた COBOL ANTLR4 文法の作成者です。COBOL 文法は、抽象構文ツリー (AST) のみを生成します。

対照的に、求めているのは抽象セマンティック グラフ (ASG) です。これは、変数のグループ化と、AST 要素間の一般的な関係を表します。

このような ASG は、私のproleap-cobol-parserプロジェクトの COBOL パーサーによって生成されます。このプロジェクトは、前述の COBOL 文法を使用して、AST 要素間の関係を解決します。

データ記述エントリを解析する例は、この単体テストにあります。

于 2016-11-25T20:49:17.400 に答える
3

実際には次の 2 つの質問がありました。

「[...] の定義は有効ですか?」いいえ、以前のレベル 07 がないため、そうではありません。 EEMPNAMEto07またはSNOtoのレベルを変更する02と有効になります。グループ アイテムにはUSAGE節があっても、 はありませんPICTURE

これは、「どの要素をグループに含め、どこで停止するかをコンパイラがどのように理解しているかを理解したい」という疑問につながります。

変数と一緒にレベル番号を保存する必要があります。グループの一部を知りたい場合は、このレベルと以下のすべてを確認する必要があります。完全なレベル 02 グループをチェックする場合は、次のレベル 02 またはそれ以上のレベル (この場合は 01) に到達するまで、以下のより高いレベル番号を持つ変数のみを使用します。同じレベルの次の変数にREDEFINESin があるかどうかを確認します。この場合、同じグループに属しています (ストレージに関して)。同様のことがレベル 66 にも当てはまります (名前の変更、独自のストレージはありません)。

レベル 88 にもストレージはありません。これは、実行する解析に応じた検証エントリ用であり、無視することができます。重要: レベル 88 はサブアイテムを作成しません。後で複数のサブアイテムとそれよりも低いレベル番号を持つことができます。

常に新しいアイテムを定義するレベル番号は 01 で、拡張子は 66、77、および 78 です。

01 vargroup.
   02 var-1  pic 9.
      88  var-is-even  values 0, 2, 4 6 8   . 
      88  var-is-not-even  values 1 3 5 7 9. 
      88  var-is-big   value 6 thru 9.
   02 var-2  pic x.
   01 new-var pic x.
   77 other-var  pic 9.

必要に応じて、いくつかの COBOL ソースを読み、新しい質問を考え出すことをお勧めします。たとえば、CBL_OC_DUMP

于 2016-11-25T12:01:22.163 に答える
0

COBOL を始めてからかなり時間が経ちましたが、私の記憶が正しければ、かなり多くの問題があります。

1) 01 レベルは常に 8 列目から始まります。05 my-name pic x(30) 値スペース。05 my-address1 pic x(40) 値スペース。3) 私が考えていた 77 レベルは、メモリを効率的に使用していないため、現在は廃止されています。また、77 レベルを使用する場合は、常に作業用ストレージ セクションの先頭で定義する必要があります。write from と read into を使用しない限り、明らかにレコード レイアウトはファイル セクションで定義されますか?

4) new-var pic x をたくさん定義している場合。それぞれに新しい 01 レベルを使用しないでください。

01 ws フラグ。05 ws_flag1 pic x 値スペース。05 ws_flag2 pic x 値スペース。

COBOL マニュアルについては、Stern & Stern を試してください。

お役に立てれば!

于 2016-12-12T15:34:42.183 に答える