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

14
sly_examples/stl_parser.py

@ -71,10 +71,18 @@ class STLParser(Parser):
def stl(self, p):
return p.solid
@_("SOLID_START NAME_LITERAL { facet } SOLID_END")
@_("SOLID_START NAME_LITERAL { facet } SOLID_END NAME_LITERAL")
@_("SOLID_START NAME_LITERAL facets_list SOLID_END")
@_("SOLID_START NAME_LITERAL facets_list SOLID_END NAME_LITERAL")
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")
def facet(self, p):

Loading…
Cancel
Save