Last active
December 20, 2015 10:49
-
-
Save willkelly/6118960 to your computer and use it in GitHub Desktop.
An extraordinarily stupid parser, probably full of bugs.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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