2

Cobol プログラムを解析するアプリケーションを開発しています。これらのプログラムでは、従来のコーディング スタイル (列 8 から 72 までのプログラム テキスト) を尊重するものもあれば、より新しく、このスタイルに従わないものもあります。

私のアプリケーションでは、72 列目以降のコンテンツを解析する必要があるかどうかを判断するために、コーディング スタイルを決定する必要があります。

プログラムが 1 桁目か 8 桁目から始まるかどうかは判別できましたが、1 桁目で始まるプログラムは 72 桁目以降のコメントのルールに従うこともできます。

そのため、72 列目以降のテキストがコメントか有効なコードかを判断できるルールを見つけようとしています。

私はいくつか見つけましたが、それが毎回うまくいくかどうかを判断するのは難しいです:

  • 列 72 の後のドットは、文の終わりを決定しますが、コメントにもドットが含まれている可能性があるのではないかと心配しています

  • 列 72 の後のステートメントの終了文字を見つけます。" ' ) }

  • 列 71 - 72 - 73 で char を探します。スペースがない場合は、単語全体を見つけて、それがキーワードか var かを確認します。問題、それはCOPYまたは置換などからのvarである可能性があります...

これらの規則についてどう思われますか、また、COBOL プログラムのコーディング スタイルを決定するのに役立つアイデアがあれば教えてください。

API など、信頼できる確固たるルールは必要ありません。

4

4 に答える 4

2

各プログラムのCOBOLコンパイラを知る必要があると思います。そのドキュメントには、ソース コードが 72 列目で終了するかどうかを決定するために使用する規則/構成/スイッチが記載されているはずです。

それで....どのコンパイラですか?

列 72 の問題が面倒だと思われる場合は、実際に COBOL 自体を解析できるようになるまで待ってください。言語の字句の問題を処理する準備が整っていない場合は、構文の問題を処理する準備ができていない可能性があります。

于 2012-05-23T21:01:59.080 に答える
1

これを100%確実に行うアルゴリズムはありません。コメントが何であっても、コンパイル可能なCOBOLコードである可能性があるためです。したがって、理論的には、コメントが無視された場合に1つのことを意味し、コメントがCOBOLの一部として扱われた場合に完全に別のことを意味するプログラムを作成できます。

しかし、それは非常にありそうにありません。最も起こりそうなことは、間違った規則の下でコードをコンパイルしようとすると、単に失敗するということです。したがって、これを行う唯一の正確な方法は、プログラムを一方向にコンパイル/解析してみることです。意味をなさない行に到達した場合は、別のスタイルに切り替えてください。スタイルがすでにわかっている場合は、コンパイラへの引数の受け渡しをサポートすることもできます。

説明したようなヒューリスティックを使用してみることができますが、それが完全に正確になることはありません。彼らがあなたに与えることができる最も多くは、コードがどちらかのスタイルである確率であり、それは彼らがより多くのコード行を調べるにつれて増加します。これらは、コンパイルを開始する前にスタイルを推測するのに役立つ場合や、問題が実際にコードのタイプミスである場合を把握する場合に役立ちます。

編集:

ヒューリスティックのアイデアに関しては、言うのは難しいです。//のような、または他の言語の標準的なコメントシジルがあった場合#、これははるかに簡単になります(実際にはありますが、コードがこの規則に準拠していないようです)。私が考えることができる唯一のことは、すべての行(または行の99%で、空の行やコメント付きの行を数えない*)に72桁目の前にピリオドがあるかどうかを確認することです。

実行したくないことの1つは、位置72以降の部分にヒューリスティックを適用することです。つまり、コメントをチェックして、それらが有効なCOBOLであるかどうかを確認する必要はありません。最初にCOBOLであることがわかっていることを確認し、それが単独で機能するかどうかを確認します。これにはいくつかの理由があります。

  • 英語で書かれたコメントにはピリオドと引用符が含まれている可能性が高いため、最初と2番目の箇条書きが出ています。
  • 自然言語は、COBOLのようなものよりも解析がはるかに困難です。
  • コメントには、簡単にCOBOLを含めることができます(前のバージョンの行を誰かがコメントアウトした可能性があります)。
  • コメントの重要なルールは、プログラムの動作に影響を与えてはならないということです。コメントを変更すると、プログラムのコンパイル方法が変わる可能性がある場合は、違反します。

そのすべてを念頭に置いて、私の意見では、ヒューリスティックをまったく使用しないでください。明示的に指定されていない限り、常に両方の規則に従ってプログラムをコンパイルするようにしてください。両方の規則でコードが正常にコンパイルされる可能性があります。そうすると、2つの異なるプログラムが作成され、どちらが正しいかを判断する方法がなくなります。

その場合は、2つの結果を(おそらくハッシュなどで)比較して、それらが同じプログラムであるかどうかを確認する必要があります。それらが同じである場合は素晴らしいですが、そうでない場合は、ユーザーに規則を明示的に選択するように強制する必要があります。

于 2012-05-23T21:21:51.593 に答える
1

ソース コードのみに基づいて、COBOL プログラムが固定形式か自由形式かを判断する絶対的に信頼できる方法はありません。ソースコードだけに基づいてプログラミング言語を特定するのは難しい場合があります。このクラシックなポリグロットをチェックしてください。これは、8 つの異なる言語コンパイラで有効です。とはいえ、より頻繁に正しい答えを導き出す可能性のあるいくつかのヒューリスティックを試すことができます。

ソースコードに埋め込まれたコンパイラ指令

コード形式を決定する特定のコンパイラ ディレクティブに注意してください。残念ながら、すべてのコンパイラ ベンダーは独自のディレクティブを使用しています。

たとえば、Microfocus COBOL は SOURCEFORMATディレクティブを使用します。このディレクティブはプログラムの上部近くに表示されるため、短いプレスキャンを使用して見つけることができます。一方、OpenCobol は>>SOURCE FORMAT IS FREE>>SOURCE FORMAT IS FIXEDを使用して、フリー フォーマットと固定フォーマットを切り替えます。同じプログラムのさまざまな部分を異なるフォーマットにすることができます。

ここでの結論は、複数の COBOL コンパイラの規則をサポートする必要があるということです。

コンパイラ スイッチ

コンパイラ スイッチを使用して、ソース コードの形式を指定することもできます。この場合、続行するための具体的な手がかりはありません。ただし、ソース プログラム全体が修正済みまたはフリーのいずれかであるということは十分に確信できます。ここでできるのは推測だけです。プログラマーが「頭をいじる」つもりがない限り (そしてそうする人もいます)、自由形式のプログラムにはキーワードIDENTIFICATION DIVISIONorがありID DIVISION、列 8 の前から始まります。すべての COBOL プログラムはこれらのキーワードで始まるため、それらをアンカーとして使用できます。コンパイラ指令が組み込まれていない場合のコード形式を決定するためのポイント。

警告 - これは絶対確実というわけではありませんが、良い出発点になるかもしれません。

于 2012-05-24T15:55:28.790 に答える
0

ほとんどのCOBOLコンパイラでは、テキスト操作後のフェーズを生成および分析できます。

テキストプリプロセッサの出力を確認できます(例としてOpenCOBOLを使用)

cobc -E program.cob

テキスト操作プロセッサは、COPY ... REPLACINGコンパイラディレクティブを処理し、SOURCE FORMAT IS FIXED(行の継続、文字列リテラルの連結、コメント行の削除など)をコンパイラの字句解析器が実際の自由形式に変換します。ニーズ。多くのOpenCOBOLツールキット(2つ挙げるとCross referencerとAnimator)は、プリプロセッサパスの後にソースコードを使用します。パーサープログラムが後処理されたソースコードファイルに依存している場合、ストリートの信用を失うことはないと思います。

于 2012-12-02T16:20:32.597 に答える