Browse Source

Updated both parsers to include the new ENBF rules.

master
hadware 6 years ago
parent
commit
e18017d5cf
  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):
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]

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

Loading…
Cancel
Save