Add another 3.8 try/finally rule and semantic action

This commit is contained in:
rocky
2019-12-10 22:28:16 -05:00
parent 9b2e22cbaf
commit fb3761e4f3
5 changed files with 26 additions and 9 deletions

View File

@@ -1,6 +1,7 @@
# Self-checking test. # Self-checking test.
# String interpolation tests # String interpolation tests
# RUNNABLE!
var1 = 'x' var1 = 'x'
var2 = 'y' var2 = 'y'
abc = 'def' abc = 'def'

View File

@@ -1,6 +1,7 @@
# Bug in 3.6 was not taking "else" branch after compond "if" # Bug in 3.6 was not taking "else" branch after compond "if"
# In earlier versions we had else detection needed here. # In earlier versions we had else detection needed here.
# RUNNABLE!
def f(a, b, c): def f(a, b, c):
if a and b: if a and b:
x = 1 x = 1

View File

@@ -4,6 +4,7 @@
# showparams(c, test="A", **extra_args) # showparams(c, test="A", **extra_args)
# below # below
# RUNNABLE!
def showparams(c, test, **extra_args): def showparams(c, test, **extra_args):
return {'c': c, **extra_args, 'test': test} return {'c': c, **extra_args, 'test': test}
@@ -44,4 +45,3 @@ d = (2, 3)
assert f(2, **a) == {'c': 2, 'param1': 2, 'test': 'A'} assert f(2, **a) == {'c': 2, 'param1': 2, 'test': 'A'}
assert f3(2, *c, **a) == {'c': 2, 'param1': 2, 'test': 2} assert f3(2, *c, **a) == {'c': 2, 'param1': 2, 'test': 2}
assert f3(*d, **a) == {'c': 2, 'param1': 2, 'test': 3} assert f3(*d, **a) == {'c': 2, 'param1': 2, 'test': 3}

View File

@@ -37,7 +37,9 @@ class Python38Parser(Python37Parser):
stmt ::= forelsestmt38 stmt ::= forelsestmt38
stmt ::= forelselaststmt38 stmt ::= forelselaststmt38
stmt ::= forelselaststmtl38 stmt ::= forelselaststmtl38
stmt ::= tryfinally38 stmt ::= tryfinally38stmt
stmt ::= tryfinally38rstmt
stmt ::= tryfinally38astmt
stmt ::= try_elsestmtl38 stmt ::= try_elsestmtl38
stmt ::= try_except_ret38 stmt ::= try_except_ret38
stmt ::= try_except38 stmt ::= try_except38
@@ -167,17 +169,22 @@ class Python38Parser(Python37Parser):
tryfinallystmt ::= SETUP_FINALLY suite_stmts_opt POP_BLOCK tryfinallystmt ::= SETUP_FINALLY suite_stmts_opt POP_BLOCK
BEGIN_FINALLY COME_FROM_FINALLY suite_stmts_opt BEGIN_FINALLY COME_FROM_FINALLY suite_stmts_opt
END_FINALLY END_FINALLY
tryfinally38 ::= SETUP_FINALLY POP_BLOCK CALL_FINALLY tryfinally38rstmt ::= SETUP_FINALLY POP_BLOCK CALL_FINALLY
returns returns
COME_FROM_FINALLY END_FINALLY suite_stmts COME_FROM_FINALLY END_FINALLY suite_stmts
tryfinally38 ::= SETUP_FINALLY POP_BLOCK CALL_FINALLY tryfinally38rstmt ::= SETUP_FINALLY POP_BLOCK CALL_FINALLY
returns returns
COME_FROM_FINALLY POP_FINALLY returns COME_FROM_FINALLY POP_FINALLY returns
END_FINALLY END_FINALLY
tryfinally_return_stmt ::= SETUP_FINALLY suite_stmts_opt POP_BLOCK tryfinally38stmt ::= SETUP_FINALLY suite_stmts_opt POP_BLOCK
BEGIN_FINALLY COME_FROM_FINALLY BEGIN_FINALLY COME_FROM_FINALLY
POP_FINALLY suite_stmts_opt END_FINALLY POP_FINALLY suite_stmts_opt END_FINALLY
tryfinally38stmt ::= SETUP_FINALLY suite_stmts_opt POP_BLOCK
BEGIN_FINALLY COME_FROM_FINALLY
POP_FINALLY suite_stmts_opt END_FINALLY
tryfinally38astmt ::= LOAD_CONST SETUP_FINALLY suite_stmts_opt POP_BLOCK
BEGIN_FINALLY COME_FROM_FINALLY
POP_FINALLY POP_TOP suite_stmts_opt END_FINALLY POP_TOP
""" """
def __init__(self, debug_parser=PARSER_DEFAULT_DEBUG): def __init__(self, debug_parser=PARSER_DEFAULT_DEBUG):

View File

@@ -104,9 +104,17 @@ def customize_for_version38(self, version):
'try_except_ret38': ( 'try_except_ret38': (
'%|try:\n%+%|return %c%-\n%|except:\n%+%|%c%-\n\n', '%|try:\n%+%|return %c%-\n%|except:\n%+%|%c%-\n\n',
(1, 'expr'), (-1, 'except_ret38a') ), (1, 'expr'), (-1, 'except_ret38a') ),
'tryfinally38': ( 'tryfinally38rstmt': (
'%|try:\n%+%c%-%|finally:\n%+%c%-\n\n', '%|try:\n%+%c%-%|finally:\n%+%c%-\n\n',
(3, 'returns'), 6 ), (3, 'returns'), 6 ),
'tryfinally38stmt': (
'%|try:\n%+%c%-%|finally:\n%+%c%-\n\n',
(1, "suite_stmts_opt"),
(6, "suite_stmts_opt") ),
'tryfinally38_return_stmt': (
'%|try:\n%+%c%-%|finally:\n%+%c%-\n\n',
(2, "suite_stmts_opt"),
(8, "suite_stmts_opt") ),
"named_expr": ( # AKA "walrus operator" "named_expr": ( # AKA "walrus operator"
"%c := %c", (2, "store"), (0, "expr") "%c := %c", (2, "store"), (0, "expr")
) )