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 21:24:27 +0400
committerIan Johnson <ian.johnson@appliedlanguage.com>2013-11-13 21:24:27 +0400
commit8285dabf2c783359a41e0a2b270761cff64373ac (patch)
treec68a619f6efa8a7d5731e976783e6ebab02a03a3
parent27128201e4a974dac7caf60d7928d0d5cc6b04a5 (diff)
Return now supports literals.
-rw-r--r--src/pclc/parser/pcl_parser.py5
-rw-r--r--src/pclc/visitors/first_pass_resolver_visitor.py23
2 files changed, 26 insertions, 2 deletions
diff --git a/src/pclc/parser/pcl_parser.py b/src/pclc/parser/pcl_parser.py
index 925b631..d090e0e 100644
--- a/src/pclc/parser/pcl_parser.py
+++ b/src/pclc/parser/pcl_parser.py
@@ -457,9 +457,10 @@ def p_function_arg(p):
def p_return_command(p):
'''return_command : RETURN '(' ')'
- | RETURN function_arg'''
+ | RETURN function_arg
+ | RETURN literal'''
if len(p) > 3:
- p[0] = Return(p.parser.filename, -1)
+ p[0] = Return(p.parser.filename, p.lineno(1))
else:
p[0] = Return(p.parser.filename, p.lineno(1), p[2])
diff --git a/src/pclc/visitors/first_pass_resolver_visitor.py b/src/pclc/visitors/first_pass_resolver_visitor.py
index da97321..455c96e 100644
--- a/src/pclc/visitors/first_pass_resolver_visitor.py
+++ b/src/pclc/visitors/first_pass_resolver_visitor.py
@@ -939,6 +939,29 @@ class FirstPassResolverVisitor(ResolverVisitor):
# Record the current scope in the entity's resolution symbols
ret['scope'] = self._current_scope
+ if ret.value:
+ if isinstance(ret.value, StateIdentifier):
+ self._add_errors("ERROR: %(filename)s at line %(lineno)d, unknown configuration in return %(unknown)s",
+ [ret.value] if ret.value not in self._module.resolution_symbols['configuration'] else [],
+ lambda v: {'filename' : v.filename,
+ 'lineno' : v.lineno,
+ 'unknown' : str(ret.value)})
+ elif isinstance(ret.value, Identifier):
+ if ret.value in self._module.definition.outputs:
+ self._add_errors("ERROR: %(filename)s at line %(lineno)d, output signal used in return %(unknown)s",
+ [ret.value],
+ lambda v: {'filename' : v.filename,
+ 'lineno' : v.lineno,
+ 'unknown' : str(ret.value)})
+ else:
+ self._add_errors("ERROR: %(filename)s at line %(lineno)d, unknown variable in return %(unknown)s",
+ [ret.value] if ret.value not in self._current_scope and \
+ ret.value not in self._module.definition.inputs else [],
+ lambda v: {'filename' : v.filename,
+ 'lineno' : v.lineno,
+ 'unknown' : str(ret.value)})
+
+
if not ret.mappings:
return