一個簡單的 PHP 羅馬數字庫
該庫包含幾個簡單的過濾器,用於將帶有羅馬數字的string
轉換為將輸入表示為十進制的int
,並將十進制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 "
}
}
此外,羅馬書使用語義版本控制。以下軟體包版本支援這些 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
(Galba) 該庫可以用作專案的依賴項,使與庫或框架的整合更容易。如果您想在此清單中新增更多項目,請開啟問題或建立拉取請求,並按字母順序新增您的項目。
Romans
使用 Lexer-Parser 方法和確定性有限自動機 (DFA),使用 Grammar Token 庫將羅馬數字轉換為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
使用 Lexer 對輸入進行標記,並使用 Parser 建立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
的技術,反之亦然。
選擇 Lexer-Parser 方法是因為羅馬數字的驗證和讀取更加簡單:Lexer 負責讀取輸入並將其轉換為標記,在字元層級驗證內容;解析器負責將 token 轉換為數字,在位置層級驗證內容並透過 DFA 轉換為int
。
維基百科說,“詞法分析是將字元序列轉換為標記序列的過程”,“是表示詞位的結構,它明確地表明其出於解析目的的分類”。維基百科甚至說「解析或語法分析是分析符合形式語法規則的符號的過程」。
這種結構使得開發負責讀取輸入string
的結構變得更容易,根據特定的字元集及其在輸入中的位置將其轉換為另一個結構。
DFA 的開發是為了檢查帶有羅馬數字的string
是否有效。選擇這種技術是因為其他實作只是簡單地轉換輸入而不檢查規則,例如按順序檢查四個字元。
目前的自動機定義聲明如下。
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
該軟體包是開源的,可根據許可證中所述的 MIT 許可證使用。