diff options
author | Peter Wu <lekensteyn@gmail.com> | 2011-12-01 15:47:34 +0000 |
---|---|---|
committer | Peter Wu <lekensteyn@gmail.com> | 2011-12-01 15:47:34 +0000 |
commit | 8247c54b7bf96d467a28774a97c963534d140a69 (patch) | |
tree | d8f6f76820fa9cec63dea685933057ccd2f87906 /Variables.py | |
parent | e9e743876258e072ae8d07d0977157f9435a0008 (diff) | |
download | pp2cc-8247c54b7bf96d467a28774a97c963534d140a69.tar.gz |
Split classes in separate files
Diffstat (limited to 'Variables.py')
-rw-r--r-- | Variables.py | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/Variables.py b/Variables.py new file mode 100644 index 0000000..1d37f0f --- /dev/null +++ b/Variables.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python +"""Compiles C into assembly for the practicum processor (PP2) + +All rights reserved, you may not redistribute or use this program without prior +permission from Peter Wu or Xander Houtman. Use of this program is entirely +your own risk. In no circumstances can the authors of this program be held +responsible for any damage including, but not limited to, financial damage or +data loss. Modification of this program is not allowed without prior +permission. The generated output (assembly and messages) are not subject to +this license. +""" + +__author__ = "Peter Wu" +__copyright__ = "Copyright 2011, Peter Wu" +__credits__ = ["Peter Wu"] +__license__ = "Proprietary" +__version__ = "1.0" +__maintainer__ = "Peter Wu" +__email__ = "uwretep@gmail.com" + +class Variables(object): + def __init__(self, defined_names, parent_variables): + """A scope for holding variable names + + Keywords arguments: + defined_names -- A list of defined variables to which additional + variables might be appended + parent_variables -- the parent Variables object. If None, it's a global + variable scope + """ + self.local_vars = {} + self.defined_names = defined_names + self.parent_variables = parent_variables + def uniqName(self, name): + """Returns an unique variable name""" + uniq_name = name + i = 0 + while uniq_name in self.defined_names: + uniq_name = name + "_" + str(i) + i += 1 + return uniq_name + def getName(self, name): + """Gets the name of a declared variable as it appears in the @DATA + section""" + if name in self.local_vars: + return self.local_vars[name] + if self.parent_variables: + return self.parent_variables.getName(name) + raise RuntimeError("Use of undefined variable '{}'".format(name)) + def declName(self, name, size=1, prefix="var"): + """Declares a variable in the nearest scope and returns the label + name""" + if name in self.local_vars: + raise RuntimeError("Redeclaration of variable '{}'".format(name)) + # global variables are prefixed "var_", locals with "varl_" + var_name = prefix + ("l_" if self.parent_variables else "_") + name + var_name = self.uniqName(var_name) + self.local_vars[name] = var_name + self.defined_names[var_name] = size + return var_name |