[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