def p_nums(t): '''nums : nums ',' NUMBER | NUMBER''' if len(t) == 4: t[0] = node('[NUMS]') t[0].add(t[1]) t[0].add(num_node(t[3])) elif len(t) == 2: t[0] = node('[NUMS]') t[0].add(num_node(t[1]))
def p_numbers(t): '''numbers : NUMBER | numbers ',' NUMBER''' if len(t) == 2: t[0] = node('[NUMBERS]') t[0].add(num_node(t[1])) elif len(t) == 4: t[0] = node('[NUMBERS]') t[0].add(t[1]) t[0].add(num_node(t[3]))
def p_commaexpression(t): '''commaexpression : commaexpression ',' NUMBER | NUMBER ',' NUMBER | NUMBER''' if len(t) == 2: t[0] = node('[COMMAEXPRESSION]') t[0].add(num_node(t[1])) elif len(t) == 4: t[0] = node('[COMMAEXPRESSION]') if t.slice[1].type == 'NUMBER': t[0].add(num_node(t[1])) t[0].add(num_node(t[3])) else: t[0].add(t[1]) t[0].add(num_node(t[3]))
def p_assignment(t): '''assignment : VARIABLE '=' NUMBER''' if len(t) == 4: t[0] = node('[ASSIGNMENT]') t[0].add(node(t[1])) t[0].add(node(t[2])) t[0].add(num_node(t[3]))
def p_factor(t): '''factor : NUMBER | VARIABLE | STR | self | VARIABLE '[' expression ']' | '(' expression ')' ''' if len(t) == 2: if isinstance(t[1], node): # self t[0] = node('[FACTOR]') t[0].add(t[1]) elif ord('0') <= ord(t[1][0]) <= ord('9'): # NUMBER t[0] = node('[FACTOR]') t[0].add(num_node(t[1])) elif t[1][0] == "'" and t[1][-1] == "'": # STR t[0] = node('[FACTOR]') t[0].add(node(t[1])) else: # VARIABLE t[0] = node('[FACTOR]') t[0].add(node(t[1])) elif len(t) == 4: t[0] = node('[FACTOR]') t[0].add(t[2]) elif len(t) == 5: t[0] = node('[FACTOR]') t[0].add(node(t[1])) t[0].add(t[3])
def p_term_2(t): '''term : term '*' NUMBER | term '/' NUMBER''' if len(t) == 4: t[0] = node('[TERM]') t[0].add(t[1]) t[0].add(node(t[2])) t[0].add(num_node(t[3]))
def p_assignment(t): '''assignment : VARIABLE '=' NUMBER | VARIABLE '[' expression ']' '=' NUMBER | VARIABLE '=' VARIABLE | VARIABLE '=' VARIABLE '[' expression ']' | self '=' VARIABLE | VARIABLE '=' VARIABLE '(' expressions ')' ''' if len(t) == 4: if isinstance(t[1], node): # self t[0] = node('[ASSIGNMENT]') t[0].add(t[1]) t[0].add(node(t[2])) t[0].add(node(t[3])) elif isinstance(t[3], str): # NUMBER or VARIABLE if ord('0') <= ord(t[3][0]) <= ord('9'): # NUMBER t[0] = node('[ASSIGNMENT]') t[0].add(node(t[1])) t[0].add(node(t[2])) t[0].add(num_node(t[3])) else: # VARIABLE t[0] = node('[ASSIGNMENT]') t[0].add(node(t[1])) t[0].add(node(t[2])) t[0].add(node(t[3])) elif len(t) == 7: if t[2] == '[': # NUMBER t[0] = node('[ASSIGNMENT]') t[0].add(node(t[1])) t[0].add(t[3]) t[0].add(node(t[5])) t[0].add(num_node(t[6])) elif t[5].getdata() == '[EXPRESSION]': # VARIABLE '[' expression ']' t[0] = node('[ASSIGNMENT]') t[0].add(node(t[1])) t[0].add(node(t[2])) t[0].add(node(t[3])) t[0].add(t[5]) elif t[5].getdata() == '[EXPRESSIONS]': # VARIABLE '(' expressions ')' t[0] = node('[ASSIGNMENT]') t[0].add(node(t[1])) t[0].add(node(t[2])) t[0].add(node(t[3])) t[0].add(t[5])
def simple_node(t,name): t[0]=node(name) for i in range(1,len(t)): if t.slice[i].type == 'slice': t[0].add(t[i]) elif t.slice[i].type == 'NUMBER': t[0].add(num_node(t[i])) else: t[0].add(node(t[i])) return t[0]
def p_factor(t): '''factor : VARIABLE | NUMBER ''' t[0] = node('[factor]') # if(type(t[1]) == type(t[0])): # print(type(t[1])) # t[0].add(t[1]) if (t[1].isdigit()): #数字 t[0].add(num_node(eval(t[1]))) else: t[0].add(node(t[1]))
def p_assignment(t): '''assignment : VARIABLE '=' NUMBER | VARIABLE '[' expr ']' '=' NUMBER | VARIABLE '=' VARIABLE | VARIABLE '=' VARIABLE '[' expr ']' | VARIABLE '=' num_list''' if len(t) == 4: if isinstance(t[3], str): # NUMBER or VARIABLE if ord('0') <= ord(t[3][0]) <= ord('9'): # NUMBER t[0] = node('[ASSIGNMENT]') t[0].add(node(t[1])) t[0].add(node(t[2])) t[0].add(num_node(t[3])) else: # VARIABLE t[0] = node('[ASSIGNMENT]') t[0].add(node(t[1])) t[0].add(node(t[2])) t[0].add(node(t[3])) else: # num_list t[0] = node('[ASSIGNMENT]') t[0].add(node(t[1])) t[0].add(node(t[2])) t[0].add(t[3]) elif len(t) == 7: if t[2] == '[': # NUMBER t[0] = node('[ASSIGNMENT]') t[0].add(node(t[1])) t[0].add(t[3]) t[0].add(node(t[5])) t[0].add(num_node(t[6])) else: # VARIABLE '[' expr ']' t[0] = node('[ASSIGNMENT]') t[0].add(node(t[1])) t[0].add(node(t[2])) t[0].add(node(t[3])) t[0].add(t[5])
def p_factor(t): '''factor : NUMBER | VARIABLE | VARIABLE '[' expr ']' | '(' expr ')' ''' if len(t) == 2: if ord('0') <= ord(t[1][0]) <= ord('9'): # NUMBER t[0] = node('[FACTOR]') t[0].add(num_node(t[1])) else: # VARIABLE t[0] = node('[FACTOR]') t[0].add(node(t[1])) elif len(t) == 4: t[0] = node('[FACTOR]') t[0].add(t[2]) elif len(t) == 5: t[0] = node('[FACTOR]') t[0].add(node(t[1])) t[0].add(t[3])
def p_assignment(t): '''assignment : VARIABLE '=' NUMBER | VARIABLE '=' VARIABLE | VARIABLE '=' operation | slice '=' slice | slice '=' VARIABLE | VARIABLE '=' slice ''' if t.slice[1].type == 'slice' or t.slice[3].type == 'slice': t[0] = node('[ASSIGNMENT]') if t.slice[1].type == 'slice': if t.slice[3].type == 'slice': t[0].add(t[1]) t[0].add(node(t[2])) t[0].add(t[3]) else: t[0].add(t[1]) t[0].add(node(t[2])) t[0].add(node(t[3])) else: t[0].add(node(t[1])) t[0].add(node(t[2])) t[0].add(t[3]) elif t.slice[3].type == 'operation': t[0]=node('[ASSIGNMENT]') t[0].add(node(t[1])) t[0].add(node(t[2])) t[0].add(t[3]) elif t.slice[3].type == 'NUMBER': t[0]=node('[ASSIGNMENT]') t[0].add(node(t[1])) t[0].add(node(t[2])) t[0].add(num_node(t[3])) elif t.slice[3].type == 'VARIABLE': t[0]=node('[ASSIGNMENT]') t[0].add(node(t[1])) t[0].add(node(t[2])) t[0].add(node(t[3]))
def p_term_3(t): '''term : NUMBER''' if len(t) == 2: t[0] = node('[TERM]') t[0].add(num_node(t[1]))
def p_factor1(t): '''factor : NUMBER''' if len(t) == 2: t[0] = node('[FACTOR]') t[0].add(num_node(t[1]))