COBOL Parser、ちゃんと選んでいますか？

# １．はじめに

筆者は社内のCOBOL解析プラグイン開発のプロジェクトにて、代表的な複数のCOBOL Parser / Parser Generatorについて調査し相違点を比較して、その結果**Koopa (COBOL) Parser Generatorを採用**しました。
本記事では代表的なCOBOL Parser Generatorおよびそれらの選定過程について紹介しております。
今回の目的は、多数のCOBOL Parser Generatorの中のどれを利用すれば良いかがわからない方々に向けて、選ぶ判断基準の材料を提供することです。

[経済産業省のDXレポート](https://www.meti.go.jp/shingikai/mono_info_service/digital_transformation/pdf/20180907_01.pdf)によれば、「2025年の崖」とは、既存システムの維持管理費がIT予算の9割になると言われています。この技術的負債により最大12兆円/年の経済損失が発生する可能性があると言われています。
[Micro Focus社が発表したプレスリリース](https://www.microfocus.co.jp/about/news/press/2022/0216/)によれば、COBOLで稼働するシステムは減少傾向にはなく、むしろ存在しているCOBOLコードは現時点では世界で過去最高の8,000億行にのぼっていると言われています。そのため、作り変えるのではなく、技術的負債にならないように保守性を高めて継続的に利用していくことが今後のポイントになってきます。
よって、保守は今後も行われるためコードの保守性の担保を目的としたコードの解析が重要です。
そして、解析するためにCOBOLを解析可能な状態にパースする必要があります。

Parser(構文解析器)を生成するためのツールがParser Generatorです。Parser Generatorは、文法仕様を読み取り、それを文法との一致を認識できるJavaプログラムに変換するツールです。

# ２．COBOL Parser Generatorの概要

COBOL Parser / Parser Generatorについて調査し比較しました。その結果をまとめます。
今回調査したCOBOL Parser / Parser Generatorは下記の通りです。

- [Koopa (COBOL) Parser Generator](https://github.com/krisds/koopa)
  -  Parser Generator
  -  Cobol用に設計されたParser Generatorです。ソースファイルを分離して処理することができます（事前処理は不要です）。CICS/SQLが含まれていても処理可能です。grammerは簡単に拡張できます。プロジェクト内にある *.kgファイル を元にParserに相当するJavaファイルを生成します。
- [JavaCC](https://javacc.github.io/javacc/)
  - Parser Generator
  - Java Compiler Compiler （JavaCC）は、Javaアプリケーションで使用するための一般的なParser Generatorです。加えて、ツリー構築（JavaCCに含まれているJJTreeと呼ばれるツールを介して）、デバッグなど、Parser生成に関連する標準機能を持っています。JavaCC Parserを実行するために必要なのは、Javaランタイム環境（JRE）だけです。
- [ProLeap ANTLR4-based parser for COBOL](https://github.com/uwol/proleap-cobol-parser )
  - Parser
  - ANTLR4文法に基づくCOBOLソースコードParserです。COBOLコードの抽象構文木（AST）と抽象Semanticグラフ（ASG）を生成します。 ASTは、構文ツリー構造でCOBOLコードを表します。 ASGは、Semantic分析によってASTから生成され、データと制御フロー情報を持ちます。さらに、EXEC SQL、EXEC SQLIMS、EXEC CICSはテキストとして抽出されます。Parserはテスト駆動で開発され、NISTテストsuiteをパスし、銀行や保険の多数のCOBOLファイルの解析に利用されています。
- [ANTLR (ANother Tool for Language Recognition) ](https://www.antlr.org/)
  - Parser Generator 
  - ANTLR（言語認識用のツール）は、LL構文解析に基づくParser Generatorです。Parserに加えてレキサーおよびTree Parserも生成可能です。 文法の記述方法は、EBNFに似た形式となっています。構造化テキストとバイナリファイルの読み取り、処理、実行、翻訳を行います。文法から解析ツリーを構築できるParserを生成し、フレーズを簡単に認識できるListener Interface（またはVisitor）も生成します。Java、Python、C#、JavaScript、Go、Swift、C++の構文解析器のコードを生成できます。
- [GnuCOBOL](https://gnucobol.sourceforge.io/)
  - COBOL compiler
  - GnuCOBOL（以前はOpenCOBOL、GNU Cobolと呼ばれていた）は、無料のCOBOLコンパイラーです。C言語へのトランスコンパイラであり、COBOLをCに変換し、変換されたコードをCコンパイラでコンパイルします。COBOLコードから実行可能ファイルを生成します。 COBOL 85、COBOL 2002、およびCOBOL 2014標準、X / Open COBOLの大部分、および他のCOBOLコンパイラー（IBM COBOL、MicroFocus COBOL、ACUCOBOL-GTなど）に含まれる多くの拡張機能があります。Linux、Unix、Mac OS X、Microsoft Windowsなどのさまざまなプラットフォームで動作してCOBOLプログラムを構築できます。
- [TypeCobol](https://github.com/TypeCobolTeam/TypeCobol)
  - Parser
  - IBM Enterprise Cobol 5.1 for zOS構文用のCOBOL Parserです。Cobol-85の拡張言語でもあり、Cobol-85に変換可能です。コードの一部だけ更新された場合は、素早く解析できます。ユーザーが拡張して、案件のコーディング規則に合致しているかをチェックできます。
- [CHE-COBO（Checker for COBOL Program）](https://www.exa-corp.co.jp/solutions/others/checobo.html)
  - 構文解析を用いたCOBOLソースコード解析ツール
  - COBOLコードの品質点検を自動化して静的解析を行うツールです。解析結果は、バグとなり得る部分をCSV形式で出力します。また、各ルール検出数の集計結果をExcelファイルで出力します。

# ３．COBOL Parser Generatorの選択基準

COBOL Parser Generatorを選択する観点は以下が挙げられます。

- 対応している方言の種類が多いこと（COBOL85、Net、日立、MFなど）
- Pro*COBOL（EXEC SQLなど）に対応していること
- 最近更新されていること
- （ここ数年の）メンテナンスの頻度が高いこと
- コミッターの人数が多いこと
- GitHubのStarの数が多いこと
- ネット上に情報量が多いこと

# ４．COBOL Parser Generatorの評価

３章で提示した観点に基づいて各COBOL Parser / Parser Generatorの特徴を下の表にまとめました。
（Markdownの図ではサイズ的に見づらかったため、ファイルを添付する形にしました。）

![screencapture-df-aslead-cloud-wiki-pages-viewpage-action-2022-03-29-01_21_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1993885/8c4ee3d5-e330-9f13-48de-ddb951fe78d1.png)

# ５．COBOL Parser Generatorの選定

筆者が所属するCOBOL解析プラグイン開発チームでは、COBOL Parser Generatorに、**Koopa (COBOL) Parser Generatorを採用**することに決定しました。Koopaに決まった経緯や選定理由は下記の通りです。

- 対応している方言が多い（COBOL85、Net、日立、MFなど）。各方言ごとのgrammerファイルが存在している。
- EXEC SQL、EXEC CICSに対応できる。
- ネット上に情報量が多い。
- COBOLは新規にアップデートされているものが少ないため、最近のContributionsの数が少ないことは問題ではないと言える。（Koopaは既にある程度完成されているため、最近のContributionsの数が少ないと思われる。）

以上のように、Koopaは３章に記載した選定基準に合致している項目が最も多いからです。

# ６．おわりに

あくまで３章で提示した観点に基づくと、Koopa (COBOL) Parser Generatorが最適であったため、筆者の開発チームはKoopaを選択しました。
是非読者様自らの観点で最適なCOBOL Parser Generatorをちゃんと選んでみてはいかがでしょうか。
本記事がどのCOBOL Parser Generatorを選べば良いか迷っている方々の一助になれば幸いです。

# ７．APPENDIX

[経済産業省のDXレポート](https://www.meti.go.jp/shingikai/mono_info_service/digital_transformation/pdf/20180907_01.pdf)
[Micro Focus社の約50ヶ国でのCOBOL調査のプレスリリース](https://www.microfocus.co.jp/about/news/press/2022/0216/)
[Koopa (COBOL) Parser Generator (GitHub)](https://github.com/krisds/koopa)
[Koopa (COBOL) Parser Generator](http://koopa.sourceforge.net/)
[JavaCC](https://javacc.github.io/javacc/)
[JavaCC (GitHub)](https://github.com/javacc/javacc)
[ProLeap ANTLR4-based parser for COBOL (GitHub)](https://github.com/uwol/proleap-cobol-parser )
[ANTLR (ANother Tool for Language Recognition) ](https://www.antlr.org/)
[ANTLR (ANother Tool for Language Recognition) (GitHub)](https://github.com/antlr/antlr4)
[GnuCOBOL](https://gnucobol.sourceforge.io/)
[GnuCOBOL](https://sourceforge.net/projects/gnucobol/)
[TypeCobol (GitHub)](https://github.com/TypeCobolTeam/TypeCobol)
[CHE-COBO（Checker for COBOL Program）](https://www.exa-corp.co.jp/solutions/others/checobo.html)