From f804c99534c4d9e87afed29a1f0ab281d2de6889 Mon Sep 17 00:00:00 2001 From: "moandji.ezana" Date: Fri, 23 Jan 2015 14:17:39 +0200 Subject: [PATCH] Table array name parsing no longer handled by Parboiled --- src/main/java/com/moandjiezana/toml/Keys.java | 32 +++++++++++++++++++ .../com/moandjiezana/toml/TomlParser.java | 10 +----- .../com/moandjiezana/toml/ValueParser.java | 8 ----- 3 files changed, 33 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/moandjiezana/toml/Keys.java b/src/main/java/com/moandjiezana/toml/Keys.java index 59821ec..903653b 100644 --- a/src/main/java/com/moandjiezana/toml/Keys.java +++ b/src/main/java/com/moandjiezana/toml/Keys.java @@ -65,6 +65,38 @@ class Keys { return splitKey.toArray(new Key[0]); } + + static String getTableArrayName(String line) { + StringBuilder sb = new StringBuilder(); + char[] chars = line.toCharArray(); + boolean quoted = false; + boolean terminated = false; + + for (int i = 2; i < chars.length; i++) { + char c = chars[i]; + if (c == '"' && chars[i - 1] != '\\') { + quoted = !quoted; + } else if (!quoted && c == ']') { + if (chars.length > i + 1 && chars[i + 1] == ']') { + terminated = true; + break; + } + } else if (!quoted && (ALLOWED_CHARS.indexOf(c) == -1)) { + break; + } + + sb.append(c); + } + + String tableName = sb.toString(); + + if (!terminated || tableName.isEmpty() || !isComment(line.substring(tableName.length() + 4))) { + return null; + } + + tableName = StringConverter.STRING_PARSER.replaceUnicodeCharacters(tableName); + return tableName; + } /** * @param line trimmed TOML line to parse diff --git a/src/main/java/com/moandjiezana/toml/TomlParser.java b/src/main/java/com/moandjiezana/toml/TomlParser.java index 8e3594b..0fb48e6 100644 --- a/src/main/java/com/moandjiezana/toml/TomlParser.java +++ b/src/main/java/com/moandjiezana/toml/TomlParser.java @@ -1,10 +1,7 @@ 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; import java.util.regex.Pattern; class TomlParser { @@ -173,12 +170,7 @@ class TomlParser { } private String getTableArrayName(String line) { - List resultValue = parse(parser().TableArray(), line); - if (resultValue == null) { - return null; - } - - return (String) resultValue.get(0); + return Keys.getTableArrayName(line); } private boolean isTable(String line) { diff --git a/src/main/java/com/moandjiezana/toml/ValueParser.java b/src/main/java/com/moandjiezana/toml/ValueParser.java index f6fdebf..716de4e 100644 --- a/src/main/java/com/moandjiezana/toml/ValueParser.java +++ b/src/main/java/com/moandjiezana/toml/ValueParser.java @@ -10,10 +10,6 @@ import org.parboiled.annotations.BuildParseTree; @BuildParseTree class ValueParser extends BaseParser> { - public Rule T() { - return Sequence("'''", OneOrMore(TestNot("'''"), ANY), "'''", Comment()); - } - public Rule Array() { return FirstOf(EmptyArray(), Sequence('[', startList(), OneOrMore(FirstOf(NonEmptyArray(), ' ', ',')), ']', endList())); } @@ -22,10 +18,6 @@ class ValueParser extends BaseParser> { return Sequence('[', startList(), Sequence(OneOrMore(NoneOf("[]")), pushToken(match())), ']', endList(), Comment()); } - public Rule TableArray() { - return Sequence('[', '[', startList(), Sequence(OneOrMore(NoneOf("[]")), pushToken(match())), ']', ']', endList(), FirstOf(EOI, Sequence(TestNot(']'), ANY))); - } - public Rule LiteralString() { return FirstOf(EmptyLiteralString(), Sequence('\'', OneOrMore(TestNot("'"), ANY), startList(), pushToken(match()) , '\'', endList(), Comment())); }