Japanese/日本語

  • 雨崎しのぶ
  • 2024-09-01

README

このパッケージは、Fortran Regular Expression (Forgex) を対話的に実行するforgex-cliというコマンドラインツールを提供します。 forgex-cliコマンドはもともとForgexの一部として提供されていましたが、Forgexバージョン3.5より、本リポジトリとして 分離されました。

動作確認

このソフトウェアの動作は以下のコンパイラで確認されています。

  • GNU Fortran (gfortran) v13.2.1
  • Intel Fortran Compiler (ifx) 2024.0.0 20231017

Fortran Package Manager(fpm)を使用することを前提にしています。

インストール

ソースコードの入手

リポジトリをクローンします。

git clone https://github.com/shinobuamasaki/forgex-cli

もしくは最新のソースファイルをダウンロードします。

wget https://github.com/ShinobuAmasaki/forgex-cli/archive/refs/tags/v3.5.tar.gz

この場合は、ダウンロードしたアーカイブファイルを展開します。

tar xvzf v3.5.tar.gz

ビルド

クローン、もしくは展開されたディレクトリに移動します。

cd forgex-cli

Fortran Package Managerのfpmコマンドを使用してビルドを実行します。

fpm build

これにより、依存関係が自動的に解決され、Forgexを含むforgex-cliがコンパイルされます。 ビルド後はfpm runコマンドを使用して、forgex-cliを実行することができます。

PATHの通ったディレクトリにインストールする場合は、fpm installを実行してください。 例えば次のようにします。

fpm install --prefix /usr/local

なお、fpm buildfpm installでは--profile releaseオプションを指定して、最適化オプション等を有効にして ビルド及びインストールすることができます。

使い方

この記事では、forgex-cliコマンドの基本的な使い方について解説します。

コマンドライン・インターフェイス

現在、finddebugのコマンドと、以下のサブコマンド等が実行可能です。

forgex-cli
├── find
│    └── match
│         ├── lazy-dfa <pattern> <operator> <input text>
│         ├── dense <pattern> <operator> <input text>
│         └── forgex <pattern> <operator> <input text>
└── debug
      ├── ast <pattern>
      └── thompson <pattern>

forgex-cliのコマンドは次のように実行します

forgex-cli <command> <subcommand> ...
fpm run -- <command> <subcommand> ...

使用例

findコマンド

findコマンドとmatchサブコマンドを使用すると、エンジンを指定して、.in..match.演算子を用いた正規表現マッチングのベンチマークテストを実行することができます。

サブコマンドの後ろに、以下のエンジンのいずれかを指定します。 - lazy-dfa - dense - forgex

さらにその後ろには、正規表現パターン、演算子、入力テキストの順に、Forgexを使ってFortranコードを書くのと同じように指定します。 例えば、次のようになります。

forgex-cli find match lazy-dfa '([a-z]*g+)n?' .match. 'assign'

もしくは、fpm runを介して実行することもできます。

fpm run -- find match lazy-dfa '([a-z]*g+)n?' .match. 'assign'

いずれかを実行すると、以下のような実行結果が得られます。

                pattern: ([a-z]*g+)n?
                   text: 'assign'
             parse time:        42.9μs
   extract literal time:        23.0μs
            runs engine:         T
       compile nfa time:        26.5μs
    dfa initialize time:         4.6μs
            search time:       617.1μs
        matching result:         T
 automata and tree size:     10324  bytes

========== Thompson NFA ===========
state    1: (?, 5)
state    2: <Accepted>
state    3: (n, 2)(?, 2)
state    4: (g, 7)
state    5: (["a"-"f"], 6)(g, 6)(["h"-"m"], 6)(n, 6)(["o"-"z"], 6)(?, 4)
state    6: (?, 5)
state    7: (?, 8)
state    8: (g, 9)(?, 3)
state    9: (?, 8)
=============== DFA ===============
   1 : ["a"-"f"]=>2
   2 : ["o"-"z"]=>2 ["h"-"m"]=>2 g=>3
   3A: n=>4
   4A:
state    1  = ( 1 4 5 )
state    2  = ( 4 5 6 )
state    3A = ( 2 3 4 5 6 7 8 )
state    4A = ( 2 4 5 6 )
===================================

debugコマンド

debugコマンドを使用すると、正規表現から構築された抽象構文木(AST)や非決定性有限オートマトン(NFA)の情報を得ることができます。

例えば、debugコマンドとastサブコマンドに、正規表現パターンfoo[0-9]+barを与えて実行します。

forgex-cli debug ast 'foo[0-9]+bar'

そうすると、以下のように出力され、ASTの構造を知ることができます。

        parse time:       133.8μs
      extract time:        36.8μs
 extracted literal:
  extracted prefix: foo
  extracted suffix: bar
memory (estimated):       848
(concatenate (concatenate (concatenate (concatenate (concatenate (concatenate "f" "o") "o") (concatenate [ "0"-"9";] (closure[ "0"-"9";]))) "b") "a") "r")

次にNFAの情報を得るには、debugコマンドとthompsonサブコマンドを指定して、パターンを与えます。

forgex-cli debug thompson 'foo[0-9]+bar'

このコマンドの出力は、次のようになります。

        parse time:       144.5μs
  compile nfa time:        57.0μs
memory (estimated):     11589

========== Thompson NFA ===========
state    1: (f, 8)
state    2: <Accepted>
state    3: (r, 2)
state    4: (a, 3)
state    5: (b, 4)
state    6: (["0"-"9"], 9)
state    7: (o, 6)
state    8: (o, 7)
state    9: (?, 10)
state   10: (["0"-"9"], 11)(?, 5)
state   11: (?, 10)

Note: all segments of NFA were disjoined with overlapping portions.
===================================

注意

  • コマンドライン引数に--helpを指定すると、使用可能なオプションフラグに関する情報を取得できます。
  • コマンドラインツールforgex-cliをWindows上のPowerShellで利用する場合、Unicode文字を正しく入出力するには、システムのロケールをUTF-8に変更する必要があります。

To Do

  • ドキュメントの公開
  • CMakeによるビルドのサポート
  • ✅️ デバッグおよびベンチマーク用のCLIツールを追加
  • ✅️ 簡単な時間計測ツールの追加

コーディング規約

本プロジェクトに含まれるすべてのコードは、3スペースのインデントで記述されます。

謝辞

forgex-cliのコマンドラインインターフェイスの設計については、Rust言語のregex-cliを参考にしました。

参考文献

  1. rust-lang/regex/regex-cli

ライセンス

このプロジェクトはMITライセンスで提供されるフリーソフトウェアです (cf. LICENSE)。