def p_recparams(p): ''' recparams : ID COLON type | ID COLON type COMMA recparams ''' rule_len = len(p) - 1 address = get_next_local(p[3]) if rule_len == 3: p[0] = [(variable(p[1],p[3],address,get_const_address(0,'i')))] elif rule_len == 5: p[0] = [(variable(p[1],p[3],address,get_const_address(0,'i')))] + p[5]
def p_vars(p): ''' vars : VAR recids COLON type SEMICOLON vars | VAR recids COLON type SEMICOLON ''' global dimension_stack rule_len = len(p) - 1 current_function = active_scopes.pop() address = 0 current_list_addr = 0 # We use this to handle multiple declarations with same dimension addr_popped = False # We use this to handle multiple declarations with same dimension # We use a for in here so that we can handle multiple declarations for l in p[2]: if p[4][0] == 'list': if not addr_popped: current_list_addr = dimension_stack.pop() addr_popped = True if(current_function.functiontype == 'global'): # We create global addresses if p[4][0] == 'list': address = get_next_global_list(p[4][1], current_list_addr) else: address = get_next_global(p[4]) else: if p[4][0] == 'list': address = get_next_local_list(p[4][1], current_list_addr) else: address = get_next_local(p[4]) if p[4][0] == 'list': current_function.vars[l] = variable(l,p[4][0], address,1, array_block(p[4][1],get_const_address(0,'i'),current_list_addr,get_const_address(0,'i'))) else: current_function.vars[l] = variable(l,p[4], address,get_const_address(0,'i')) active_scopes.append(current_function)
def p_bool(p): ''' bool : TRUE | FALSE ''' addr = get_const_address(p[1],'b') p[0] = (addr, 'b')
def p_float(p): ''' float : FLOAT ''' addr = get_const_address(p[1],'f') p[0] = (addr, 'f')
def p_int(p): ''' int : INT ''' addr = get_const_address(p[1],'i') p[0] = (addr, 'i')
def p_string(p): ''' string : STRING ''' addr = get_const_address(p[1],'s') p[0] = (addr, 's')
def p_action_recwrite_cte(p): ''' action_recwrite_cte : ''' address = get_const_address(p[-1], 's') quadruples.append(quadruple("print",None, None, address))