Compare commits

..

2 Commits

  1. 92
      sly_examples/json_parser.py
  2. 14
      sly_examples/stl_parser.py

92
sly_examples/json_parser.py

@ -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):
t.value = float(t.value)
return t
@_(r"\".*?\"") @_(r'"([ !#-\[\]-\U0010ffff]+|\\(["\/\\bfnrt]|u[0-9A-Fa-f]{4}))*"')
def STRING(self, t): def STRING(self, t):
t.value = t.value.strip("\"") t.value = json_unescape(t.value)
return t return t
@_(r"\d+\.\d*") @_(r'true')
def FLOAT(self, t): def TRUE(self, t):
t.value = float(t.value) t.value = True
return t return t
@_(r"\d+") @_(r'false')
def INTEGER(self, t): def FALSE(self, t):
t.value = int(t.value) t.value = False
return t return t
@_(r'null')
def NULL(self, t):
t.value = None
return t
class JSONParser(Parser):
tokens = JSONLexer.tokens
start = "json"
@_('object', class JsonParser(Parser):
'array') tokens = JsonLexer.tokens
def json(self, p): start = 'value'
return p[0]
@_('"{" members "}"') @_(r'"{" [ pairs ] "}"')
def object(self, p): def value(self, p):
return {key: value for key, value in p.members} if p.pairs:
return dict(p.pairs)
@_('pair') else:
def members(self, p): return {}
return [p.pair]
@_('pair "," members') @_(r'pair { "," pair }')
def members(self, p): def pairs(self, p):
return [p.pair] + p.members return [p.pair0] + p.pair1
@_('STRING ":" value') @_(r'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
@_('value') else:
def elements(self, p): return []
return [p.value]
@_('value "," elements') @_(r'value { "," value }')
def elements(self, p): def items(self, p):
return [p.value] + p.elements return [p.value0] + p.value1
@_('STRING', @_('STRING',
'INTEGER', 'NUMBER',
'FLOAT', 'TRUE',
'object', 'FALSE',
'array') 'NULL')
def value(self, p): def value(self, p):
return p[0] return p[0]

14
sly_examples/stl_parser.py

@ -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):

Loading…
Cancel
Save