Updated both parsers to include the new ENBF rules.

This commit is contained in:
2020-05-19 12:30:51 +02:00
parent 4e2b9fc481
commit e18017d5cf
2 changed files with 54 additions and 60 deletions
+51 -49
View File
@@ -16,70 +16,72 @@ Little reminder: here's the grammar
""" """
class JSONLexer(Lexer): class JsonLexer(Lexer):
tokens = {"FLOAT", "INTEGER", "STRING"} tokens = {STRING, NUMBER, TRUE, FALSE, NULL}
ignore = ' \t\n\r'
literals = {'{', '}', '[', ']', ':', ','}
literals = {'{', '}', '[', ']', ',', ':'} @_(r'-?(0|[1-9][0-9]*)(\.[0-9]+)?([Ee][+-]?[0-9]+)?')
ignore = " \t\n" def NUMBER(self, t):
@_(r"\".*?\"")
def STRING(self, t):
t.value = t.value.strip("\"")
return t
@_(r"\d+\.\d*")
def FLOAT(self, t):
t.value = float(t.value) t.value = float(t.value)
return t return t
@_(r"\d+") @_(r'"([ !#-\[\]-\U0010ffff]+|\\(["\/\\bfnrt]|u[0-9A-Fa-f]{4}))*"')
def INTEGER(self, t): def STRING(self, t):
t.value = int(t.value) t.value = json_unescape(t.value)
return t
@_(r'true')
def TRUE(self, t):
t.value = True
return t
@_(r'false')
def FALSE(self, t):
t.value = False
return t
@_(r'null')
def NULL(self, t):
t.value = None
return t return t
class JSONParser(Parser): class JsonParser(Parser):
tokens = JSONLexer.tokens tokens = JsonLexer.tokens
start = "json" start = 'value'
@_('object', @_(r'"{" [ pairs ] "}"')
'array') def value(self, p):
def json(self, p): if p.pairs:
return p[0] return dict(p.pairs)
else:
return {}
@_('"{" members "}"') @_(r'pair { "," pair }')
def object(self, p): def pairs(self, p):
return {key: value for key, value in p.members} return [p.pair0] + p.pair1
@_('pair') @_(r'STRING ":" value')
def members(self, p):
return [p.pair]
@_('pair "," members')
def members(self, p):
return [p.pair] + p.members
@_('STRING ":" value')
def pair(self, p): def pair(self, p):
return p.STRING, p.value return (p.STRING, p.value)
@_('"[" elements "]"') @_(r'"[" [ items ] "]"')
def array(self, p): def value(self, p):
return p.elements if p.items:
return p.items
else:
return []
@_('value') @_(r'value { "," value }')
def elements(self, p): def items(self, p):
return [p.value] return [p.value0] + p.value1
@_('value "," elements')
def elements(self, p):
return [p.value] + p.elements
@_('STRING', @_('STRING',
'INTEGER', 'NUMBER',
'FLOAT', 'TRUE',
'object', 'FALSE',
'array') 'NULL')
def value(self, p): def value(self, p):
return p[0] return p[0]
+3 -11
View File
@@ -71,18 +71,10 @@ class STLParser(Parser):
def stl(self, p): def stl(self, p):
return p.solid return p.solid
@_("SOLID_START NAME_LITERAL facets_list SOLID_END") @_("SOLID_START NAME_LITERAL { facet } SOLID_END")
@_("SOLID_START NAME_LITERAL facets_list SOLID_END NAME_LITERAL") @_("SOLID_START NAME_LITERAL { facet } SOLID_END NAME_LITERAL")
def solid(self, p): def solid(self, p):
return Solid(name=p[1], facets=p.facets_list) return Solid(name=p[1], facets=p.facet)
@_("facet")
def facets_list(self, p):
return [p.facet]
@_("facet facets_list")
def facets_list(self, p):
return [p.facet] + p.facets_list
@_("FACET_START triplet loop FACET_END") @_("FACET_START triplet loop FACET_END")
def facet(self, p): def facet(self, p):