Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ianj-als/pcl.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Johnson <ian.johnson@appliedlanguage.com>2013-11-13 19:08:04 +0400
committerIan Johnson <ian.johnson@appliedlanguage.com>2013-11-13 19:08:04 +0400
commit550b0315883b0a4f8f00104bfddf93dcc7141e80 (patch)
tree8651071b869a0eab0c91112db312924f027bbb17
parent5425bdcc53176bfa89cf50eb7d7be2bd4c416a5c (diff)
Imperative and functional PCL executor visitors now have their own terminal generation methods.
-rw-r--r--src/pclc/visitors/do_executor_visitor.py13
-rw-r--r--src/pclc/visitors/executor_visitor.py14
-rw-r--r--src/pclc/visitors/pcl_executor_visitor.py13
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