Compare commits

..

No commits in common. '4faa1540d85f4c5eb00c5023e6690e63f753431c' and 'c1316d0600af3a44ef9801935258871e9e02de70' have entirely different histories.

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

92
sly_examples/json_parser.py

@ -16,72 +16,70 @@ Little reminder: here's the grammar
""" """
class JsonLexer(Lexer): class JSONLexer(Lexer):
tokens = {STRING, NUMBER, TRUE, FALSE, NULL} tokens = {"FLOAT", "INTEGER", "STRING"}
ignore = ' \t\n\r'
literals = {'{', '}', '[', ']', ':', ','}
@_(r'-?(0|[1-9][0-9]*)(\.[0-9]+)?([Ee][+-]?[0-9]+)?') literals = {'{', '}', '[', ']', ',', ':'}
def NUMBER(self, t): ignore = " \t\n"
t.value = float(t.value)
return t
@_(r'"([ !#-\[\]-\U0010ffff]+|\\(["\/\\bfnrt]|u[0-9A-Fa-f]{4}))*"') @_(r"\".*?\"")
def STRING(self, t): def STRING(self, t):
t.value = json_unescape(t.value) t.value = t.value.strip("\"")
return t return t
@_(r'true') @_(r"\d+\.\d*")
def TRUE(self, t): def FLOAT(self, t):
t.value = True t.value = float(t.value)
return t return t
@_(r'false') @_(r"\d+")
def FALSE(self, t): def INTEGER(self, t):
t.value = False t.value = int(t.value)
return t return t
@_(r'null')
def NULL(self, t):
t.value = None
return t
class JSONParser(Parser):
tokens = JSONLexer.tokens
start = "json"
class JsonParser(Parser): @_('object',
tokens = JsonLexer.tokens 'array')
start = 'value' def json(self, p):
return p[0]
@_(r'"{" [ pairs ] "}"') @_('"{" members "}"')
def value(self, p): def object(self, p):
if p.pairs: return {key: value for key, value in p.members}
return dict(p.pairs)
else: @_('pair')
return {} def members(self, p):
return [p.pair]
@_(r'pair { "," pair }') @_('pair "," members')
def pairs(self, p): def members(self, p):
return [p.pair0] + p.pair1 return [p.pair] + p.members
@_(r'STRING ":" value') @_('STRING ":" value')
def pair(self, p): def pair(self, p):
return (p.STRING, p.value) return p.STRING, p.value
@_(r'"[" [ items ] "]"') @_('"[" elements "]"')
def value(self, p): def array(self, p):
if p.items: return p.elements
return p.items
else: @_('value')
return [] def elements(self, p):
return [p.value]
@_(r'value { "," value }') @_('value "," elements')
def items(self, p): def elements(self, p):
return [p.value0] + p.value1 return [p.value] + p.elements
@_('STRING', @_('STRING',
'NUMBER', 'INTEGER',
'TRUE', 'FLOAT',
'FALSE', 'object',
'NULL') 'array')
def value(self, p): def value(self, p):
return p[0] return p[0]

14
sly_examples/stl_parser.py

@ -71,10 +71,18 @@ class STLParser(Parser):
def stl(self, p): def stl(self, p):
return p.solid return p.solid
@_("SOLID_START NAME_LITERAL { facet } SOLID_END") @_("SOLID_START NAME_LITERAL facets_list SOLID_END")
@_("SOLID_START NAME_LITERAL { facet } SOLID_END NAME_LITERAL") @_("SOLID_START NAME_LITERAL facets_list SOLID_END NAME_LITERAL")
def solid(self, p): def solid(self, p):
return Solid(name=p[1], facets=p.facet) 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
@_("FACET_START triplet loop FACET_END") @_("FACET_START triplet loop FACET_END")
def facet(self, p): def facet(self, p):

Loading…
Cancel
Save