간단한 PHP 로마 숫자 라이브러리
이 라이브러리에는 로마 숫자가 포함된 string
을 입력을 10진수로 나타내는 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 "
}
}
또한 Romans는 Semantic Versioning을 사용합니다. 다음 패키지 버전은 이러한 PHP 릴리스를 지원합니다.
1.0.*
: PHP ^7.0
(8월)1.1.*
: PHP ^7.0
(티베리우스)1.2.*
: PHP >=7.4
(칼리굴라)1.3.*
: PHP >=7.4
(Claudius)1.4.*
: PHP >=7.4
(Nero)1.5.*
: PHP >=8.0
(갈바) 이 라이브러리는 프로젝트에 대한 종속성으로 사용될 수 있으므로 라이브러리 또는 프레임워크와의 통합이 더 쉬워집니다. 이 목록에 더 많은 항목을 추가하려면 이슈를 열거나 끌어오기 요청을 작성하여 프로젝트를 알파벳순으로 추가하세요.
Romans
패키지는 Lexer-Parser 접근 방식과 DFA(Deterministic Finite Automaton)를 사용하여 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
숫자를 만듭니다. 오류가 발견되면 Lexer 또는 Parser는 예외를 발생시켜 특정 코드의 문제를 알립니다.
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)
}
0 값은 "아무것도"를 의미하는 라틴어인 nulla 또는 nihil 의 이니셜인 string
"N"
으로 표시됩니다(참조 참조).
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는 입력을 읽고 토큰으로 변환하여 문자 수준에서 콘텐츠의 유효성을 검사하는 일을 담당합니다. 파서는 토큰을 숫자로 변환하고, 위치 수준에서 콘텐츠를 검증하고, DFA를 통해 int
로 변환하는 작업을 담당합니다.
Wikipedia에서는 "어휘 분석은 일련의 문자를 일련의 토큰으로 변환하는 과정", 즉 "분석 목적으로 분류를 명시적으로 나타내는 어휘를 나타내는 구조"라고 말합니다. 심지어 위키피디아에서는 "파싱이나 구문 분석은 형식 문법의 규칙에 따라 기호를 분석하는 과정"이라고 말합니다.
이 구조를 사용하면 입력 string
읽는 구조를 더 쉽게 개발할 수 있으며, 특정 문자 집합과 입력 내부 위치에 따라 다른 구조로 변환할 수 있습니다.
로마 숫자가 포함된 string
이 유효한지 확인하기 위해 DFA가 개발되었습니다. 이 기술이 선택된 이유는 다른 구현에서는 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 라이선스에 따라 사용할 수 있습니다.