シンプルな PHP ローマ数字ライブラリ
このライブラリには、ローマ数字を含むstring
を入力を 10 進数として表すint
に変換し、結果として 10 進数のint
ローマ数字を含む文字string
に変換する簡単なフィルターがいくつか含まれています。
use Romans Filter RomanToInt ;
$ filter = new RomanToInt ();
$ result = $ filter -> filter ( ' MCMXCIX ' ); // 1999
use Romans Filter IntToRoman ;
$ filter = new IntToRoman ();
$ result = $ filter -> filter ( 1999 ); // MCMXCIX
このパッケージは、Composer をデフォルトのリポジトリとして使用します。最後の安定したバージョンを指すために、 composer.json
のrequire
セクションにパッケージ名を追加してインストールできます。
{
"require" : {
"wandersonwhcr/romans" : " ^1.0 "
}
}
また、Romans はセマンティック バージョニングを使用します。次のパッケージ バージョンは、これらの PHP リリースをサポートしています。
1.0.*
: PHP ^7.0
(アウグストゥス)1.1.*
: PHP ^7.0
(ティベリウス)1.2.*
: PHP >=7.4
(カリギュラ)1.3.*
: PHP >=7.4
(クローディウス)1.4.*
: PHP >=7.4
(Nero)1.5.*
: PHP >=8.0
(ガルバ) このライブラリはプロジェクトの依存関係として使用できるため、ライブラリやフレームワークとの統合が容易になります。このリストにさらに項目を追加したい場合は、プロジェクトをアルファベット順に追加して、問題を開くかプル リクエストを作成してください。
Romans
パッケージは、Lexer-Parser アプローチと決定論的有限オートマトン (DFA) を使用して、文法トークン ライブラリを使用してローマ数字をint
に変換します。
use Romans Grammar Grammar ;
use Romans Lexer Lexer ;
use Romans Parser Parser ;
$ grammar = new Grammar ();
$ lexer = new Lexer ( $ grammar );
$ parser = new Parser ( $ grammar );
$ tokens = $ lexer -> tokenize ( ' MCMXCIX ' );
/*
$tokens = [
0 => 'M' // Grammar::T_M
1 => 'C', // Grammar::T_C
2 => 'M', // Grammar::T_M
3 => 'X', // Grammar::T_X
4 => 'C', // Grammar::T_C
5 => 'I', // Grammar::T_I
6 => 'X', // Grammar::T_X
];
*/
$ result = $ parser -> parse ( $ tokens ); // 1999
RomanToInt
フィルターは、レクサーを使用して入力をトークン化し、パーサーを使用してint
数値を構築します。エラーが見つかると、レクサーまたはパーサーは例外をスローして、特定のコードの問題を通知します。
use Romans Filter RomanToInt ;
use Romans Lexer Exception as LexerException ;
use Romans Parser Exception as ParserException ;
$ filter = new RomanToInt ();
try {
$ filter -> filter ( $ input );
} catch ( LexerException $ e ) {
// Unknown Token (LexerException::UNKNOWN_TOKEN)
} catch ( ParserException $ e ) {
// Invalid Token Type (Not String) (ParserException::INVALID_TOKEN_TYPE)
// Unknown Token (ParserException::UNKNOWN_TOKEN)
// Invalid Roman (ParserException::INVALID_ROMAN)
}
この構造体を使用してローマ数字を検証し、 try..catchブロックを追加して$input
が有効かどうかを確認できます。また、 IntToRoman
フィルターを使用して、 int
Roman にフィルターできるかどうかを検証できます。
use Romans Filter IntToRoman ;
use Romans Filter Exception as FilterException ;
$ filter = new IntToRoman ();
try {
$ filter -> filter ( $ input );
} catch ( FilterException $ e ) {
// Invalid Integer (< 0) (FilterException::INVALID_INTEGER)
}
ゼロ値はstring
"N"
として表されます。これは、ラテン語で「何もない」を意味するnullaまたはnihilの頭文字です (参考文献を参照)。
use Romans Filter RomanToInt ;
use Romans Filter IntToRoman ;
$ filter = new RomanToInt ();
$ result = $ filter -> filter ( ' N ' ); // 0 (Zero)
$ filter = new IntToRoman ();
$ result = $ filter -> filter ( 0 ); // N
このパッケージは PSR-6 キャッシュ インターフェイスを使用して、主にキャッシュ ライブラリを使用したループ ( while
やforeach
など) 上の実行を改善します。任意の PSR-6 実装を使用できますが、Symfony Cache パッケージをお勧めします。
use Romans Filter IntToRoman ;
use Romans Filter RomanToInt ;
use Symfony Component Cache Adapter ArrayAdapter ;
$ cache = new ArrayAdapter ();
$ filter = new RomanToInt ();
$ filter -> setCache ( $ cache );
$ result = $ filter -> filter ( ' MCMXCIX ' ); // 1999
$ result = $ filter -> filter ( ' MCMXCIX ' ); // 1999 (from cache)
$ filter = new IntToRoman ();
$ filter -> setCache ( $ cache );
$ result = $ filter -> filter ( 1999 ); // MCMXCIX
$ result = $ filter -> filter ( 1999 ); // MCMXCIX (from cache)
Docker Compose を使用してイメージを構築し、コンテナーを実行してこのパッケージを開発およびテストできます。
docker-compose build
docker-compose run --rm romans composer install
docker-compose run --rm romans composer test
このセクションでは、ローマ数字をint
に、またはその逆に変換するためにこのパッケージで使用される手法について説明します。
レクサー-パーサー アプローチが選択されたのは、ローマ数字の検証と読み取りがより単純化されるためです。レクサーは入力を読み取り、トークンに変換し、文字レベルでコンテンツを検証します。パーサーは、トークンを数値に変換し、位置レベルでコンテンツを検証し、DFA を通じてint
に変換する役割を果たします。
Wikipedia には、「字句解析とは、一連の文字を一連のトークンに変換するプロセス」であり、「解析を目的として分類を明示的に示す語彙素を表す構造」であると記載されています。 Wikipedia にも、「解析または構文分析は、正式な文法の規則に準拠した記号を分析するプロセスである」と記載されています。
この構造により、入力string
読み取り、特定の文字セットと入力内の位置に応じて別の構造に変換する構造の開発が容易になります。
DFA は、ローマ数字を含むstring
が有効かどうかをチェックするために開発されました。この手法が選択されたのは、他の実装では、4 つの文字を順番に入力するなど、ルールをチェックせずに入力を単純に変換するためです。
現在のオートマトンの定義は以下で宣言されています。
M = (Q, Σ, δ, q0, F)
Q = { a, b, c, d, e, f, g, y, z }
Σ = { I, V, X, L, C, D, M, N }
q0 = g
F = { z }
z -> ε
y -> $z
a -> y | Iy | IIy | IIIy
b -> a | IVy | Va | IXy
c -> b | Xb | XXb | XXXb
d -> c | XLb | Lc | XCb
e -> d | Cd | CCd | CCCd
f -> e | CDd | De | CMd
g -> f | Ny | Mg
このパッケージはオープンソースであり、LICENSE に記載されている MIT ライセンスの下で利用可能です。