diff options
author | Ian Johnson <ian.johnson@appliedlanguage.com> | 2013-11-13 21:24:27 +0400 |
---|---|---|
committer | Ian Johnson <ian.johnson@appliedlanguage.com> | 2013-11-13 21:24:27 +0400 |
commit | 8285dabf2c783359a41e0a2b270761cff64373ac (patch) | |
tree | c68a619f6efa8a7d5731e976783e6ebab02a03a3 | |
parent | 27128201e4a974dac7caf60d7928d0d5cc6b04a5 (diff) |
Return now supports literals.
-rw-r--r-- | src/pclc/parser/pcl_parser.py | 5 | ||||
-rw-r--r-- | src/pclc/visitors/first_pass_resolver_visitor.py | 23 |
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 |