diff options
author | Reinier Heeres <reinier@heeres.eu> | 2009-09-15 22:20:18 (GMT) |
---|---|---|
committer | Reinier Heeres <reinier@heeres.eu> | 2009-09-15 22:20:18 (GMT) |
commit | 5919fe241f327eb5e4a032770044015aa9d14846 (patch) | |
tree | 74d5bb6371b5bdf9188322f7dc6aa0eb37fc276f /astparser.py | |
parent | 59032155266afe77922d33ee54633485dd2e9eb6 (diff) |
AST Parser fixes
Diffstat (limited to 'astparser.py')
-rw-r--r-- | astparser.py | 37 |
1 files changed, 27 insertions, 10 deletions
diff --git a/astparser.py b/astparser.py index 7bedcf8..c5b2e4f 100644 --- a/astparser.py +++ b/astparser.py @@ -373,9 +373,12 @@ class AstParser: if node is None: return None - elif isinstance(node, ast.Expression) or isinstance(node, ast.Module): + elif isinstance(node, ast.Expression): return self._process_node(node.body, state) + elif isinstance(node, ast.Expr): + return self._process_node(node.value, state) + elif isinstance(node, ast.BinOp): left = self._process_node(node.left, state) right = self._process_node(node.right, state) @@ -451,20 +454,24 @@ class AstParser: state.used_var_ofs[node.id] = node.col_offset var = self.get_var(node.id) - if type(var) is ast.Expression: - try: + try: + if type(var) is ast.Expression: return self._process_node(var.body, state) - except ParserError, e: - e.set_range(ofs, ofs + len(node.id)) - raise e - else: - return var + elif type(var) is ast.Expr: + return self._process_node(var.value, state) + else: + return var + except ParserError, e: + logging.debug('error: %r', e) + e.set_range(ofs, ofs + len(node.id)) + raise e + else: if isfunc: msg = _("Function '%s' not defined") % (node.id) else: msg = _("Variable '%s' not defined") % (node.id) - raise RuntimeError(msg, ofs, ofs + len(node.id)) + raise RuntimeError(msg, ofs, ofs + len(node.id)) elif isinstance(node, ast.Attribute): parent = self._process_node(node.value, state) @@ -565,11 +572,17 @@ class AstParser: logging.debug('Parsing preprocessed equation: %r', eqn) try: - tree = compile(eqn, '<string>', 'eval', ast.PyCF_ONLY_AST) + tree = compile(eqn, '<string>', 'exec', ast.PyCF_ONLY_AST) except SyntaxError, e: msg = _('Parse error') raise ParseError(msg, e.offset - 1) + if isinstance(tree, ast.Module): + if len(tree.body) != 1: + msg = _("Multiple statements not supported") + raise ParseError(msg) + return tree.body[0] + return tree def evaluate(self, eqn): @@ -655,6 +668,10 @@ if __name__ == '__main__': ret = p.evaluate(eqn) print 'Eqn: %s, ret: %s' % (eqn, ret) + eqn = 'a = 1' + tree = p.parse(eqn) + p.print_tree(tree) + eqn = '12 * 1 + 3 * (apples - 1)' tree = p.parse(eqn) print 'Tree before:' |