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]