このパッケージは、Fortran Regular Expression (Forgex) を対話的に実行するforgex-cliというコマンドラインツールを提供します。
forgex-cliコマンドはもともとForgexの一部として提供されていましたが、Forgexバージョン3.5より、本リポジトリとして
分離されました。
このソフトウェアの動作は以下のコンパイラで確認されています。
gfortran) v13.2.1ifx) 2024.0.0 20231017Fortran 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 buildやfpm installでは--profile releaseオプションを指定して、最適化オプション等を有効にして
ビルド及びインストールすることができます。
この記事では、forgex-cliコマンドの基本的な使い方について解説します。
現在、findとdebugのコマンドと、以下のサブコマンド等が実行可能です。
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に変更する必要があります。本プロジェクトに含まれるすべてのコードは、3スペースのインデントで記述されます。
forgex-cliのコマンドラインインターフェイスの設計については、Rust言語のregex-cliを参考にしました。
このプロジェクトはMITライセンスで提供されるフリーソフトウェアです (cf. LICENSE)。