Beispiel #1
0
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
Beispiel #2
0
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
Beispiel #3
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())
Beispiel #4
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())
Beispiel #5
0
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)
Beispiel #6
0
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)
Beispiel #7
0
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]
Beispiel #8
0
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]
Beispiel #9
0
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
Beispiel #10
0
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])
Beispiel #11
0
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])
Beispiel #12
0
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
Beispiel #13
0
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])
Beispiel #14
0
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
Beispiel #15
0
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
Beispiel #16
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
Beispiel #17
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
Beispiel #18
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
Beispiel #19
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