From 77788d3c8721c724f462c8557017ca9a8cd3d68d Mon Sep 17 00:00:00 2001 From: "moandji.ezana" Date: Fri, 23 Jan 2015 22:03:55 +0200 Subject: [PATCH] Multiline literal strings no longer handled by Parboiled --- .../toml/MultilineLiteralStringConverter.java | 34 ++++++++++++++----- .../com/moandjiezana/toml/ValueParser.java | 24 ------------- .../com/moandjiezana/toml/StringTest.java | 7 +++- 3 files changed, 31 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/moandjiezana/toml/MultilineLiteralStringConverter.java b/src/main/java/com/moandjiezana/toml/MultilineLiteralStringConverter.java index f198eef..eec8479 100644 --- a/src/main/java/com/moandjiezana/toml/MultilineLiteralStringConverter.java +++ b/src/main/java/com/moandjiezana/toml/MultilineLiteralStringConverter.java @@ -1,10 +1,6 @@ package com.moandjiezana.toml; import static com.moandjiezana.toml.ValueConverterUtils.INVALID; -import static com.moandjiezana.toml.ValueConverterUtils.parse; -import static com.moandjiezana.toml.ValueConverterUtils.parser; - -import java.util.List; class MultilineLiteralStringConverter implements ValueConverter { @@ -17,13 +13,33 @@ class MultilineLiteralStringConverter implements ValueConverter { @Override public Object convert(String s) { - List result = parse(parser().MultilineLiteralString(), s); + char[] chars = s.toCharArray(); + boolean terminated = false; + StringBuilder sb = new StringBuilder(s.length()); - if (result == null) { - return INVALID; + for (int i = 3; i < chars.length; i++) { + char c = chars[i]; + + if (c == '\'' && chars.length > i + 2 && chars[i + 1] == '\'' && chars[i + 2] == '\'') { + i += 2; + terminated = true; + continue; + } + + if (!terminated) { + sb.append(c); + } + + if (terminated && c == '#') { + break; + } + + if (terminated && !Character.isWhitespace(c)) { + return INVALID; + } } - - return result.get(0); + + return sb.toString(); } private MultilineLiteralStringConverter() {} diff --git a/src/main/java/com/moandjiezana/toml/ValueParser.java b/src/main/java/com/moandjiezana/toml/ValueParser.java index 90fa2f7..295c616 100644 --- a/src/main/java/com/moandjiezana/toml/ValueParser.java +++ b/src/main/java/com/moandjiezana/toml/ValueParser.java @@ -14,10 +14,6 @@ class ValueParser extends BaseParser> { return FirstOf(EmptyArray(), Sequence('[', startList(), OneOrMore(FirstOf(NonEmptyArray(), ' ', ',')), ']', endList())); } - public Rule MultilineLiteralString() { - return FirstOf(EmptyMultilineLiteralString(), Sequence("'''", startList(), Sequence(OneOrMore(TestNot("'''"), ANY), pushToken(match())), "'''", endList(), Comment())); - } - Rule NonEmptyArray() { return FirstOf(Array(), OneOrMore(TestNot(']'), FirstOf(StringToken(), Array(), ',', ' ', OtherValue()))); } @@ -26,34 +22,14 @@ class ValueParser extends BaseParser> { return Sequence(Sequence('"', ZeroOrMore(Sequence(TestNot('"'), ANY)), '"'), pushToken(match())); } - Rule EmptyLiteralString() { - return Sequence('\'', '\'', startList(), pushToken(""), endList()); - } - - Rule EmptyMultilineLiteralString() { - return Sequence("'''", "'''", startList(), pushToken(""), endList(), Comment()); - } - Rule EmptyArray() { return Sequence('[', ']', startList(), endList()); } - Rule SignedNumber() { - return Sequence(Optional(AnyOf("+-")), Number()); - } - - Rule Number() { - return OneOrMore(CharRange('0', '9')); - } - Rule OtherValue() { return Sequence(ZeroOrMore(NoneOf("],")), pushToken(match())); } - Rule Comment() { - return FirstOf(EOI, OneOrMore(' ', Sequence('#', ZeroOrMore(ANY)))); - } - boolean startList() { ArrayList newTokens = new ArrayList(); diff --git a/src/test/java/com/moandjiezana/toml/StringTest.java b/src/test/java/com/moandjiezana/toml/StringTest.java index 86c9b71..ac7b059 100644 --- a/src/test/java/com/moandjiezana/toml/StringTest.java +++ b/src/test/java/com/moandjiezana/toml/StringTest.java @@ -101,10 +101,15 @@ public class StringTest { } @Test(expected = IllegalStateException.class) - public void should_fail_on_unterminated_multiline_literal_string() throws Exception { + public void should_fail_on_multiline_literal_string_with_malformed_comment() throws Exception { new Toml().parse("a = '''some\n text\n''\nb = '''1'''"); } + @Test(expected = IllegalStateException.class) + public void should_fail_on_unterminated_multiline_literal_string() throws Exception { + new Toml().parse("a = '''some\n text\n''"); + } + @Test(expected = IllegalStateException.class) public void should_fail_on_unterminated_multiline_literal_string_on_single_line() throws Exception { new Toml().parse("a = '''some text''");