[pypy-svn] r15896 - in pypy/dist/pypy/interpreter/pyparser: . test test/samples

adim at codespeak.net adim at codespeak.net
Wed Aug 10 10:46:36 CEST 2005


Author: adim
Date: Wed Aug 10 10:46:34 2005
New Revision: 15896

Added:
   pypy/dist/pypy/interpreter/pyparser/test/samples/snippet_exceptions.py
Modified:
   pypy/dist/pypy/interpreter/pyparser/astbuilder.py
   pypy/dist/pypy/interpreter/pyparser/test/test_astbuilder.py
Log:
implemented try/except/finally/raise



Modified: pypy/dist/pypy/interpreter/pyparser/astbuilder.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyparser/astbuilder.py	(original)
+++ pypy/dist/pypy/interpreter/pyparser/astbuilder.py	Wed Aug 10 10:46:34 2005
@@ -665,6 +665,79 @@
         names.append(token.value)
     builder.push(ast.Global(names))
 
+
+def build_raise_stmt(builder, nb):
+    """raise_stmt: 'raise' [test [',' test [',' test]]]"""
+    L = get_atoms(builder, nb)
+    l = len(L)
+    expr1 = None
+    expr2 = None
+    expr3 = None
+    if l >= 2:
+        expr1 = L[1]
+        if l >= 4:
+            expr2 = L[3]
+            if l == 6:
+                expr3 = L[5]
+    builder.push(ast.Raise(expr1, expr2, expr3))
+
+def build_try_stmt(builder, nb):
+    """
+    try_stmt: ('try' ':' suite (except_clause ':' suite)+ #diagram:break
+               ['else' ':' suite] | 'try' ':' suite 'finally' ':' suite)
+    # NB compile.c makes sure that the default except clause is last
+    except_clause: 'except' [test [',' test]]
+   
+    """
+    L = get_atoms(builder, nb)
+    l = len(L)
+    handlers = []
+    else_ = None
+    body = L[2]
+    token = L[3]
+    assert isinstance(token, TokenObject)
+    if token.value == 'finally':
+        builder.push(ast.TryFinally(body, L[5]))
+    else: # token.value == 'except'
+        index = 3
+        while index < l and L[index].value == 'except':
+            tokens_read, expr1, expr2, except_body = parse_except_clause(L[index:])
+            handlers.append((expr1, expr2, except_body))
+            index += tokens_read
+        if index < l:
+            token = L[index]
+            assert isinstance(token, TokenObject)
+            assert token.value == 'else'
+            else_ = L[index+2] # skip ':'
+        builder.push(ast.TryExcept(body, handlers, else_))
+
+
+def parse_except_clause(tokens):
+    """parses 'except' [test [',' test]] ':' suite
+    and returns a 4-tuple : (tokens_read, expr1, expr2, except_body)
+    """
+    clause_length = 1
+    # Read until end of except clause (bound by following 'else',
+    # or 'except' or end of tokens)
+    while clause_length < len(tokens):
+        token = tokens[clause_length]
+        if isinstance(token, TokenObject) and \
+           (token.value == 'except' or token.value == 'else'):
+            break
+        clause_length += 1
+    # if clause_length >= len(tokens):
+    #     raise Exception
+    if clause_length == 3:
+        # case 'except: body'
+        return (3, None, None, tokens[2])
+    elif clause_length == 4:
+        # case 'except Exception: body':
+        return (4, tokens[1], None, tokens[3])
+    else:
+        # case 'except Exception, exc: body'
+        return (6, tokens[1], to_lvalue(tokens[3], consts.OP_ASSIGN), tokens[5])
+
+
 def parse_dotted_names(tokens):
     """parses NAME('.' NAME)* and returns full dotted name
 
@@ -872,6 +945,8 @@
     sym.exec_stmt : build_exec_stmt,
     sym.print_stmt : build_print_stmt,
     sym.global_stmt : build_global_stmt,
+    sym.raise_stmt : build_raise_stmt,
+    sym.try_stmt : build_try_stmt,
     # sym.parameters : build_parameters,
     }
 

Added: pypy/dist/pypy/interpreter/pyparser/test/samples/snippet_exceptions.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/interpreter/pyparser/test/samples/snippet_exceptions.py	Wed Aug 10 10:46:34 2005
@@ -0,0 +1,54 @@
+try:
+    a
+    b
+except:
+    pass
+
+try:
+    a
+    b
+except NameError:
+    pass
+
+try:
+    a
+    b
+except NameError, err:
+    pass
+
+try:
+    a
+    b
+except (NameError, ValueError):
+    pass
+
+
+try:
+    a
+    b
+except (NameError, ValueError), err:
+    pass
+
+try:
+    a
+except NameError, err:
+    pass
+except ValueError, err:
+    pass
+
+try:
+    a
+except NameError, err:
+    pass
+except ValueError, err:
+    pass
+else:
+    pass
+
+try:
+    a
+finally:
+    b
+
+
+

Modified: pypy/dist/pypy/interpreter/pyparser/test/test_astbuilder.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyparser/test/test_astbuilder.py	(original)
+++ pypy/dist/pypy/interpreter/pyparser/test/test_astbuilder.py	Wed Aug 10 10:46:34 2005
@@ -162,6 +162,84 @@
     'global a,b,c',
     ]
 
+raises = [
+    'raise',
+    'raise ValueError',
+    'raise ValueError("error")',
+    'raise ValueError, "error"',
+    'raise ValueError, "error", foo',
+    ]
+
+tryexcepts = [
+    """try:
+    a
+    b
+except:
+    pass
+""",
+    """try:
+    a
+    b
+except NameError:
+    pass
+""",
+    """try:
+    a
+    b
+except NameError, err:
+    pass
+""",
+    """try:
+    a
+    b
+except (NameError, ValueError):
+    pass
+""",
+    """try:
+    a
+    b
+except (NameError, ValueError), err:
+    pass
+""",
+    """try:
+    a
+except NameError, err:
+    pass
+except ValueError, err:
+    pass
+""",
+    """try:
+    a
+except NameError, err:
+    a = 1
+    b = 2
+except ValueError, err:
+    a = 2
+    return a
+"""
+    """try:
+    a
+except NameError, err:
+    a = 1
+except ValueError, err:
+    a = 2
+else:
+    a += 3
+""",
+    """try:
+    a
+finally:
+    b
+""",
+    """try:
+    return a
+finally:
+    a = 3
+    return 1
+""",
+
+    ]
+    
 one_stmt_funcdefs = [
     "def f(): return 1",
     "def f(x): return x+1",
@@ -189,11 +267,13 @@
     execs,
     prints,
     globs,
+    raises,
     ]
 
 EXEC_INPUTS = [
     one_stmt_funcdefs,
     if_stmts,
+    tryexcepts,
     ]
 
 TARGET_DICT = {
@@ -242,6 +322,7 @@
     'snippet_while.py',
     'snippet_import_statements.py',
     'snippet_generator.py',
+    'snippet_exceptions.py',
 #    'snippet_2.py',
 #    'snippet_3.py',
 #    'snippet_4.py',



More information about the Pypy-commit mailing list