diff options
author | Ian Johnson <ian.johnson@appliedlanguage.com> | 2013-11-13 19:08:04 +0400 |
---|---|---|
committer | Ian Johnson <ian.johnson@appliedlanguage.com> | 2013-11-13 19:08:04 +0400 |
commit | 550b0315883b0a4f8f00104bfddf93dcc7141e80 (patch) | |
tree | 8651071b869a0eab0c91112db312924f027bbb17 | |
parent | 5425bdcc53176bfa89cf50eb7d7be2bd4c416a5c (diff) |
Imperative and functional PCL executor visitors now have their own terminal generation methods.
-rw-r--r-- | src/pclc/visitors/do_executor_visitor.py | 13 | ||||
-rw-r--r-- | src/pclc/visitors/executor_visitor.py | 14 | ||||
-rw-r--r-- | src/pclc/visitors/pcl_executor_visitor.py | 13 |
3 files changed, 27 insertions, 13 deletions
diff --git a/src/pclc/visitors/do_executor_visitor.py b/src/pclc/visitors/do_executor_visitor.py index 86ede37..b529063 100644 --- a/src/pclc/visitors/do_executor_visitor.py +++ b/src/pclc/visitors/do_executor_visitor.py @@ -313,6 +313,19 @@ class DoExecutorVisitor(ExecutorVisitor): self._write_line(DoExecutorVisitor.__INSTRUMENTATION_FUNCTION) self._write_line() + def _generate_terminal(self, terminal, scope = None): + if isinstance(terminal, StateIdentifier): + return "s['%s']" % terminal.identifier + elif scope is not None and isinstance(terminal, Identifier) and terminal in scope: + return self._variable_generator.lookup_name(terminal, scope) + elif isinstance(terminal, Identifier): + return "a['%s']" % terminal + elif isinstance(terminal, Literal): + return str(terminal) + else: + raise ValueError("Unexpected terminal in conditional: filename = %s, line no = %d" % \ + (terminal.filename, terminal.lineno)) + @multimethod(Module) def visit(self, module): self._module = module diff --git a/src/pclc/visitors/executor_visitor.py b/src/pclc/visitors/executor_visitor.py index 69f8b15..5094222 100644 --- a/src/pclc/visitors/executor_visitor.py +++ b/src/pclc/visitors/executor_visitor.py @@ -110,18 +110,8 @@ class ExecutorVisitor(object): self._write_lines(body_lines) self._write_line() - def _generate_terminal(self, terminal, scope = None): - if isinstance(terminal, StateIdentifier): - return "s['%s']" % terminal.identifier - elif scope is not None and isinstance(terminal, Identifier) and terminal in scope: - return self._variable_generator.lookup_name(terminal, scope) - elif isinstance(terminal, Identifier): - return "a['%s']" % terminal - elif isinstance(terminal, Literal): - return str(terminal) - else: - raise ValueError("Unexpected terminal in conditional: filename = %s, line no = %d" % \ - (terminal.filename, terminal.lineno)) + def _generate_terminal(self, terminal, scope): + raise NotImplementedError def _generate_condition(self, cond_expr, scope = None): # Terminal! diff --git a/src/pclc/visitors/pcl_executor_visitor.py b/src/pclc/visitors/pcl_executor_visitor.py index 06e9332..1cc98bc 100644 --- a/src/pclc/visitors/pcl_executor_visitor.py +++ b/src/pclc/visitors/pcl_executor_visitor.py @@ -87,6 +87,17 @@ class PCLExecutorVisitor(ExecutorVisitor): self._write_line(PCLExecutorVisitor.__INSTRUMENTATION_FUNCTIONS) self._write_line() + def _generate_terminal(self, terminal, scope = None): + if isinstance(terminal, StateIdentifier): + return "s['%s']" % terminal.identifier + elif isinstance(terminal, Identifier): + return "a['%s']" % terminal + elif isinstance(terminal, Literal): + return str(terminal) + else: + raise ValueError("Unexpected terminal in conditional: filename = %s, line no = %d" % \ + (terminal.filename, terminal.lineno)) + @multimethod(Module) def visit(self, module): self._module = module @@ -279,7 +290,7 @@ class PCLExecutorVisitor(ExecutorVisitor): for m in merge_expr.literal_mapping] mapping = ", ".join(top_mappings + bottom_mappings + literal_mappings) self._write_line("%s = cons_unsplit_wire(lambda t, b: {%s})" % \ - (self._get_var(merge_expr), + (self._variable_generator.get_name(merge_expr), mapping)) @staticmethod |