Skip to content

Instantly share code, notes, and snippets.

@willkelly
Last active December 20, 2015 10:49
Show Gist options
  • Save willkelly/6118960 to your computer and use it in GitHub Desktop.
Save willkelly/6118960 to your computer and use it in GitHub Desktop.
An extraordinarily stupid parser, probably full of bugs.
#!/usr/bin/python
states = ["START", "RESOURCE", "ACTION", "PROPERTY", "SUBRESOURCE", "SUBRESOURCE_END", "END"]
transitions = {
"START": ["RESOURCE"],
"RESOURCE": ["ACTION"],
"ACTION": ["SUBRESOURCE", "PROPERTY"],
"PROPERTY": ["SUBRESOURCE", "PROPERTY", "SUBRESOURCE_END", "END"],
"SUBRESOURCE": ["PROPERTY", "SUBRESOURCE"],
"SUBRESOURCE_END": ["PROPERTY", "END", "SUBRESOURCE"]}
def dumbparse(args):
state = "START"
resource = {}
subresource = None
while state != "END":
if len(args) == 0:
args.append(None)
value, next_state = classify(args[0], state)
if next_state not in transitions[state]:
raise ValueError("Expecting one of %s, found %s" % (transitions[state], next_state))
state = next_state
if state == "END":
break
elif state == 'RESOURCE':
resource["type"] = value
resource[resource["type"]] = {}
elif state == "ACTION":
resource["action"] = value
elif state == "PROPERTY":
if subresource is not None:
subresource[value[0]] = value[1]
else:
resource[resource['type']][value[0]] = value[1]
elif state == "SUBRESOURCE":
name = pluralize(value)
if name in resource:
if not type(resource[name] == type(list)):
raise ValueError("Property conflict on %s" % (name))
resource[name].append({"type": value})
else:
resource[name] = [{"type": value}]
subresource = resource[name][-1]
elif state == "SUBRESOURCE_END":
subresource = None
args = args[1:]
return resource
def pluralize(s):
return "%ss" % s
def classify(s, state):
if s is None:
return None, "END"
if s.find("-") == 0:
if s == "--":
return None, "SUBRESOURCE_END"
value = s.lstrip("-")
if value.find("=") >= 0:
k, v = value.split("=")
return (k,v), "PROPERTY"
else:
return value, "SUBRESOURCE"
elif state == "RESOURCE":
return s, "ACTION"
else:
return s, "RESOURCE"
if __name__ == "__main__":
import sys
from pprint import pprint
pprint(dumbparse(sys.argv[1:]))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment