def p_parameters(p):
    '''parameters :  LP  para_decl_list  RP
                |  empty'''
    if len(p) == 4:
        p[0] = Node("parameters", [p[2]])
        p[0].list = p[2].list
    else:
        p[0] = Node("parameters", [p[1]])
        p[0].list = []
def p_name_list(p):
    '''name_list :  name_list  COMMA  NAME
                |  NAME'''
    if len(p) == 4:
        p[0] = Node("name_list", [p[1]])
        p[0].list = p[1].list + [p[3]]
    else:
        p[0] = Node("name_list", [p[1]])
        p[0].list = [p[1]]
def p_field_decl_list(p):
    '''field_decl_list :  field_decl_list  field_decl
                |  field_decl'''
    if len(p) == 3:
        p[0] = Node("field_decl_list", [p[1], p[2]])
        p[0].list = p[1].list + p[2].list
    else:
        p[0] = Node("field_decl_list", [p[1]])
        p[0].list = p[1].list
def p_args_list(p):
    """args_list :  args_list  COMMA  expression
            |  expression"""

    if len(p) == 4:
        p[0] = Node("args_list", [p[1], p[3]])
        p[0].list = p[1].list + [p[3]]
    elif len(p) == 2:
        p[0] = Node("expression", [p[1]])
        p[0].list = [p[1]]
def p_para_decl_list(p):
    '''para_decl_list :  para_decl_list  SEMI  para_type_list
                | para_type_list'''
    if len(p) == 4:
        p[0] = Node("para_decl_list", [p[1], p[3]])

        p[0].list = p[1].list + p[3].list
    else:
        p[0] = Node("para_decl_list", [p[1]])

        p[0].list = p[1].list
def p_expression_list(p):
    '''expression_list :  expression_list  COMMA  expression
                |  expression'''
    if len(p) == 4:
        p[0] = Node("expression_list-expression_list", [p[1], p[3]])
        if hasattr(p[3], 'symbol'):
            p[0].list = p[1].list + [p[3].symbol]
        else:
            p[0].list = p[1].list + [p[3].value]

    elif len(p) == 2:
        p[0] = Node("expression_list-expression", [p[1]])
        if hasattr(p[1], 'symbol'):
            p[0].list = [p[1].symbol]
        else:
            p[0].list = [p[1].value]
def p_val_para_list(p):
    # 值传递
    '''val_para_list :  name_list
                    '''
    p[0] = Node("val_para_list", [p[1]])

    p[0].list = p[1].list
def p_var_para_list(p):
    '''var_para_list :  VAR  name_list'''
    # TODO 引用传递
    p[0] = Node("var_para_list", [p[2]])

    p[0].list = p[2].list
def p_para_type_list_2(p):
    '''para_type_list :  val_para_list  COLON  simple_type_decl'''

    p[0] = Node("para_type_list", [p[1], p[3]])

    p[0].list = [(name, p[3].type, False) for name in p[1].list]
def p_field_decl(p):
    '''field_decl :  name_list  COLON  type_decl  SEMI'''
    #      0             1        2        3       4
    p[0] = Node("field_decl", [p[1], p[3]])

    p[0].list = [(name, p[3].type) for name in p[1].list]