You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-03 00:45:53 +08:00
54 lines
1.9 KiB
Python
54 lines
1.9 KiB
Python
# Copyright (c) 2016-2017 Rocky Bernstein
|
|
"""
|
|
spark grammar differences over Python 3.1 for Python 3.0.
|
|
"""
|
|
from __future__ import print_function
|
|
|
|
from uncompyle6.parser import PythonParserSingle
|
|
from uncompyle6.parsers.parse31 import Python31Parser
|
|
|
|
class Python30Parser(Python31Parser):
|
|
|
|
def p_30(self, args):
|
|
"""
|
|
# Store locals is only in Python 3.0 to 3.3
|
|
stmt ::= store_locals
|
|
store_locals ::= LOAD_FAST STORE_LOCALS
|
|
|
|
# FIXME: combine with parse3.2
|
|
whileTruestmt ::= SETUP_LOOP l_stmts_opt JUMP_BACK
|
|
COME_FROM_LOOP
|
|
whileTruestmt ::= SETUP_LOOP return_stmts
|
|
COME_FROM_LOOP
|
|
|
|
# In many ways Python 3.0 code generation is more like Python 2.6 than
|
|
# it is 2.7 or 3.1. So we have a number of 2.6ish (and before) rules below
|
|
|
|
_ifstmts_jump ::= c_stmts_opt JUMP_FORWARD _come_froms POP_TOP COME_FROM
|
|
jmp_true ::= JUMP_IF_TRUE POP_TOP
|
|
jmp_false ::= JUMP_IF_FALSE POP_TOP
|
|
|
|
# Used to keep index order the same in semantic actions
|
|
jb_pop_top ::= JUMP_BACK POP_TOP
|
|
|
|
while1stmt ::= SETUP_LOOP l_stmts COME_FROM_LOOP
|
|
|
|
else_suitel ::= l_stmts COME_FROM_LOOP JUMP_BACK
|
|
|
|
ifelsestmtl ::= testexpr c_stmts_opt jb_pop_top else_suitel
|
|
|
|
withasstmt ::= expr setupwithas store suite_stmts_opt
|
|
POP_BLOCK LOAD_CONST COME_FROM_FINALLY
|
|
LOAD_FAST DELETE_FAST WITH_CLEANUP END_FINALLY
|
|
setupwithas ::= DUP_TOP LOAD_ATTR STORE_FAST LOAD_ATTR CALL_FUNCTION_0 setup_finally
|
|
setup_finally ::= STORE_FAST SETUP_FINALLY LOAD_FAST DELETE_FAST
|
|
"""
|
|
|
|
def customize_grammar_rules(self, tokens, customize):
|
|
super(Python30Parser, self).customize_grammar_rules(tokens, customize)
|
|
return
|
|
pass
|
|
|
|
class Python30ParserSingle(Python30Parser, PythonParserSingle):
|
|
pass
|