diff --git a/lib/src/main/kotlin/org/example/Parser.kt b/lib/src/main/kotlin/org/example/Parser.kt index 859253f..1f4d122 100644 --- a/lib/src/main/kotlin/org/example/Parser.kt +++ b/lib/src/main/kotlin/org/example/Parser.kt @@ -8,11 +8,15 @@ import com.github.h0tk3y.betterParse.lexer.regexToken import com.github.h0tk3y.betterParse.parser.Parser class RegexParser : Grammar() { + // val bracketContent by regexToken("[^\\]]*") + val escapedCharacter by regexToken("\\\\[+*?.()|\\[\\]]") val postfixOperator by regexToken("[+*?]") val alternationSymbol by literalToken("|") val openParenSymbol by literalToken("(") val closeParenSymbol by literalToken(")") - + val bracketOpen by literalToken("[") + val bracketClose by literalToken("]") + val dot by literalToken(".") val charToken by regexToken("[a-zA-Z0-9]") @@ -21,6 +25,7 @@ class RegexParser : Grammar() { val item: Parser by char or (dot asJust DotItem()) or + (escapedCharacter map { CharItem(it.text.substring(1)) }) or (skip(openParenSymbol) and (parser(::rootParser)) and skip(closeParenSymbol)) val term: Parser by diff --git a/lib/src/main/kotlin/org/example/RegexItem.kt b/lib/src/main/kotlin/org/example/RegexItem.kt index 86693da..4806bce 100644 --- a/lib/src/main/kotlin/org/example/RegexItem.kt +++ b/lib/src/main/kotlin/org/example/RegexItem.kt @@ -66,7 +66,21 @@ class AndThenItem(val left: RegexItem, val right: RegexItem) : RegexItem { } class CharItem(val value: String) : RegexItem { - override fun toString(): String = value + override fun toString(): String = + // escape 특수 문자를 처리하여 출력 + when (value) { + "+" -> "\\+" + "*" -> "\\*" + "?" -> "\\?" + "." -> "\\." + "(" -> "\\(" + ")" -> "\\)" + "|" -> "\\|" + "[" -> "\\[" + "]" -> "\\]" + else -> value // 일반 문자 그대로 반환 + } + override fun findMatch(str: String): AvailableState { return when { // 첫번째 문자가 value와 일치하는지 확인 diff --git a/lib/src/test/kotlin/org/example/ParserTest.kt b/lib/src/test/kotlin/org/example/ParserTest.kt index 0628726..263488b 100644 --- a/lib/src/test/kotlin/org/example/ParserTest.kt +++ b/lib/src/test/kotlin/org/example/ParserTest.kt @@ -107,4 +107,13 @@ class ParserTest { assert(result.match("ba").isSuccess) assert(result.match("bca").isSuccess) } + @Test + fun testEscapedCharacter() { + val input = "\\+" + val parser = RegexParser() + val result = parser.parseToEnd(input) + assertEquals("\\+", result.toString()) + assert(result.match("+").isSuccess) + assert(!result.match("a").isSuccess) + } } \ No newline at end of file