From e18017d5cfc03ecd9c6c480718a9357dcebfd766 Mon Sep 17 00:00:00 2001 From: hadware Date: Tue, 19 May 2020 12:30:51 +0200 Subject: [PATCH] Updated both parsers to include the new ENBF rules. --- sly_examples/json_parser.py | 92 +++++++++++++++++++------------------ sly_examples/stl_parser.py | 14 ++---- 2 files changed, 50 insertions(+), 56 deletions(-) diff --git a/sly_examples/json_parser.py b/sly_examples/json_parser.py index 9ae07b6..123b462 100644 --- a/sly_examples/json_parser.py +++ b/sly_examples/json_parser.py @@ -16,70 +16,72 @@ Little reminder: here's the grammar """ -class JSONLexer(Lexer): - tokens = {"FLOAT", "INTEGER", "STRING"} +class JsonLexer(Lexer): + tokens = {STRING, NUMBER, TRUE, FALSE, NULL} + ignore = ' \t\n\r' + literals = {'{', '}', '[', ']', ':', ','} - literals = {'{', '}', '[', ']', ',', ':'} - ignore = " \t\n" + @_(r'-?(0|[1-9][0-9]*)(\.[0-9]+)?([Ee][+-]?[0-9]+)?') + def NUMBER(self, t): + t.value = float(t.value) + return t - @_(r"\".*?\"") + @_(r'"([ !#-\[\]-\U0010ffff]+|\\(["\/\\bfnrt]|u[0-9A-Fa-f]{4}))*"') def STRING(self, t): - t.value = t.value.strip("\"") + t.value = json_unescape(t.value) return t - @_(r"\d+\.\d*") - def FLOAT(self, t): - t.value = float(t.value) + @_(r'true') + def TRUE(self, t): + t.value = True return t - @_(r"\d+") - def INTEGER(self, t): - t.value = int(t.value) + @_(r'false') + def FALSE(self, t): + t.value = False return t + @_(r'null') + def NULL(self, t): + t.value = None + return t -class JSONParser(Parser): - tokens = JSONLexer.tokens - start = "json" - @_('object', - 'array') - def json(self, p): - return p[0] +class JsonParser(Parser): + tokens = JsonLexer.tokens + start = 'value' - @_('"{" members "}"') - def object(self, p): - return {key: value for key, value in p.members} - - @_('pair') - def members(self, p): - return [p.pair] + @_(r'"{" [ pairs ] "}"') + def value(self, p): + if p.pairs: + return dict(p.pairs) + else: + return {} - @_('pair "," members') - def members(self, p): - return [p.pair] + p.members + @_(r'pair { "," pair }') + def pairs(self, p): + return [p.pair0] + p.pair1 - @_('STRING ":" value') + @_(r'STRING ":" value') def pair(self, p): - return p.STRING, p.value + return (p.STRING, p.value) - @_('"[" elements "]"') - def array(self, p): - return p.elements - - @_('value') - def elements(self, p): - return [p.value] + @_(r'"[" [ items ] "]"') + def value(self, p): + if p.items: + return p.items + else: + return [] - @_('value "," elements') - def elements(self, p): - return [p.value] + p.elements + @_(r'value { "," value }') + def items(self, p): + return [p.value0] + p.value1 @_('STRING', - 'INTEGER', - 'FLOAT', - 'object', - 'array') + 'NUMBER', + 'TRUE', + 'FALSE', + 'NULL') def value(self, p): return p[0] diff --git a/sly_examples/stl_parser.py b/sly_examples/stl_parser.py index e84c6e3..16e6c62 100644 --- a/sly_examples/stl_parser.py +++ b/sly_examples/stl_parser.py @@ -71,18 +71,10 @@ class STLParser(Parser): def stl(self, p): return p.solid - @_("SOLID_START NAME_LITERAL facets_list SOLID_END") - @_("SOLID_START NAME_LITERAL facets_list SOLID_END NAME_LITERAL") + @_("SOLID_START NAME_LITERAL { facet } SOLID_END") + @_("SOLID_START NAME_LITERAL { facet } SOLID_END NAME_LITERAL") def solid(self, p): - return Solid(name=p[1], facets=p.facets_list) - - @_("facet") - def facets_list(self, p): - return [p.facet] - - @_("facet facets_list") - def facets_list(self, p): - return [p.facet] + p.facets_list + return Solid(name=p[1], facets=p.facet) @_("FACET_START triplet loop FACET_END") def facet(self, p):