From be69396f69dfd30af2852070ec18a92e19299081 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=ADle=20Ekaterin=20Liszka?= Date: Fri, 12 Jan 2024 14:46:08 -0800 Subject: [PATCH] xbc: improve parsing --- xbc/__init__.py | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/xbc/__init__.py b/xbc/__init__.py index da8f0f0..d46cea1 100644 --- a/xbc/__init__.py +++ b/xbc/__init__.py @@ -112,8 +112,8 @@ key_fragment = Word(alphas + nums + '_-') key = DelimitedList(key_fragment, delim='.', combine=True) bareval = CharsNotIn(' {}#=+:;,\n\'"') -strvals = QuotedString("'", multiline=True, unquote_results=False) -strvald = QuotedString('"', multiline=True, unquote_results=False) +strvals = QuotedString("'", multiline=True, unquote_results=True) +strvald = QuotedString('"', multiline=True, unquote_results=True) value = bareval | strvald | strvals assign = Literal('=') @@ -123,6 +123,7 @@ op = assign | update | append semi = Literal(';').suppress() lbrace = Literal('{').suppress() rbrace = Literal('}').suppress() +terminal = Word(';\n').suppress() NL = Literal('\n').suppress() WS = Word(' \t').suppress() @@ -134,23 +135,18 @@ values = Group(value + ZeroOrMore(Literal(',').suppress() + Optional(WS_NL) + va keyvalue = Group(key + Optional(WS) + op + Optional(WS) + values, aslist=True) keyvalue.set_parse_action(lambda x: KeyValue(x)) -key_stmt = Optional(WS) + key + Optional(assign).suppress() + Optional(WS) +key_stmt = key + Optional(WS) + Optional(assign).suppress() + Optional(WS) key_stmt.set_parse_action(lambda x: Key(x)) -kv_stmt = Optional(WS) + keyvalue + Optional(WS) block = Forward() -statement = kv_stmt | key_stmt -term_stmt = kv_stmt | key_stmt + Optional(semi) + Optional(WS) +statement = (keyvalue | key_stmt) +statements = DelimitedList(statement, delim=terminal) +segment = Group(OneOrMore(block | statements), aslist=True) -line_statements = Group(term_stmt + ZeroOrMore(NL + term_stmt)) -term_stmt_list = Group(statement + ZeroOrMore(semi + statement)) - -segment = OneOrMore(block | term_stmt_list | line_statements) - -block << Group(key + Optional(WS) + lbrace + Group(segment, aslist=True) + rbrace + Optional(NL)) +block << Group(key + Optional(WS) + lbrace + segment + rbrace + Optional(NL)) block.set_parse_action(lambda x: Block(x)) -data = OneOrMore(block | (term_stmt + Optional(NL))) +data = OneOrMore(segment) XBCParser = data @@ -214,6 +210,9 @@ def parse_block(key, seq): if k not in ret: ret[k] = False + if not isinstance(value, list): + value = [value] + ret.update(parse_block(k, value)) return ret