From 2da9eadbac8a5d0784e7054abf330c5182370b3a Mon Sep 17 00:00:00 2001 From: sbyrne Date: Fri, 4 Jun 2021 23:10:33 -0400 Subject: [PATCH] fix string escape handling --- src/main/java/net/sbyrne/fig/FigParser.kt | 53 ++++++++++++------- src/test/java/net/sbyrne/fig/FigParserTest.kt | 10 +++- 2 files changed, 44 insertions(+), 19 deletions(-) diff --git a/src/main/java/net/sbyrne/fig/FigParser.kt b/src/main/java/net/sbyrne/fig/FigParser.kt index a2a3eea..12214b0 100644 --- a/src/main/java/net/sbyrne/fig/FigParser.kt +++ b/src/main/java/net/sbyrne/fig/FigParser.kt @@ -11,6 +11,7 @@ import org.parboiled.matchers.Matcher import org.parboiled.matchers.TestMatcher import org.parboiled.parserunners.TracingParseRunner import org.parboiled.support.ParseTreeUtils +import org.parboiled.support.StringVar object FigParser { @@ -359,43 +360,57 @@ open class FigPegParser: BaseParser() { // pushes FigString open fun StringLiteralRule( terminators:String? ): Rule { return FirstOf( - Sequence( - "\"", - TextOrEmptyRule(charsRequiringEscape = "\""), - push( FigString( match() ) ), - "\"" - ), - Sequence( - TextRule(charsRequiringEscape = "${WHITESPACE}${terminators?:""}"), - push( FigString( match() ) ), - TestWhitespaceTerminatorOrEnd(terminators) - ) + QuotedStringRule(), + UnquotedStringRule(terminators) ).suppressSubnodes() } + // pushes FigString + open fun QuotedStringRule(): Rule { + val text = StringVar() + return Sequence( + "\"", + TextOrEmptyRule(charsRequiringEscape = "\"",var_=text), + push( FigString( text.get() ) ), + "\"" + ) + } + + // pushes FigString + open fun UnquotedStringRule(terminators:String?): Rule { + val text = StringVar() + return Sequence( + TextRule(charsRequiringEscape = "${WHITESPACE}${terminators?:""}",var_=text), + push( FigString( text.get() ) ), + TestWhitespaceTerminatorOrEnd(terminators) + ) + } + /** * A text string where the specified characters and backslash must be escaped with a backslash. * The text can be empty. * * @param charsRequiringEscape */ - open fun TextOrEmptyRule(charsRequiringEscape: String): Rule { + open fun TextOrEmptyRule(charsRequiringEscape: String,var_:StringVar): Rule { return ZeroOrMore( FirstOf( Sequence( '\\', - AnyOf(charsRequiringEscape + '\\') + AnyOf(charsRequiringEscape + '\\'), + var_.append(match()) ), OneOrMore( Sequence( TestNot( AnyOf(charsRequiringEscape + '\\') ), - ANY + ANY, + var_.append(match()) ) ).suppressSubnodes() ) - ) + ) } /** @@ -404,17 +419,19 @@ open class FigPegParser: BaseParser() { * * @param charsRequiringEscape */ - open fun TextRule(charsRequiringEscape: String): Rule { + open fun TextRule(charsRequiringEscape: String,var_:StringVar): Rule { return OneOrMore( FirstOf( Sequence( '\\', - AnyOf(charsRequiringEscape + '\\') + AnyOf(charsRequiringEscape + '\\'), + var_.append(match()) ), OneOrMore( Sequence( TestNot(AnyOf(charsRequiringEscape + '\\')), - ANY + ANY, + var_.append(match()) ) ).suppressSubnodes() ) diff --git a/src/test/java/net/sbyrne/fig/FigParserTest.kt b/src/test/java/net/sbyrne/fig/FigParserTest.kt index 3485ce4..d9ee19c 100644 --- a/src/test/java/net/sbyrne/fig/FigParserTest.kt +++ b/src/test/java/net/sbyrne/fig/FigParserTest.kt @@ -67,6 +67,14 @@ class FigParserTest { )) ) + @Test + fun testString() = test( + "abc", + FigList(mutableListOf( + FigString("abc") + )) + ) + @Test fun testNumber() = test( "1", @@ -94,7 +102,7 @@ class FigParserTest { @Test fun escapeQuotedString() = test( - """"a\ b""", + "\"a b\"", FigList(mutableListOf( FigString("a b") ))