def p_func_stmt(p): """func_stmt : FUNCTION ident lambda_args SEMI | FUNCTION ret EQ ident lambda_args SEMI """ # stmt_list of func_stmt is set below # marked with XYZZY global ret_expr, use_nargin, use_varargin ret_expr = node.expr_list() use_varargin = use_nargin = 0 if len(p) == 5: assert isinstance(p[3], node.expr_list) p[0] = node.func_stmt( ident=p[2], ret=node.expr_list(), args=p[3], stmt_list=node.stmt_list()) ret_expr = node.expr_list() elif len(p) == 7: assert isinstance(p[2], node.expr_list) assert isinstance(p[5], node.expr_list) p[0] = node.func_stmt( ident=p[4], ret=p[2], args=p[5], stmt_list=node.stmt_list()) ret_expr = p[2] else: assert 0
def p_try_catch(p): """ try_catch : TRY stmt_list CATCH stmt_list END_STMT | TRY stmt_list END_STMT """ assert isinstance(p[2],node.stmt_list) #assert isinstance(p[4],node.stmt_list) p[0] = node.try_catch(try_stmt=p[2], catch_stmt=node.stmt_list(), # FIXME finally_stmt=node.stmt_list())
def p_top(p): """ top : | stmt_list | top func_decl stmt_list_opt | top func_decl stmt_list END_STMT semi_opt """ if len(p) == 1: p[0] = node.stmt_list() elif len(p) == 2: p[0] = p[1] else: # we backpatch the func_decl node assert p[2].__class__ is node.func_decl p[2].use_nargin = use_nargin try: if p[3][-1].__class__ is not node.return_stmt: p[3].append(node.return_stmt(ret_expr)) except: raise syntax_error(p) p[0] = p[1] p[0].append(node.function(head=p[2],body=p[3])) assert isinstance(p[0],node.stmt_list)
def p_top(p): """ top : | stmt_list | top func_decl stmt_list_opt | top func_decl END_STMT semi_opt | top func_decl stmt_list END_STMT semi_opt """ if len(p) == 1: p[0] = node.stmt_list() elif len(p) == 2: p[0] = p[1] else: # we backpatch the func_decl node assert p[2].__class__ is node.func_decl p[2].use_nargin = use_nargin p[2].use_varargin = use_varargin try: if p[3][-1].__class__ is not node.return_stmt: p[3].append(node.return_stmt(ret_expr)) except: raise syntax_error(p) p[0] = p[1] p[0].append(node.function(head=p[2],body=p[3])) assert isinstance(p[0],node.stmt_list)
def p_stmt_list_opt(p): """ stmt_list_opt : | stmt_list """ if len(p) == 1: p[0] = node.stmt_list() else: p[0] = p[1]
def _backend(self, level=0): s = "if %s:%s" % (self.cond_expr._backend(), self.then_stmt._backend(level + 1)) if self.else_stmt: # Eech. This should have been handled in the parser. if self.else_stmt.__class__ == node.if_stmt: self.else_stmt = node.stmt_list([self.else_stmt]) s += "\n" + indent * level s += "else:%s" % self.else_stmt._backend(level + 1) return s
def p_top(p): """ top : | top stmt """ if len(p) == 1: p[0] = node.stmt_list() else: p[0] = p[1] p[0].append(p[2])
def p_top(p): """ top : | top stmt | top END_STMT """ if len(p) == 1: p[0] = node.stmt_list() else: p[0] = p[1] if type(p[2]) != str: p[0].append(p[2])
def p_stmt_list(p): """ stmt_list : stmt | stmt_list stmt """ if len(p) == 2: p[0] = node.stmt_list([p[1]] if p[1] else []) elif len(p) == 3: p[0] = p[1] if p[2]: p[0].append(p[2]) else: assert 0
def p_elseif_stmt(p): """ elseif_stmt : | ELSE stmt_list_opt | ELSEIF expr sep stmt_list_opt elseif_stmt """ if len(p) == 1: p[0] = node.stmt_list() elif len(p) == 3: p[0] = p[2] elif len(p) == 6: p[0] = node.if_stmt(cond_expr=p[2], then_stmt=p[4], else_stmt=p[5]) else: assert 0
def p_case_list(p): """ case_list : | CASE expr sep stmt_list_opt case_list | OTHERWISE stmt_list """ if len(p) == 1: p[0] = node.stmt_list() elif len(p) == 3: assert isinstance(p[2],node.stmt_list) p[0] = p[2] elif len(p) == 6: p[0] = node.if_stmt(cond_expr=node.expr(op="==", args=node.expr_list([p[2]])), then_stmt=p[4], else_stmt=p[5]) p[0].cond_expr.args.append(None) # None will be replaced using backpatch() else: assert 0