From fe4aab81b02e1b92c3cfa8e5ba2efed07cfc3aba Mon Sep 17 00:00:00 2001 From: Victor Manuel <61758132+Vitico99@users.noreply.github.com> Date: Sat, 17 Apr 2021 04:28:20 +0200 Subject: [PATCH 01/81] Add lexer, parser and ast --- src/cool.py | 23 +++ src/coolc.sh | 8 +- src/parsing/__init__.py | 0 src/parsing/ast.py | 138 ++++++++++++++++ src/parsing/lexer.py | 237 +++++++++++++++++++++++++++ src/parsing/parser.py | 355 ++++++++++++++++++++++++++++++++++++++++ src/parsing/parsetab.py | 91 ++++++++++ 7 files changed, 848 insertions(+), 4 deletions(-) create mode 100644 src/cool.py create mode 100644 src/parsing/__init__.py create mode 100644 src/parsing/ast.py create mode 100644 src/parsing/lexer.py create mode 100644 src/parsing/parser.py create mode 100644 src/parsing/parsetab.py diff --git a/src/cool.py b/src/cool.py new file mode 100644 index 000000000..577d86d6e --- /dev/null +++ b/src/cool.py @@ -0,0 +1,23 @@ +import sys +from parsing.parser import COOL_Parser +from parsing.lexer import COOL_Lexer + +input_file = sys.argv[1] +with open(input_file, 'r') as f: + s = f.read() + +lexer = COOL_Lexer() +lexer.build() +tokens = list(lexer.tokenize(s)) +if lexer.errors: + for e in lexer.errors: + print(e) + exit(1) + +parser = COOL_Parser() +ast, errors = parser.parse(s) +if errors: + for e in errors: + print(e) + exit(1) +exit(0) \ No newline at end of file diff --git a/src/coolc.sh b/src/coolc.sh index 3088de4f9..f748bfd3b 100755 --- a/src/coolc.sh +++ b/src/coolc.sh @@ -4,8 +4,8 @@ INPUT_FILE=$1 OUTPUT_FILE=${INPUT_FILE:0: -2}mips # Si su compilador no lo hace ya, aquí puede imprimir la información de contacto -echo "LINEA_CON_NOMBRE_Y_VERSION_DEL_COMPILADOR" # TODO: Recuerde cambiar estas -echo "Copyright (c) 2019: Nombre1, Nombre2, Nombre3" # TODO: líneas a los valores correctos +echo "COOLCompiler_v1.0" # TODO: Recuerde cambiar estas +echo "Copyright (c) 2021: Karla Olivera, Amanda Gonzalez, Victor Cardentey" # TODO: líneas a los valores correctos -# Llamar al compilador -echo "Compiling $INPUT_FILE into $OUTPUT_FILE" + +exec python3 cool.py $INPUT_FILE \ No newline at end of file diff --git a/src/parsing/__init__.py b/src/parsing/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/parsing/ast.py b/src/parsing/ast.py new file mode 100644 index 000000000..e9e7faef2 --- /dev/null +++ b/src/parsing/ast.py @@ -0,0 +1,138 @@ +class Node: + pass + +class ProgramNode(Node): + def __init__(self, declarations): + self.declarations = declarations + +class DeclarationNode(Node): + pass + +class ExpressionNode(Node): + pass + +class ClassDeclarationNode(DeclarationNode): + def __init__(self, idx, features, parent=None): + self.id = idx + self.parent = parent + self.features = features + +class FuncDeclarationNode(DeclarationNode): + def __init__(self, idx, params, return_type, body): + self.id = idx + self.params = params + self.return_type = return_type + self.body = body + +class AttrDeclarationNode(DeclarationNode): + def __init__(self, idx, typex, expr = None): + self.id = idx + self.type = typex + self.expr = expr + +class VarDeclarationNode(ExpressionNode): + def __init__(self, idx, typex, expr): + self.id = idx + self.type = typex + self.expr = expr + +class AssignNode(ExpressionNode): + def __init__(self, idx, expr): + self.id = idx + self.expr = expr + +class CallNode(ExpressionNode): + def __init__(self, obj, idx, args, from_type= None): + self.obj = obj + self.id = idx + self.args = args + self.from_type = from_type + + +class BinaryNode(ExpressionNode): + def __init__(self, left, right): + self.left = left + self.right = right + +class UnaryNode(ExpressionNode): + def __init__(self, exp): + self.exp = exp + + +class ConditionalNode(ExpressionNode): + def __init__(self,if_exp,then_exp,else_exp): + self.if_exp = if_exp + self.then_exp = then_exp + self.else_exp = else_exp + +class LoopNode(ExpressionNode): + def __init__(self,while_exp, loop_exp): + self.while_exp = while_exp + self.loop_exp = loop_exp + +class BlockNode(ExpressionNode): + def __init__(self,exp_list): + self.exp_list = exp_list + +class LetNode(ExpressionNode): + def __init__(self, var_list, in_exp): + self.var_list = var_list + self.in_exp = in_exp + +class CaseNode(ExpressionNode): + def __init__(self,cond, case_list): + self.cond = cond + self.case_list = case_list + + +class AtomicNode(ExpressionNode): + def __init__(self, lex): + self.lex = lex + + +class ConstantNumNode(AtomicNode): + pass + +class ConstantStringNode(AtomicNode): + pass + +class ConstantBoolNode(AtomicNode): + pass + +class VariableNode(AtomicNode): + pass + +class InstantiateNode(AtomicNode): + pass + +class IsVoidNode(UnaryNode): + pass + +class NotNode(UnaryNode): + pass + +class NegNode(UnaryNode): + pass + + +class PlusNode(BinaryNode): + pass + +class MinusNode(BinaryNode): + pass + +class StarNode(BinaryNode): + pass + +class DivNode(BinaryNode): + pass + +class LessNode(BinaryNode): + pass + +class LessEqualNode(BinaryNode): + pass + +class EqualNode(BinaryNode): + pass + diff --git a/src/parsing/lexer.py b/src/parsing/lexer.py new file mode 100644 index 000000000..af299d672 --- /dev/null +++ b/src/parsing/lexer.py @@ -0,0 +1,237 @@ +import ply.lex as lex + +class COOL_Lexer: + tokens = [ + 'OBJECTID', # object identifiers + 'TYPEID', # type identifiers + 'INT_CONST', # integer constants + 'STRING_CONST', # string constants + + #symbols + 'DOT', #. + 'COMMA', #, + 'COLON', #: + 'SEMICOLON', #; + 'AT', #@ + 'TILDE', #~ + 'PLUS', #+ + 'MINUS', #- + 'STAR', #* + 'DIV', #/ + 'LEQ', #<= + 'LOWER', #< + 'EQUAL', #= + 'ASSIGN', #<- + 'CASSIGN', #=> + 'OPAR', #( + 'CPAR', #) + 'OCUR', #{ + 'CCUR', #} + ] + + keywords = { + 'class' : 'CLASS', + 'else' : 'ELSE', + 'false' : 'FALSE', + 'fi' : 'FI', + 'if' : 'IF', + 'in' : 'IN', + 'inherits' : 'INHERITS', + 'isvoid' : 'ISVOID', + 'let' : 'LET', + 'loop' : 'LOOP', + 'pool' : 'POOL', + 'then' : 'THEN', + 'while' : 'WHILE', + 'case' : 'CASE', + 'esac' : 'ESAC', + 'new' : 'NEW', + 'of' : 'OF', + 'not' : 'NOT', + 'true' : 'TRUE' + } + + tokens += list(keywords.values()) + + def __init__(self): + self.errors = [] + self.prev_last_newline = 0 + self.current_last_newline = 0 + + def build(self): + self.lexer = lex.lex(module=self) + + def tokenize(self, text): + self.last_newline = 0 + self.lexer.input(text) + for t in self.lexer: + t.lexpos = t.lexpos - self.prev_last_newline + 1 + self.prev_last_newline = self.current_last_newline + yield t + + ###################################################################### + # Literals # + ###################################################################### + t_INT_CONST = r'[0-9]+' + + def t_OBJECTID(self, t): + r'[a-z][a-zA-Z0-9_]*' # object identifiers must start with lower case + t.type = self.keywords.get(t.value.lower(), 'OBJECTID') # try match with keywords that also match the objectid pattern + return t + + def t_TYPEID(self, t): + r'[A-Z][a-zA-Z0-9_]*' # type identifiers must start with upper case + val = t.value.lower() + if val != 'true' and val != 'false': # discard `lower` and `false` that start with lower case + t.type = self.keywords.get(val, 'TYPEID') + return t + + def t_STRING_CONST(self, t): + r'\"' # match the first " + value = '\"' + text = t.lexer.lexdata + pos = t.lexer.lexpos + + contains_null = False + while True: + if pos >= len(text): # founded EOF before closing " + t.lexer.lexpos = pos + self.register_error(t.lexer.lineno, t.lexer.lexpos - self.current_last_newline + 1, "LexicographicError: EOF in string constant") + return + c = text[pos] + + if c == '\\': + if text[pos+1] == '\n': + value += '\n' + t.lexer.lineno += 1 + self.current_last_newline = pos + 2 + elif text.startswith('\r\n', pos+1): + value += '\r\n' + t.lexer.lineno += 1 + pos+=1 + self.current_last_newline = pos + 1 + elif text[pos+1] in ('b', 'f', 't', 'n'): # i'm not very sure about this + value += f'\\{text[pos+1]}' + else: + value += text[pos+1] + pos += 2 + elif c == '\n': # string with no scaped \n# try match with false or true that also match the identifier pattern and have higher precedence + t.lexer.lexpos = pos + self.register_error(t.lineno, t.lexer.lexpos - self.current_last_newline + 1, "LexicographicError: Unterminated string constant") + return + elif c == '\0': + contains_null = True + self.register_error(t.lineno, pos - self.current_last_newline + 1, "LexicographicError: String contains null character") + pos += 1 + else: + value += c + pos += 1 + if c == '\"': + break + + t.lexer.lexpos = pos + t.value = value + t.type = 'STRING_CONST' + if not contains_null: + return t + + ####################################################################### + # Comments # + ####################################################################### + + def t_SINGLE_LINE_COMMENT(self, t): + r'--' + value = '--' + text = t.lexer.lexdata + pos = t.lexer.lexpos + + while True: + if pos >= len(text): + break + if text[pos] == '\n': + t.lexer.lineno += 1 + value += text[pos] + pos+=1 + self.current_last_newline = pos + break + value += text[pos] + pos+=1 + + t.lexer.lexpos = pos + + def t_MULTI_LINE_COMMENT(self, t): + r'\(\*' + opar = 1 + value = '(*' + text = t.lexer.lexdata + pos = t.lexer.lexpos + + while opar > 0: + if pos >= len(text): + t.lexer.lexpos = pos + self.register_error(t.lexer.lineno, t.lexer.lexpos - self.current_last_newline, 'LexicographicError: EOF in comment') + return + + if text.startswith('(*', pos): + value += '(*' + pos += 2 + opar += 1 + elif text.startswith('*)', pos): + opar -= 1 + pos +=2 + value += '*)' + else: + if text[pos] == '\n': + t.lexer.lineno += 1 + self.current_last_newline = pos + value += text[pos] + pos += 1 + t.lexer.lexpos = pos + + ####################################################################### + # Symbols # + ####################################################################### + t_DOT = r'\.' + t_COMMA = r',' + t_COLON = r':' + t_SEMICOLON = r';' + t_AT = r'@' + t_TILDE = r'~' + t_PLUS = r'\+' + t_MINUS = r'-' + t_STAR = r'\*' + t_DIV = r'/' + t_LEQ = r'<=' + t_LOWER = r'<' + t_EQUAL = r'=' + t_ASSIGN = r'<-' + t_CASSIGN = r'=>' + t_OPAR = r'\(' + t_CPAR = r'\)' + t_OCUR = r'{' + t_CCUR = r'}' + + ####################################################################### + # Ignored # + ####################################################################### + + def t_newline(self, t): + r'\n+' + t.lexer.lineno += len(t.value) + self.prev_last_newline = t.lexer.lexpos + self.current_last_newline = t.lexer.lexpos + + t_ignore = ' \t\r' + + ######################################################################## + # Error Handling # + ######################################################################## + + def t_error(self, t): # not recognized symbol + self.register_error(t.lexer.lineno, t.lexer.lexpos - self.prev_last_newline + 1, f"LexicographicError: ERROR \"{t.value[0]}\"") + t.lexer.skip(1) + + def register_error(self, line, column, text): + self.errors.append(f'{line,column} - {text}') + + diff --git a/src/parsing/parser.py b/src/parsing/parser.py new file mode 100644 index 000000000..82c2714c5 --- /dev/null +++ b/src/parsing/parser.py @@ -0,0 +1,355 @@ +import ply.yacc as yacc +from .lexer import COOL_Lexer +from .ast import * + +class COOL_Parser: + + + def __init__(self): + self.tokens = COOL_Lexer.tokens + + + def parse(self, input_string): + l = COOL_Lexer() + l.build() + self.lex = l + self.errors = [] + self.parser = yacc.yacc(module=self) + self.input = input_string + result = self.parser.parse(input_string, lexer=self.lex.lexer) + return result, self.errors + + + ###################################################################### + # Grammar # + ###################################################################### + + @staticmethod + def p_program(p): + 'program : class_list' + p[0] = ProgramNode(p[1]) + + @staticmethod + def p_class_list_single(p): + 'class_list : def_class' + p[0] = [p[1]] + + @staticmethod + def p_class_list_multi(p): + 'class_list : def_class class_list' + p[0] = [p[1]] + p[2] + + @staticmethod + def p_def_class(p): + 'def_class : CLASS TYPEID OCUR feature_list CCUR SEMICOLON' + p[0] = ClassDeclarationNode(p[2],p[4]) + + @staticmethod + def p_def_class_parent(p): + 'def_class : CLASS TYPEID INHERITS TYPEID OCUR feature_list CCUR SEMICOLON' + p[0] = ClassDeclarationNode(p[2],p[6],p[4]) + + @staticmethod + def p_feature_list_empty(p): + 'feature_list :' + p[0] = [] + pass + + @staticmethod + def p_feature_list_attr(p): + 'feature_list : def_attr feature_list' + p[0] = [p[1]] + p[2] + + @staticmethod + def p_feature_list_fun(p): + 'feature_list : def_func feature_list' + p[0] = [p[1]] + p[2] + + @staticmethod + def p_attr(p): + 'def_attr : OBJECTID COLON TYPEID SEMICOLON' + p[0] = AttrDeclarationNode( p[1],p[3] ) + + @staticmethod + def p_attr_exp(p): + 'def_attr : OBJECTID COLON TYPEID ASSIGN exp SEMICOLON' + p[0] = AttrDeclarationNode( p[1],p[3],p[5] ) + + @staticmethod + def p_func(p): + 'def_func : OBJECTID OPAR CPAR COLON TYPEID OCUR exp CCUR SEMICOLON' + p[0] = FuncDeclarationNode(p[1], [], p[5], p[7]) + + @staticmethod + def p_func_param(p): + 'def_func : OBJECTID OPAR param_list CPAR COLON TYPEID OCUR exp CCUR SEMICOLON' + p[0] = FuncDeclarationNode(p[1], p[3], p[6], p[8]) + + @staticmethod + def p_param_list_single(p): + 'param_list : param' + p[0] = [p[1]] + + @staticmethod + def p_param_list_multi(p): + 'param_list : param COMMA param_list' + p[0] = [p[1]] + p[3] + + @staticmethod + def p_param(p): + 'param : OBJECTID COLON TYPEID' + p[0] = (p[1],p[3]) + + @staticmethod + def p_exp_assign(p): + 'exp : OBJECTID ASSIGN exp' + p[0] = AssignNode(p[1],p[3]) + + @staticmethod + def p_exp_let(p): + 'exp : LET ident_list IN exp' + p[0] = LetNode(p[2],p[4]) + + @staticmethod + def p_ident_list_single(p): + 'ident_list : iden' + p[0] = [p[1]] + + @staticmethod + def p_ident_list_multi(p): + 'ident_list : iden COMMA ident_list' + p[0] = [p[1]] + p[3] + + @staticmethod + def p_iden(p): + 'iden : OBJECTID COLON TYPEID' + p[0] = (p[1],p[3],None) + + @staticmethod + def p_iden_init(p): + 'iden : OBJECTID COLON TYPEID ASSIGN exp' + p[0] = (p[1],p[3],p[5]) + + @staticmethod + def p_case_list_single(p): + 'case_list : branch' + p[0] = [p[1]] + + @staticmethod + def p_case_list_multi(p): + 'case_list : branch case_list' + p[0] = [p[1]] + p[2] + + @staticmethod + def p_branch(p): + 'branch : OBJECTID COLON TYPEID CASSIGN exp SEMICOLON' + p[0] = (p[1],p[3],p[5]) + + @staticmethod + def p_exp_not(p): + 'exp : NOT exp' + p[0] = NotNode(p[2]) + + @staticmethod + def p_exp_comp(p): + 'exp : comp' + p[0] = p[1] + + @staticmethod + def p_comp_arith(p): + 'comp : arith' + p[0] = p[1] + + @staticmethod + def p_comp_lower(p): + 'comp : arith LOWER arith' + p[0] = LessNode(p[1],p[3]) + + @staticmethod + def p_comp_leq(p): + 'comp : arith LEQ arith' + p[0] = LessEqualNode(p[1],p[3]) + + @staticmethod + def p_comp_equal(p): + 'comp : arith EQUAL arith' + p[0] = EqualNode(p[1],p[3]) + + @staticmethod + def p_comp_equal_not(p): + 'comp : arith EQUAL NOT exp' + p[0] = EqualNode(p[1],p[4]) + + @staticmethod + def p_arith_term(p): + 'arith : term' + p[0]= p[1] + + @staticmethod + def p_arith_plus(p): + 'arith : arith PLUS term' + p[0] = PlusNode(p[1],p[3]) + + @staticmethod + def p_arith_minus(p): + 'arith : arith MINUS term' + p[0] = MinusNode(p[1],p[3]) + + @staticmethod + def p_term_fac(p): + 'term : factor' + p[0] = p[1] + + @staticmethod + def p_term_star(p): + 'term : term STAR factor' + p[0] = StarNode(p[1],p[3]) + + @staticmethod + def p_term_div(p): + 'term : term DIV factor' + p[0] = DivNode(p[1],p[3]) + + @staticmethod + def p_factor_atom(p): + 'factor : atom' + p[0] = p[1] + + @staticmethod + def p_factor_neg(p): + 'factor : TILDE factor' + p[0] = NegNode(p[2]) + + @staticmethod + def p_factor_case(p): + 'factor : CASE exp OF case_list ESAC' + p[0] = CaseNode(p[2],p[4]) + + @staticmethod + def p_factor_while(p): + 'factor : WHILE exp LOOP exp POOL' + p[0] = LoopNode(p[2],p[4]) + + @staticmethod + def p_factor_block(p): + 'factor : OCUR exp_list CCUR' + p[0] = BlockNode(p[2]) + + @staticmethod + def p_exp_list_single(p): + 'exp_list : exp SEMICOLON' + p[0] = [p[1]] + + @staticmethod + def p_exp_list_multi(p): + 'exp_list : exp SEMICOLON exp_list' + p[0] = [p[1]] + p[3] + + @staticmethod + def p_factor_cond(p): + 'factor : IF exp THEN exp ELSE exp FI' + p[0] = ConditionalNode(p[2],p[4],p[6]) + + @staticmethod + def p_factor_void(p): + 'factor : ISVOID factor' + p[0] = IsVoidNode(p[2]) + + @staticmethod + def p_atom_num(p): + 'atom : INT_CONST' + p[0] = ConstantNumNode(p[1]) + + @staticmethod + def p_atom_string(p): + 'atom : STRING_CONST' + p[0] = ConstantStringNode(p[1]) + + @staticmethod + def p_atom_bool(p): + '''atom : TRUE + | FALSE + ''' + p[0] = ConstantBoolNode(p[1]) + + @staticmethod + def p_atom_var(p): + 'atom : OBJECTID' + p[0]= VariableNode(p[1]) + + @staticmethod + def p_atom_new(p): + 'atom : NEW TYPEID' + p[0]= InstantiateNode(p[2]) + + @staticmethod + def p_atom_func_call(p): + 'atom : func_call' + p[0] = p[1] + + @staticmethod + def p_atom_exp(p): + 'atom : OPAR exp CPAR' + p[0] = p[2] + + @staticmethod + def p_func_call_self(p): + 'func_call : OBJECTID OPAR arg_list CPAR' + p[0] = CallNode(VariableNode('self'),p[1],p[3]) + + @staticmethod + def p_func_call(p): + 'func_call : atom DOT OBJECTID OPAR arg_list CPAR' + p[0] = CallNode(p[1],p[3],p[5]) + + @staticmethod + def p_func_call_at(p): + 'func_call : atom AT TYPEID DOT OBJECTID OPAR arg_list CPAR' + p[0] = CallNode(p[1],p[5],p[7],p[3]) + + @staticmethod + def p_arg_list_empty(p): + 'arg_list :' + p[0] = [] + pass + + @staticmethod + def p_arg_list_not_empty(p): + 'arg_list : arg_list_not_empty' + p[0] = p[1] + + @staticmethod + def p_arg_list_not_empty_single(p): + 'arg_list_not_empty : exp' + p[0] = [p[1]] + + @staticmethod + def p_arg_list_not_empty_multi(p): + 'arg_list_not_empty : exp COMMA arg_list_not_empty' + p[0] = [p[1]] + p[3] + + #Error rule for syntax errors + def p_error(self, p): + if not p: + l = COOL_Lexer() + l.build() + for t in l.tokenize(self.input): + if t.value != 'class': #Error at the beginning + p = t + break + + if not p: # Error at the end + self.errors.append('(0, 0) - SyntacticError: ERROR at or near EOF') + return + + col = self.__find_column(p) + line = p.lineno + val = p.value + #(29, 9) - SyntacticError: ERROR at or near "Test1" + self.errors.append(f'({line}, {col}) - SyntacticError: ERROR at or near "{val}"') + + + def __find_column(self, token): + input_s = self.input + line_start = input_s.rfind('\n', 0, token.lexpos) + 1 + return (token.lexpos - line_start) + 1 \ No newline at end of file diff --git a/src/parsing/parsetab.py b/src/parsing/parsetab.py new file mode 100644 index 000000000..7016a65a9 --- /dev/null +++ b/src/parsing/parsetab.py @@ -0,0 +1,91 @@ + +# parsetab.py +# This file is automatically generated. Do not edit. +# pylint: disable=W,C,R +_tabversion = '3.10' + +_lr_method = 'LALR' + +_lr_signature = 'ASSIGN AT CASE CASSIGN CCUR CLASS COLON COMMA CPAR DIV DOT ELSE EQUAL ESAC FALSE FI IF IN INHERITS INT_CONST ISVOID LEQ LET LOOP LOWER MINUS NEW NOT OBJECTID OCUR OF OPAR PLUS POOL SEMICOLON STAR STRING_CONST THEN TILDE TRUE TYPEID WHILEprogram : class_listclass_list : def_classclass_list : def_class class_listdef_class : CLASS TYPEID OCUR feature_list CCUR SEMICOLONdef_class : CLASS TYPEID INHERITS TYPEID OCUR feature_list CCUR SEMICOLONfeature_list :feature_list : def_attr feature_listfeature_list : def_func feature_listdef_attr : OBJECTID COLON TYPEID SEMICOLONdef_attr : OBJECTID COLON TYPEID ASSIGN exp SEMICOLONdef_func : OBJECTID OPAR CPAR COLON TYPEID OCUR exp CCUR SEMICOLONdef_func : OBJECTID OPAR param_list CPAR COLON TYPEID OCUR exp CCUR SEMICOLONparam_list : paramparam_list : param COMMA param_listparam : OBJECTID COLON TYPEIDexp : OBJECTID ASSIGN expexp : LET ident_list IN expident_list : idenident_list : iden COMMA ident_listiden : OBJECTID COLON TYPEIDiden : OBJECTID COLON TYPEID ASSIGN expcase_list : branchcase_list : branch case_listbranch : OBJECTID COLON TYPEID CASSIGN exp SEMICOLONexp : NOT expexp : compcomp : arithcomp : arith LOWER arithcomp : arith LEQ arithcomp : arith EQUAL arithcomp : arith EQUAL NOT exparith : termarith : arith PLUS termarith : arith MINUS termterm : factorterm : term STAR factorterm : term DIV factorfactor : atomfactor : TILDE factorfactor : CASE exp OF case_list ESACfactor : WHILE exp LOOP exp POOLfactor : OCUR exp_list CCURexp_list : exp SEMICOLONexp_list : exp SEMICOLON exp_listfactor : IF exp THEN exp ELSE exp FIfactor : ISVOID factoratom : INT_CONSTatom : STRING_CONSTatom : TRUE\n | FALSE\n atom : OBJECTIDatom : NEW TYPEIDatom : func_callatom : OPAR exp CPARfunc_call : OBJECTID OPAR arg_list CPARfunc_call : atom DOT OBJECTID OPAR arg_list CPARfunc_call : atom AT TYPEID DOT OBJECTID OPAR arg_list CPARarg_list :arg_list : arg_list_not_emptyarg_list_not_empty : exparg_list_not_empty : exp COMMA arg_list_not_empty' + +_lr_action_items = {'CLASS':([0,3,20,60,],[4,4,-4,-5,]),'$end':([1,2,3,5,20,60,],[0,-1,-2,-3,-4,-5,]),'TYPEID':([4,8,17,29,30,53,58,76,95,136,],[6,13,21,56,57,85,88,105,118,144,]),'OCUR':([6,13,28,37,43,44,45,46,47,48,55,57,61,62,68,69,70,71,72,73,74,87,88,93,99,107,109,110,113,115,120,131,138,143,148,],[7,19,46,46,46,46,46,46,46,46,46,87,46,46,46,46,46,46,46,46,46,46,113,46,46,46,46,46,46,46,46,46,46,46,46,]),'INHERITS':([6,],[8,]),'CCUR':([7,9,10,11,15,16,19,26,27,34,38,39,40,41,42,49,50,51,52,54,63,67,77,78,81,84,85,89,96,97,98,100,101,102,103,108,109,111,112,114,116,119,126,129,134,137,139,142,146,149,150,],[-6,14,-6,-6,-7,-8,-6,33,-9,-51,-26,-27,-32,-35,-38,-47,-48,-49,-50,-53,-10,-25,-39,-51,108,-46,-52,-16,-28,-29,-30,-33,-34,-36,-37,-42,-43,-54,128,-55,-17,-31,-44,140,-40,-41,-11,-56,-12,-45,-57,]),'OBJECTID':([7,10,11,18,19,27,28,32,36,37,43,44,45,46,47,48,55,61,62,63,68,69,70,71,72,73,74,75,87,93,94,99,106,107,109,110,113,115,120,121,123,131,138,139,143,146,148,152,],[12,12,12,22,12,-9,34,22,66,34,78,34,34,34,34,78,34,34,34,-10,78,78,78,78,78,78,78,104,34,34,66,34,124,34,34,34,34,34,34,133,124,34,34,-11,34,-12,34,-24,]),'COLON':([12,22,23,31,66,124,],[17,29,30,58,95,136,]),'OPAR':([12,28,34,37,43,44,45,46,47,48,55,61,62,68,69,70,71,72,73,74,78,87,93,99,104,107,109,110,113,115,120,131,133,138,143,148,],[18,55,62,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,62,55,55,55,120,55,55,55,55,55,55,55,143,55,55,55,]),'SEMICOLON':([14,21,33,34,35,38,39,40,41,42,49,50,51,52,54,67,77,78,82,84,85,89,96,97,98,100,101,102,103,108,111,114,116,119,128,134,137,140,142,149,150,151,],[20,27,60,-51,63,-26,-27,-32,-35,-38,-47,-48,-49,-50,-53,-25,-39,-51,109,-46,-52,-16,-28,-29,-30,-33,-34,-36,-37,-42,-54,-55,-17,-31,139,-40,-41,146,-56,-45,-57,152,]),'CPAR':([18,24,25,34,38,39,40,41,42,49,50,51,52,54,56,59,62,67,77,78,84,85,86,89,90,91,92,96,97,98,100,101,102,103,108,111,114,116,119,120,130,132,134,137,142,143,147,149,150,],[23,31,-13,-51,-26,-27,-32,-35,-38,-47,-48,-49,-50,-53,-15,-14,-58,-25,-39,-51,-46,-52,111,-16,114,-59,-60,-28,-29,-30,-33,-34,-36,-37,-42,-54,-55,-17,-31,-58,-61,142,-40,-41,-56,-58,150,-45,-57,]),'ASSIGN':([21,34,118,],[28,61,131,]),'COMMA':([25,34,38,39,40,41,42,49,50,51,52,54,56,65,67,77,78,84,85,89,92,96,97,98,100,101,102,103,108,111,114,116,118,119,134,137,141,142,149,150,],[32,-51,-26,-27,-32,-35,-38,-47,-48,-49,-50,-53,-15,94,-25,-39,-51,-46,-52,-16,115,-28,-29,-30,-33,-34,-36,-37,-42,-54,-55,-17,-20,-31,-40,-41,-21,-56,-45,-57,]),'LET':([28,37,44,45,46,47,55,61,62,87,93,99,107,109,110,113,115,120,131,138,143,148,],[36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,]),'NOT':([28,37,44,45,46,47,55,61,62,70,87,93,99,107,109,110,113,115,120,131,138,143,148,],[37,37,37,37,37,37,37,37,37,99,37,37,37,37,37,37,37,37,37,37,37,37,37,]),'TILDE':([28,37,43,44,45,46,47,48,55,61,62,68,69,70,71,72,73,74,87,93,99,107,109,110,113,115,120,131,138,143,148,],[43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,]),'CASE':([28,37,43,44,45,46,47,48,55,61,62,68,69,70,71,72,73,74,87,93,99,107,109,110,113,115,120,131,138,143,148,],[44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,]),'WHILE':([28,37,43,44,45,46,47,48,55,61,62,68,69,70,71,72,73,74,87,93,99,107,109,110,113,115,120,131,138,143,148,],[45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,]),'IF':([28,37,43,44,45,46,47,48,55,61,62,68,69,70,71,72,73,74,87,93,99,107,109,110,113,115,120,131,138,143,148,],[47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,]),'ISVOID':([28,37,43,44,45,46,47,48,55,61,62,68,69,70,71,72,73,74,87,93,99,107,109,110,113,115,120,131,138,143,148,],[48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,]),'INT_CONST':([28,37,43,44,45,46,47,48,55,61,62,68,69,70,71,72,73,74,87,93,99,107,109,110,113,115,120,131,138,143,148,],[49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,]),'STRING_CONST':([28,37,43,44,45,46,47,48,55,61,62,68,69,70,71,72,73,74,87,93,99,107,109,110,113,115,120,131,138,143,148,],[50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,]),'TRUE':([28,37,43,44,45,46,47,48,55,61,62,68,69,70,71,72,73,74,87,93,99,107,109,110,113,115,120,131,138,143,148,],[51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,]),'FALSE':([28,37,43,44,45,46,47,48,55,61,62,68,69,70,71,72,73,74,87,93,99,107,109,110,113,115,120,131,138,143,148,],[52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,]),'NEW':([28,37,43,44,45,46,47,48,55,61,62,68,69,70,71,72,73,74,87,93,99,107,109,110,113,115,120,131,138,143,148,],[53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,]),'DOT':([34,42,49,50,51,52,54,78,85,105,111,114,142,150,],[-51,75,-47,-48,-49,-50,-53,-51,-52,121,-54,-55,-56,-57,]),'AT':([34,42,49,50,51,52,54,78,85,111,114,142,150,],[-51,76,-47,-48,-49,-50,-53,-51,-52,-54,-55,-56,-57,]),'STAR':([34,40,41,42,49,50,51,52,54,77,78,84,85,100,101,102,103,108,111,114,134,137,142,149,150,],[-51,73,-35,-38,-47,-48,-49,-50,-53,-39,-51,-46,-52,73,73,-36,-37,-42,-54,-55,-40,-41,-56,-45,-57,]),'DIV':([34,40,41,42,49,50,51,52,54,77,78,84,85,100,101,102,103,108,111,114,134,137,142,149,150,],[-51,74,-35,-38,-47,-48,-49,-50,-53,-39,-51,-46,-52,74,74,-36,-37,-42,-54,-55,-40,-41,-56,-45,-57,]),'LOWER':([34,39,40,41,42,49,50,51,52,54,77,78,84,85,100,101,102,103,108,111,114,134,137,142,149,150,],[-51,68,-32,-35,-38,-47,-48,-49,-50,-53,-39,-51,-46,-52,-33,-34,-36,-37,-42,-54,-55,-40,-41,-56,-45,-57,]),'LEQ':([34,39,40,41,42,49,50,51,52,54,77,78,84,85,100,101,102,103,108,111,114,134,137,142,149,150,],[-51,69,-32,-35,-38,-47,-48,-49,-50,-53,-39,-51,-46,-52,-33,-34,-36,-37,-42,-54,-55,-40,-41,-56,-45,-57,]),'EQUAL':([34,39,40,41,42,49,50,51,52,54,77,78,84,85,100,101,102,103,108,111,114,134,137,142,149,150,],[-51,70,-32,-35,-38,-47,-48,-49,-50,-53,-39,-51,-46,-52,-33,-34,-36,-37,-42,-54,-55,-40,-41,-56,-45,-57,]),'PLUS':([34,39,40,41,42,49,50,51,52,54,77,78,84,85,96,97,98,100,101,102,103,108,111,114,134,137,142,149,150,],[-51,71,-32,-35,-38,-47,-48,-49,-50,-53,-39,-51,-46,-52,71,71,71,-33,-34,-36,-37,-42,-54,-55,-40,-41,-56,-45,-57,]),'MINUS':([34,39,40,41,42,49,50,51,52,54,77,78,84,85,96,97,98,100,101,102,103,108,111,114,134,137,142,149,150,],[-51,72,-32,-35,-38,-47,-48,-49,-50,-53,-39,-51,-46,-52,72,72,72,-33,-34,-36,-37,-42,-54,-55,-40,-41,-56,-45,-57,]),'OF':([34,38,39,40,41,42,49,50,51,52,54,67,77,78,79,84,85,89,96,97,98,100,101,102,103,108,111,114,116,119,134,137,142,149,150,],[-51,-26,-27,-32,-35,-38,-47,-48,-49,-50,-53,-25,-39,-51,106,-46,-52,-16,-28,-29,-30,-33,-34,-36,-37,-42,-54,-55,-17,-31,-40,-41,-56,-45,-57,]),'LOOP':([34,38,39,40,41,42,49,50,51,52,54,67,77,78,80,84,85,89,96,97,98,100,101,102,103,108,111,114,116,119,134,137,142,149,150,],[-51,-26,-27,-32,-35,-38,-47,-48,-49,-50,-53,-25,-39,-51,107,-46,-52,-16,-28,-29,-30,-33,-34,-36,-37,-42,-54,-55,-17,-31,-40,-41,-56,-45,-57,]),'THEN':([34,38,39,40,41,42,49,50,51,52,54,67,77,78,83,84,85,89,96,97,98,100,101,102,103,108,111,114,116,119,134,137,142,149,150,],[-51,-26,-27,-32,-35,-38,-47,-48,-49,-50,-53,-25,-39,-51,110,-46,-52,-16,-28,-29,-30,-33,-34,-36,-37,-42,-54,-55,-17,-31,-40,-41,-56,-45,-57,]),'POOL':([34,38,39,40,41,42,49,50,51,52,54,67,77,78,84,85,89,96,97,98,100,101,102,103,108,111,114,116,119,125,134,137,142,149,150,],[-51,-26,-27,-32,-35,-38,-47,-48,-49,-50,-53,-25,-39,-51,-46,-52,-16,-28,-29,-30,-33,-34,-36,-37,-42,-54,-55,-17,-31,137,-40,-41,-56,-45,-57,]),'ELSE':([34,38,39,40,41,42,49,50,51,52,54,67,77,78,84,85,89,96,97,98,100,101,102,103,108,111,114,116,119,127,134,137,142,149,150,],[-51,-26,-27,-32,-35,-38,-47,-48,-49,-50,-53,-25,-39,-51,-46,-52,-16,-28,-29,-30,-33,-34,-36,-37,-42,-54,-55,-17,-31,138,-40,-41,-56,-45,-57,]),'IN':([34,38,39,40,41,42,49,50,51,52,54,64,65,67,77,78,84,85,89,96,97,98,100,101,102,103,108,111,114,116,117,118,119,134,137,141,142,149,150,],[-51,-26,-27,-32,-35,-38,-47,-48,-49,-50,-53,93,-18,-25,-39,-51,-46,-52,-16,-28,-29,-30,-33,-34,-36,-37,-42,-54,-55,-17,-19,-20,-31,-40,-41,-21,-56,-45,-57,]),'FI':([34,38,39,40,41,42,49,50,51,52,54,67,77,78,84,85,89,96,97,98,100,101,102,103,108,111,114,116,119,134,137,142,145,149,150,],[-51,-26,-27,-32,-35,-38,-47,-48,-49,-50,-53,-25,-39,-51,-46,-52,-16,-28,-29,-30,-33,-34,-36,-37,-42,-54,-55,-17,-31,-40,-41,-56,149,-45,-57,]),'ESAC':([122,123,135,152,],[134,-22,-23,-24,]),'CASSIGN':([144,],[148,]),} + +_lr_action = {} +for _k, _v in _lr_action_items.items(): + for _x,_y in zip(_v[0],_v[1]): + if not _x in _lr_action: _lr_action[_x] = {} + _lr_action[_x][_k] = _y +del _lr_action_items + +_lr_goto_items = {'program':([0,],[1,]),'class_list':([0,3,],[2,5,]),'def_class':([0,3,],[3,3,]),'feature_list':([7,10,11,19,],[9,15,16,26,]),'def_attr':([7,10,11,19,],[10,10,10,10,]),'def_func':([7,10,11,19,],[11,11,11,11,]),'param_list':([18,32,],[24,59,]),'param':([18,32,],[25,25,]),'exp':([28,37,44,45,46,47,55,61,62,87,93,99,107,109,110,113,115,120,131,138,143,148,],[35,67,79,80,82,83,86,89,92,112,116,119,125,82,127,129,92,92,141,145,92,151,]),'comp':([28,37,44,45,46,47,55,61,62,87,93,99,107,109,110,113,115,120,131,138,143,148,],[38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,]),'arith':([28,37,44,45,46,47,55,61,62,68,69,70,87,93,99,107,109,110,113,115,120,131,138,143,148,],[39,39,39,39,39,39,39,39,39,96,97,98,39,39,39,39,39,39,39,39,39,39,39,39,39,]),'term':([28,37,44,45,46,47,55,61,62,68,69,70,71,72,87,93,99,107,109,110,113,115,120,131,138,143,148,],[40,40,40,40,40,40,40,40,40,40,40,40,100,101,40,40,40,40,40,40,40,40,40,40,40,40,40,]),'factor':([28,37,43,44,45,46,47,48,55,61,62,68,69,70,71,72,73,74,87,93,99,107,109,110,113,115,120,131,138,143,148,],[41,41,77,41,41,41,41,84,41,41,41,41,41,41,41,41,102,103,41,41,41,41,41,41,41,41,41,41,41,41,41,]),'atom':([28,37,43,44,45,46,47,48,55,61,62,68,69,70,71,72,73,74,87,93,99,107,109,110,113,115,120,131,138,143,148,],[42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,]),'func_call':([28,37,43,44,45,46,47,48,55,61,62,68,69,70,71,72,73,74,87,93,99,107,109,110,113,115,120,131,138,143,148,],[54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,]),'ident_list':([36,94,],[64,117,]),'iden':([36,94,],[65,65,]),'exp_list':([46,109,],[81,126,]),'arg_list':([62,120,143,],[90,132,147,]),'arg_list_not_empty':([62,115,120,143,],[91,130,91,91,]),'case_list':([106,123,],[122,135,]),'branch':([106,123,],[123,123,]),} + +_lr_goto = {} +for _k, _v in _lr_goto_items.items(): + for _x, _y in zip(_v[0], _v[1]): + if not _x in _lr_goto: _lr_goto[_x] = {} + _lr_goto[_x][_k] = _y +del _lr_goto_items +_lr_productions = [ + ("S' -> program","S'",1,None,None,None), + ('program -> class_list','program',1,'p_program','parser.py',28), + ('class_list -> def_class','class_list',1,'p_class_list_single','parser.py',33), + ('class_list -> def_class class_list','class_list',2,'p_class_list_multi','parser.py',38), + ('def_class -> CLASS TYPEID OCUR feature_list CCUR SEMICOLON','def_class',6,'p_def_class','parser.py',43), + ('def_class -> CLASS TYPEID INHERITS TYPEID OCUR feature_list CCUR SEMICOLON','def_class',8,'p_def_class_parent','parser.py',48), + ('feature_list -> ','feature_list',0,'p_feature_list_empty','parser.py',53), + ('feature_list -> def_attr feature_list','feature_list',2,'p_feature_list_attr','parser.py',59), + ('feature_list -> def_func feature_list','feature_list',2,'p_feature_list_fun','parser.py',64), + ('def_attr -> OBJECTID COLON TYPEID SEMICOLON','def_attr',4,'p_attr','parser.py',69), + ('def_attr -> OBJECTID COLON TYPEID ASSIGN exp SEMICOLON','def_attr',6,'p_attr_exp','parser.py',74), + ('def_func -> OBJECTID OPAR CPAR COLON TYPEID OCUR exp CCUR SEMICOLON','def_func',9,'p_func','parser.py',79), + ('def_func -> OBJECTID OPAR param_list CPAR COLON TYPEID OCUR exp CCUR SEMICOLON','def_func',10,'p_func_param','parser.py',84), + ('param_list -> param','param_list',1,'p_param_list_single','parser.py',89), + ('param_list -> param COMMA param_list','param_list',3,'p_param_list_multi','parser.py',94), + ('param -> OBJECTID COLON TYPEID','param',3,'p_param','parser.py',99), + ('exp -> OBJECTID ASSIGN exp','exp',3,'p_exp_assign','parser.py',104), + ('exp -> LET ident_list IN exp','exp',4,'p_exp_let','parser.py',114), + ('ident_list -> iden','ident_list',1,'p_ident_list_single','parser.py',120), + ('ident_list -> iden COMMA ident_list','ident_list',3,'p_ident_list_multi','parser.py',125), + ('iden -> OBJECTID COLON TYPEID','iden',3,'p_iden','parser.py',130), + ('iden -> OBJECTID COLON TYPEID ASSIGN exp','iden',5,'p_iden_init','parser.py',135), + ('case_list -> branch','case_list',1,'p_case_list_single','parser.py',142), + ('case_list -> branch case_list','case_list',2,'p_case_list_multi','parser.py',147), + ('branch -> OBJECTID COLON TYPEID CASSIGN exp SEMICOLON','branch',6,'p_branch','parser.py',152), + ('exp -> NOT exp','exp',2,'p_exp_not','parser.py',157), + ('exp -> comp','exp',1,'p_exp_comp','parser.py',163), + ('comp -> arith','comp',1,'p_comp_arith','parser.py',169), + ('comp -> arith LOWER arith','comp',3,'p_comp_lower','parser.py',174), + ('comp -> arith LEQ arith','comp',3,'p_comp_leq','parser.py',179), + ('comp -> arith EQUAL arith','comp',3,'p_comp_equal','parser.py',184), + ('comp -> arith EQUAL NOT exp','comp',4,'p_comp_equal_not','parser.py',189), + ('arith -> term','arith',1,'p_arith_term','parser.py',194), + ('arith -> arith PLUS term','arith',3,'p_arith_plus','parser.py',202), + ('arith -> arith MINUS term','arith',3,'p_arith_minus','parser.py',207), + ('term -> factor','term',1,'p_term_fac','parser.py',212), + ('term -> term STAR factor','term',3,'p_term_star','parser.py',217), + ('term -> term DIV factor','term',3,'p_term_div','parser.py',222), + ('factor -> atom','factor',1,'p_factor_atom','parser.py',227), + ('factor -> TILDE factor','factor',2,'p_factor_neg','parser.py',232), + ('factor -> CASE exp OF case_list ESAC','factor',5,'p_factor_case','parser.py',237), + ('factor -> WHILE exp LOOP exp POOL','factor',5,'p_factor_while','parser.py',242), + ('factor -> OCUR exp_list CCUR','factor',3,'p_factor_block','parser.py',247), + ('exp_list -> exp SEMICOLON','exp_list',2,'p_exp_list_single','parser.py',252), + ('exp_list -> exp SEMICOLON exp_list','exp_list',3,'p_exp_list_multi','parser.py',257), + ('factor -> IF exp THEN exp ELSE exp FI','factor',7,'p_factor_cond','parser.py',264), + ('factor -> ISVOID factor','factor',2,'p_factor_void','parser.py',269), + ('atom -> INT_CONST','atom',1,'p_atom_num','parser.py',275), + ('atom -> STRING_CONST','atom',1,'p_atom_string','parser.py',280), + ('atom -> TRUE','atom',1,'p_atom_bool','parser.py',285), + ('atom -> FALSE','atom',1,'p_atom_bool','parser.py',286), + ('atom -> OBJECTID','atom',1,'p_atom_var','parser.py',292), + ('atom -> NEW TYPEID','atom',2,'p_atom_new','parser.py',297), + ('atom -> func_call','atom',1,'p_atom_func_call','parser.py',302), + ('atom -> OPAR exp CPAR','atom',3,'p_atom_exp','parser.py',307), + ('func_call -> OBJECTID OPAR arg_list CPAR','func_call',4,'p_func_call_self','parser.py',312), + ('func_call -> atom DOT OBJECTID OPAR arg_list CPAR','func_call',6,'p_func_call','parser.py',317), + ('func_call -> atom AT TYPEID DOT OBJECTID OPAR arg_list CPAR','func_call',8,'p_func_call_at','parser.py',322), + ('arg_list -> ','arg_list',0,'p_arg_list_empty','parser.py',327), + ('arg_list -> arg_list_not_empty','arg_list',1,'p_arg_list_not_empty','parser.py',333), + ('arg_list_not_empty -> exp','arg_list_not_empty',1,'p_arg_list_not_empty_single','parser.py',338), + ('arg_list_not_empty -> exp COMMA arg_list_not_empty','arg_list_not_empty',3,'p_arg_list_not_empty_multi','parser.py',343), +] From 725744f29504cd4879c835a8e1fccb18f0721430 Mon Sep 17 00:00:00 2001 From: Amy Date: Wed, 9 Feb 2022 10:50:05 -0500 Subject: [PATCH 02/81] Add initial type checker implementation --- src/cmp/semantic.py | 292 +++++++++++++++ src/cmp/visitor.py | 80 ++++ src/main.py | 67 ++++ src/parsing/ast.py | 289 ++++++++------- src/parsing/parser.py | 708 ++++++++++++++++++------------------ src/parsing/parsetab.py | 124 +++---- src/test.txt | 9 + src/tours/TypeBuilder.py | 106 ++++++ src/tours/TypeChecker.py | 439 ++++++++++++++++++++++ src/tours/TypeCollector.py | 66 ++++ src/tours/TypeInferencer.py | 200 ++++++++++ src/tours/utils.py | 78 ++++ 12 files changed, 1904 insertions(+), 554 deletions(-) create mode 100644 src/cmp/semantic.py create mode 100644 src/cmp/visitor.py create mode 100644 src/main.py create mode 100644 src/test.txt create mode 100644 src/tours/TypeBuilder.py create mode 100644 src/tours/TypeChecker.py create mode 100644 src/tours/TypeCollector.py create mode 100644 src/tours/TypeInferencer.py create mode 100644 src/tours/utils.py diff --git a/src/cmp/semantic.py b/src/cmp/semantic.py new file mode 100644 index 000000000..03c639aa4 --- /dev/null +++ b/src/cmp/semantic.py @@ -0,0 +1,292 @@ +import itertools as itt +from collections import OrderedDict + +class SemanticError(Exception): + @property + def text(self): + return self.args[0] + +class Attribute: + def __init__(self, name, typex): + self.name = name + self.type = typex + + def __str__(self): + return f'[attrib] {self.name} : {self.type.name};' + + def __repr__(self): + return str(self) + +class Method: + def __init__(self, name, param_names, params_types, return_type): + self.name = name + self.param_names = param_names + self.param_types = params_types + self.return_type = return_type + + def __str__(self): + params = ', '.join(f'{n}:{t.name}' for n,t in zip(self.param_names, self.param_types)) + return f'[method] {self.name}({params}): {self.return_type.name};' + + def __eq__(self, other): + return other.name == self.name and \ + other.return_type == self.return_type and \ + other.param_types == self.param_types + +# Types +class Type: + def __init__(self, name:str): + self.name = name + self.attributes = [] + self.methods = [] + self.parent = None + + def set_parent(self, parent): + self.parent = parent + + def get_attribute(self, name:str): + try: + return next(attr for attr in self.attributes if attr.name == name) + except StopIteration: + if self.parent is None: + raise SemanticError(f'Attribute "{name}" is not defined in {self.name}.') + try: + return self.parent.get_attribute(name) + except SemanticError: + raise SemanticError(f'Attribute "{name}" is not defined in {self.name}.') + + def get_attribute_parent(self, name:str): + try: + next(attr for attr in self.attributes if attr.name == name) + return self + except StopIteration: + if self.parent is None: + raise SemanticError(f'Attribute "{name}" is not defined in {self.name}.') + try: + return self.parent.get_attribute_parent(name) + except SemanticError: + raise SemanticError(f'Attribute "{name}" is not defined in {self.name}.') + + def define_attribute(self, name:str, typex): + try: + self.get_attribute(name) + except SemanticError: + attribute = Attribute(name, typex) + self.attributes.append(attribute) + return attribute + else: + raise SemanticError(f'Attribute "{name}" is already defined in {self.name}.') + + def get_method(self, name:str): + try: + return next(method for method in self.methods if method.name == name) + except StopIteration: + if self.parent is None: + raise SemanticError(f'Method "{name}" is not defined in {self.name}.') + try: + return self.parent.get_method(name) + except SemanticError: + raise SemanticError(f'Method "{name}" is not defined in {self.name}.') + + def get_method_parent(self, name:str): + try: + next(method for method in self.methods if method.name == name) + return self + except StopIteration: + if self.parent is None: + raise SemanticError(f'Method "{name}" is not defined in {self.name}.') + try: + return self.parent.get_method_parent(name) + except SemanticError: + raise SemanticError(f'Method "{name}" is not defined in {self.name}.') + + def define_method(self, name:str, param_names:list, param_types:list, return_type): + if name in (method.name for method in self.methods): + raise SemanticError(f'Method "{name}" already defined in {self.name}') + + method = Method(name, param_names, param_types, return_type) + self.methods.append(method) + return method + + def all_attributes(self, clean=True): + plain = OrderedDict() if self.parent is None else self.parent.all_attributes(False) + for attr in self.attributes: + plain[attr.name] = (attr, self) + return plain.values() if clean else plain + + def all_methods(self, clean=True): + plain = OrderedDict() if self.parent is None else self.parent.all_methods(False) + for method in self.methods: + plain[method.name] = (method, self) + return plain.values() if clean else plain + + def conforms_to(self, other): + return other.bypass() or self == other or self.parent is not None and self.parent.conforms_to(other) + + def bypass(self): + return False + + def __str__(self): + output = f'type {self.name}' + parent = '' if self.parent is None else f' : {self.parent.name}' + output += parent + output += ' {' + output += '\n\t' if self.attributes or self.methods else '' + output += '\n\t'.join(str(x) for x in self.attributes) + output += '\n\t' if self.attributes else '' + output += '\n\t'.join(str(x) for x in self.methods) + output += '\n' if self.methods else '' + output += '}\n' + return output + + def __repr__(self): + return str(self) + +class ErrorType(Type): + def __init__(self): + Type.__init__(self, '') + + def conforms_to(self, other): + return True + + def bypass(self): + return True + + def __eq__(self, other): + return isinstance(other, ErrorType) + +class ObjectType(Type): + def __init__(self): + Type.__init__(self, 'Object') + + def __eq__(self, other): + return other.name == self.name or isinstance(other, ObjectType) + +class IntType(Type): + def __init__(self): + Type.__init__(self, 'Int') + Type.set_parent(self, ObjectType()) + + def __eq__(self, other): + return other.name == self.name or isinstance(other, IntType) + +class StringType(Type): + def __init__(self): + Type.__init__(self, 'String') + Type.set_parent(self, ObjectType()) + + def __eq__(self, other): + return other.name == self.name or isinstance(other, StringType) + +class BoolType(Type): + def __init__(self): + Type.__init__(self, 'Bool') + Type.set_parent(self, ObjectType()) + + def __eq__(self, other): + return other.name == self.name or isinstance(other, BoolType) + +class AutoType(Type): + def __init__(self): + Type.__init__(self, 'AUTO_TYPE') + self.infered_type = None + + def __eq__(self, other): + return isinstance(other, AutoType) + +class SelfType(Type): + def __init__(self): + Type.__init__(self, 'SELF_TYPE') + + def __eq__(self, other): + return isinstance(other, SelfType) + +class IOType(Type): + def __init__(self): + Type.__init__(self, 'IO') + Type.set_parent(self, ObjectType()) + + def __eq__(self, other): + return isinstance(other, IOType) + +class Context: + def __init__(self): + self.types = {} + + def create_type(self, name:str): + if name in self.types: + raise SemanticError(f'Type with the same name ({name}) already in context.') + typex = self.types[name] = Type(name) + return typex + + def get_type(self, name:str): + try: + return self.types[name] if self.types[name] != AutoType() else AutoType() + except KeyError: + raise SemanticError(f'Type "{name}" is not defined.') + + def __str__(self): + return '{\n\t' + '\n\t'.join(y for x in self.types.values() for y in str(x).split('\n')) + '\n}' + + def __repr__(self): + return str(self) + +class VariableInfo: + def __init__(self, name, vtype): + self.name = name + self.type = vtype + +class Scope: + def __init__(self, parent=None): + self.locals = [] + self.parent = parent + self.children = [] + self.index = 0 if parent is None else len(parent) + self.class_name = None + self.method_name = None + + def __len__(self): + return len(self.locals) + + def create_child(self, class_name=None, method_name=None): + child = Scope(self) + self.children.append(child) + child.class_name = class_name + child.method_name = method_name + return child + + def define_variable(self, vname, vtype): + info = VariableInfo(vname, vtype) + self.locals.append(info) + return info + + def find_variable(self, vname, index=None): + locals = self.locals if index is None else itt.islice(self.locals, index) + try: + return next(x for x in locals if x.name == vname) + except StopIteration: + return self.parent.find_variable(vname, self.index) if self.parent is not None else None + + def find_variable_or_attribute(self, vname, current_type): + var = self.find_variable(vname) + if var is None: + try: + return current_type.get_attribute(vname) + except SemanticError: + return None + else: + return var + + def is_defined(self, vname, current_type): + return self.find_variable_or_attribute(vname, current_type) is not None + + def is_local(self, vname): + return any(True for x in self.locals if x.name == vname) + + def child_find_variable(self, vname): + var = next(x for x in self.locals if x.name == vname) + if var is not None: + return self + else: + for child in self.children: + child.child_find_variable(vname) diff --git a/src/cmp/visitor.py b/src/cmp/visitor.py new file mode 100644 index 000000000..964842836 --- /dev/null +++ b/src/cmp/visitor.py @@ -0,0 +1,80 @@ +# The MIT License (MIT) +# +# Copyright (c) 2013 Curtis Schlak +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +import inspect + +__all__ = ['on', 'when'] + +def on(param_name): + def f(fn): + dispatcher = Dispatcher(param_name, fn) + return dispatcher + return f + + +def when(param_type): + def f(fn): + frame = inspect.currentframe().f_back + func_name = fn.func_name if 'func_name' in dir(fn) else fn.__name__ + dispatcher = frame.f_locals[func_name] + if not isinstance(dispatcher, Dispatcher): + dispatcher = dispatcher.dispatcher + dispatcher.add_target(param_type, fn) + def ff(*args, **kw): + return dispatcher(*args, **kw) + ff.dispatcher = dispatcher + return ff + return f + + +class Dispatcher(object): + def __init__(self, param_name, fn): + frame = inspect.currentframe().f_back.f_back + top_level = frame.f_locals == frame.f_globals + self.param_index = self.__argspec(fn).args.index(param_name) + self.param_name = param_name + self.targets = {} + + def __call__(self, *args, **kw): + typ = args[self.param_index].__class__ + d = self.targets.get(typ) + if d is not None: + return d(*args, **kw) + else: + issub = issubclass + t = self.targets + ks = t.keys() + ans = [t[k](*args, **kw) for k in ks if issub(typ, k)] + if len(ans) == 1: + return ans.pop() + return ans + + def add_target(self, typ, target): + self.targets[typ] = target + + @staticmethod + def __argspec(fn): + # Support for Python 3 type hints requires inspect.getfullargspec + if hasattr(inspect, 'getfullargspec'): + return inspect.getfullargspec(fn) + else: + return inspect.getargspec(fn) diff --git a/src/main.py b/src/main.py new file mode 100644 index 000000000..dbb44b9de --- /dev/null +++ b/src/main.py @@ -0,0 +1,67 @@ + +from parsing.parser import COOL_Parser +from parsing.lexer import COOL_Lexer +from tours.TypeCollector import TypeCollector +from tours.TypeBuilder import TypeBuilder +from tours.TypeChecker import TypeChecker +from tours.TypeInferencer import TypeInferencer +from tours.utils import AnalizeScopeAutoTypes, AnalizeClassAutoTypes + +input_file = "test.txt" +with open(input_file, 'r') as f: + s = f.read() + +lexer = COOL_Lexer() +lexer.build() + +tokens = list(lexer.tokenize(s)) +if lexer.errors: + for e in lexer.errors: + print(e) + #exit(1) + +parser = COOL_Parser() +ast, errors = parser.parse(s) +if errors: + for e in errors: + print(e) + +# Collecting Types +collector = TypeCollector() +collector.visit(ast) +context = collector.context +errors = collector.errors + +# Building Types +builder = TypeBuilder(context, errors) +builder.visit(ast) + +# Checking Types +checker = TypeChecker(context, errors) +scope = checker.visit(ast) + +# Infering Types +while True: + inferencer = TypeInferencer(context, errors) + if not inferencer.visit(ast): + break + +inferences = [] +for declaration in ast.declarations: + AnalizeClassAutoTypes(context.get_type(declaration.id), errors, inferences) +AnalizeScopeAutoTypes(scope, errors, inferences) + +print("Infered Types:") +if inferences: + for inf in inferences: + print(inf) +else: + print("There wasn't any variable type infered.") + +# Print Errors +print("Errors:") +if errors: + for error in errors: + print(error) +else: + print("There wasn't any error in the code entered.") diff --git a/src/parsing/ast.py b/src/parsing/ast.py index e9e7faef2..38af21d6d 100644 --- a/src/parsing/ast.py +++ b/src/parsing/ast.py @@ -1,138 +1,151 @@ -class Node: - pass - -class ProgramNode(Node): - def __init__(self, declarations): - self.declarations = declarations - -class DeclarationNode(Node): - pass - -class ExpressionNode(Node): - pass - -class ClassDeclarationNode(DeclarationNode): - def __init__(self, idx, features, parent=None): - self.id = idx - self.parent = parent - self.features = features - -class FuncDeclarationNode(DeclarationNode): - def __init__(self, idx, params, return_type, body): - self.id = idx - self.params = params - self.return_type = return_type - self.body = body - -class AttrDeclarationNode(DeclarationNode): - def __init__(self, idx, typex, expr = None): - self.id = idx - self.type = typex - self.expr = expr - -class VarDeclarationNode(ExpressionNode): - def __init__(self, idx, typex, expr): - self.id = idx - self.type = typex - self.expr = expr - -class AssignNode(ExpressionNode): - def __init__(self, idx, expr): - self.id = idx - self.expr = expr - -class CallNode(ExpressionNode): - def __init__(self, obj, idx, args, from_type= None): - self.obj = obj - self.id = idx - self.args = args - self.from_type = from_type - - -class BinaryNode(ExpressionNode): - def __init__(self, left, right): - self.left = left - self.right = right - -class UnaryNode(ExpressionNode): - def __init__(self, exp): - self.exp = exp - - -class ConditionalNode(ExpressionNode): - def __init__(self,if_exp,then_exp,else_exp): - self.if_exp = if_exp - self.then_exp = then_exp - self.else_exp = else_exp - -class LoopNode(ExpressionNode): - def __init__(self,while_exp, loop_exp): - self.while_exp = while_exp - self.loop_exp = loop_exp - -class BlockNode(ExpressionNode): - def __init__(self,exp_list): - self.exp_list = exp_list - -class LetNode(ExpressionNode): - def __init__(self, var_list, in_exp): - self.var_list = var_list - self.in_exp = in_exp - -class CaseNode(ExpressionNode): - def __init__(self,cond, case_list): - self.cond = cond - self.case_list = case_list - - -class AtomicNode(ExpressionNode): - def __init__(self, lex): - self.lex = lex - - -class ConstantNumNode(AtomicNode): - pass - -class ConstantStringNode(AtomicNode): - pass - -class ConstantBoolNode(AtomicNode): - pass - -class VariableNode(AtomicNode): - pass - -class InstantiateNode(AtomicNode): - pass - -class IsVoidNode(UnaryNode): - pass - -class NotNode(UnaryNode): - pass - -class NegNode(UnaryNode): - pass - - -class PlusNode(BinaryNode): - pass - -class MinusNode(BinaryNode): - pass - -class StarNode(BinaryNode): - pass - -class DivNode(BinaryNode): - pass - -class LessNode(BinaryNode): - pass - -class LessEqualNode(BinaryNode): - pass - -class EqualNode(BinaryNode): - pass - +class Node: + pass + +class ProgramNode(Node): + def __init__(self, declarations): + self.declarations = declarations + +class DeclarationNode(Node): + pass + +class ExpressionNode(Node): + pass + +# Class +class ClassDeclarationNode(DeclarationNode): + def __init__(self, idx, features, parent=None): + self.id = idx + self.parent = parent + self.features = features + +# Features +class FuncDeclarationNode(DeclarationNode): + def __init__(self, idx, params, return_type, body): + self.id = idx + self.params = params + self.type = return_type + self.expr = body + +class AttrDeclarationNode(DeclarationNode): + def __init__(self, idx, typex, expr=None): + self.id = idx + self.type = typex + self.expr = expr + +class VarDeclarationNode(ExpressionNode): + def __init__(self, idx, typex, expr=None): + self.id = idx + self.type = typex + self.expr = expr + +class AssignNode(ExpressionNode): + def __init__(self, idx, expr): + self.id = idx + self.expr = expr + +class DispatchNode(ExpressionNode): + def __init__(self, obj, idx, args, from_type=None): + self.expr = obj + self.id = idx + self.arg = args + self.type = from_type + +class BinaryNode(ExpressionNode): + def __init__(self, left, right): + self.left = left + self.right = right + +class UnaryNode(ExpressionNode): + def __init__(self, exp): + self.expr = exp + +class ConditionalNode(ExpressionNode): + def __init__(self, if_exp, then_exp, else_exp): + self.predicate = if_exp + self.then = then_exp + self.elsex = else_exp + +class LoopNode(ExpressionNode): + def __init__(self, while_exp, loop_exp): + self.predicate = while_exp + self.body = loop_exp + +class BlockNode(ExpressionNode): + def __init__(self, exp_list): + self.expr_lis = exp_list + +class LetNode(ExpressionNode): + def __init__(self, var_list, in_exp): + self.variables = var_list + self.expr = in_exp + +class CaseNode(ExpressionNode): + def __init__(self, cond, case_list): + self.expr = cond + self.cases = case_list + +class CaseAttrNode(ExpressionNode): + def __init__(self, idx, typex, expr): + self.id = idx + self.type = typex + self.expr = expr + +class AtomicNode(ExpressionNode): + def __init__(self, lex): + self.lex = lex + +# Atomic Expressions +class ConstantNumNode(AtomicNode): + pass + +class StringNode(AtomicNode): + pass + +class TrueNode(AtomicNode): + pass + +class FalseNode(AtomicNode): + pass + +class VariableNode(AtomicNode): + pass + +class InstantiateNode(AtomicNode): + pass + +# Arithmetic Operations +class PlusNode(BinaryNode): + pass + +class MinusNode(BinaryNode): + pass + +class StarNode(BinaryNode): + pass + +class DivNode(BinaryNode): + pass + +# Comparison Operations +class LessNode(BinaryNode): + pass + +class ElessNode(BinaryNode): + pass + +class EqualsNode(BinaryNode): + pass + +# Unary Operations +class NotNode(UnaryNode): + pass + +class PrimeNode(UnaryNode): + pass + +class IsVoidNode(UnaryNode): + pass + + + + diff --git a/src/parsing/parser.py b/src/parsing/parser.py index 82c2714c5..75c76e9f3 100644 --- a/src/parsing/parser.py +++ b/src/parsing/parser.py @@ -1,355 +1,355 @@ -import ply.yacc as yacc -from .lexer import COOL_Lexer -from .ast import * - -class COOL_Parser: - - - def __init__(self): - self.tokens = COOL_Lexer.tokens - - - def parse(self, input_string): - l = COOL_Lexer() - l.build() - self.lex = l - self.errors = [] - self.parser = yacc.yacc(module=self) - self.input = input_string - result = self.parser.parse(input_string, lexer=self.lex.lexer) - return result, self.errors - - - ###################################################################### - # Grammar # - ###################################################################### - - @staticmethod - def p_program(p): - 'program : class_list' - p[0] = ProgramNode(p[1]) - - @staticmethod - def p_class_list_single(p): - 'class_list : def_class' - p[0] = [p[1]] - - @staticmethod - def p_class_list_multi(p): - 'class_list : def_class class_list' - p[0] = [p[1]] + p[2] - - @staticmethod - def p_def_class(p): - 'def_class : CLASS TYPEID OCUR feature_list CCUR SEMICOLON' - p[0] = ClassDeclarationNode(p[2],p[4]) - - @staticmethod - def p_def_class_parent(p): - 'def_class : CLASS TYPEID INHERITS TYPEID OCUR feature_list CCUR SEMICOLON' - p[0] = ClassDeclarationNode(p[2],p[6],p[4]) - - @staticmethod - def p_feature_list_empty(p): - 'feature_list :' - p[0] = [] - pass - - @staticmethod - def p_feature_list_attr(p): - 'feature_list : def_attr feature_list' - p[0] = [p[1]] + p[2] - - @staticmethod - def p_feature_list_fun(p): - 'feature_list : def_func feature_list' - p[0] = [p[1]] + p[2] - - @staticmethod - def p_attr(p): - 'def_attr : OBJECTID COLON TYPEID SEMICOLON' - p[0] = AttrDeclarationNode( p[1],p[3] ) - - @staticmethod - def p_attr_exp(p): - 'def_attr : OBJECTID COLON TYPEID ASSIGN exp SEMICOLON' - p[0] = AttrDeclarationNode( p[1],p[3],p[5] ) - - @staticmethod - def p_func(p): - 'def_func : OBJECTID OPAR CPAR COLON TYPEID OCUR exp CCUR SEMICOLON' - p[0] = FuncDeclarationNode(p[1], [], p[5], p[7]) - - @staticmethod - def p_func_param(p): - 'def_func : OBJECTID OPAR param_list CPAR COLON TYPEID OCUR exp CCUR SEMICOLON' - p[0] = FuncDeclarationNode(p[1], p[3], p[6], p[8]) - - @staticmethod - def p_param_list_single(p): - 'param_list : param' - p[0] = [p[1]] - - @staticmethod - def p_param_list_multi(p): - 'param_list : param COMMA param_list' - p[0] = [p[1]] + p[3] - - @staticmethod - def p_param(p): - 'param : OBJECTID COLON TYPEID' - p[0] = (p[1],p[3]) - - @staticmethod - def p_exp_assign(p): - 'exp : OBJECTID ASSIGN exp' - p[0] = AssignNode(p[1],p[3]) - - @staticmethod - def p_exp_let(p): - 'exp : LET ident_list IN exp' - p[0] = LetNode(p[2],p[4]) - - @staticmethod - def p_ident_list_single(p): - 'ident_list : iden' - p[0] = [p[1]] - - @staticmethod - def p_ident_list_multi(p): - 'ident_list : iden COMMA ident_list' - p[0] = [p[1]] + p[3] - - @staticmethod - def p_iden(p): - 'iden : OBJECTID COLON TYPEID' - p[0] = (p[1],p[3],None) - - @staticmethod - def p_iden_init(p): - 'iden : OBJECTID COLON TYPEID ASSIGN exp' - p[0] = (p[1],p[3],p[5]) - - @staticmethod - def p_case_list_single(p): - 'case_list : branch' - p[0] = [p[1]] - - @staticmethod - def p_case_list_multi(p): - 'case_list : branch case_list' - p[0] = [p[1]] + p[2] - - @staticmethod - def p_branch(p): - 'branch : OBJECTID COLON TYPEID CASSIGN exp SEMICOLON' - p[0] = (p[1],p[3],p[5]) - - @staticmethod - def p_exp_not(p): - 'exp : NOT exp' - p[0] = NotNode(p[2]) - - @staticmethod - def p_exp_comp(p): - 'exp : comp' - p[0] = p[1] - - @staticmethod - def p_comp_arith(p): - 'comp : arith' - p[0] = p[1] - - @staticmethod - def p_comp_lower(p): - 'comp : arith LOWER arith' - p[0] = LessNode(p[1],p[3]) - - @staticmethod - def p_comp_leq(p): - 'comp : arith LEQ arith' - p[0] = LessEqualNode(p[1],p[3]) - - @staticmethod - def p_comp_equal(p): - 'comp : arith EQUAL arith' - p[0] = EqualNode(p[1],p[3]) - - @staticmethod - def p_comp_equal_not(p): - 'comp : arith EQUAL NOT exp' - p[0] = EqualNode(p[1],p[4]) - - @staticmethod - def p_arith_term(p): - 'arith : term' - p[0]= p[1] - - @staticmethod - def p_arith_plus(p): - 'arith : arith PLUS term' - p[0] = PlusNode(p[1],p[3]) - - @staticmethod - def p_arith_minus(p): - 'arith : arith MINUS term' - p[0] = MinusNode(p[1],p[3]) - - @staticmethod - def p_term_fac(p): - 'term : factor' - p[0] = p[1] - - @staticmethod - def p_term_star(p): - 'term : term STAR factor' - p[0] = StarNode(p[1],p[3]) - - @staticmethod - def p_term_div(p): - 'term : term DIV factor' - p[0] = DivNode(p[1],p[3]) - - @staticmethod - def p_factor_atom(p): - 'factor : atom' - p[0] = p[1] - - @staticmethod - def p_factor_neg(p): - 'factor : TILDE factor' - p[0] = NegNode(p[2]) - - @staticmethod - def p_factor_case(p): - 'factor : CASE exp OF case_list ESAC' - p[0] = CaseNode(p[2],p[4]) - - @staticmethod - def p_factor_while(p): - 'factor : WHILE exp LOOP exp POOL' - p[0] = LoopNode(p[2],p[4]) - - @staticmethod - def p_factor_block(p): - 'factor : OCUR exp_list CCUR' - p[0] = BlockNode(p[2]) - - @staticmethod - def p_exp_list_single(p): - 'exp_list : exp SEMICOLON' - p[0] = [p[1]] - - @staticmethod - def p_exp_list_multi(p): - 'exp_list : exp SEMICOLON exp_list' - p[0] = [p[1]] + p[3] - - @staticmethod - def p_factor_cond(p): - 'factor : IF exp THEN exp ELSE exp FI' - p[0] = ConditionalNode(p[2],p[4],p[6]) - - @staticmethod - def p_factor_void(p): - 'factor : ISVOID factor' - p[0] = IsVoidNode(p[2]) - - @staticmethod - def p_atom_num(p): - 'atom : INT_CONST' - p[0] = ConstantNumNode(p[1]) - - @staticmethod - def p_atom_string(p): - 'atom : STRING_CONST' - p[0] = ConstantStringNode(p[1]) - - @staticmethod - def p_atom_bool(p): - '''atom : TRUE - | FALSE - ''' - p[0] = ConstantBoolNode(p[1]) - - @staticmethod - def p_atom_var(p): - 'atom : OBJECTID' - p[0]= VariableNode(p[1]) - - @staticmethod - def p_atom_new(p): - 'atom : NEW TYPEID' - p[0]= InstantiateNode(p[2]) - - @staticmethod - def p_atom_func_call(p): - 'atom : func_call' - p[0] = p[1] - - @staticmethod - def p_atom_exp(p): - 'atom : OPAR exp CPAR' - p[0] = p[2] - - @staticmethod - def p_func_call_self(p): - 'func_call : OBJECTID OPAR arg_list CPAR' - p[0] = CallNode(VariableNode('self'),p[1],p[3]) - - @staticmethod - def p_func_call(p): - 'func_call : atom DOT OBJECTID OPAR arg_list CPAR' - p[0] = CallNode(p[1],p[3],p[5]) - - @staticmethod - def p_func_call_at(p): - 'func_call : atom AT TYPEID DOT OBJECTID OPAR arg_list CPAR' - p[0] = CallNode(p[1],p[5],p[7],p[3]) - - @staticmethod - def p_arg_list_empty(p): - 'arg_list :' - p[0] = [] - pass - - @staticmethod - def p_arg_list_not_empty(p): - 'arg_list : arg_list_not_empty' - p[0] = p[1] - - @staticmethod - def p_arg_list_not_empty_single(p): - 'arg_list_not_empty : exp' - p[0] = [p[1]] - - @staticmethod - def p_arg_list_not_empty_multi(p): - 'arg_list_not_empty : exp COMMA arg_list_not_empty' - p[0] = [p[1]] + p[3] - - #Error rule for syntax errors - def p_error(self, p): - if not p: - l = COOL_Lexer() - l.build() - for t in l.tokenize(self.input): - if t.value != 'class': #Error at the beginning - p = t - break - - if not p: # Error at the end - self.errors.append('(0, 0) - SyntacticError: ERROR at or near EOF') - return - - col = self.__find_column(p) - line = p.lineno - val = p.value - #(29, 9) - SyntacticError: ERROR at or near "Test1" - self.errors.append(f'({line}, {col}) - SyntacticError: ERROR at or near "{val}"') - - - def __find_column(self, token): - input_s = self.input - line_start = input_s.rfind('\n', 0, token.lexpos) + 1 +import ply.yacc as yacc +from .lexer import COOL_Lexer +from .ast import * + +class COOL_Parser: + + def __init__(self): + self.tokens = COOL_Lexer.tokens + + def parse(self, input_string): + l = COOL_Lexer() + l.build() + self.lex = l + self.errors = [] + self.parser = yacc.yacc(module=self) + self.input = input_string + result = self.parser.parse(input_string, lexer=self.lex.lexer) + return result, self.errors + + ###################################################################### + # Grammar # + ###################################################################### + + @staticmethod + def p_program(p): + 'program : class_list' + p[0] = ProgramNode(p[1]) + + @staticmethod + def p_class_list_single(p): + 'class_list : def_class' + p[0] = [p[1]] + + @staticmethod + def p_class_list_multi(p): + 'class_list : def_class class_list' + p[0] = [p[1]] + p[2] + + @staticmethod + def p_def_class(p): + 'def_class : CLASS TYPEID OCUR feature_list CCUR SEMICOLON' + p[0] = ClassDeclarationNode(p[2],p[4]) + + @staticmethod + def p_def_class_parent(p): + 'def_class : CLASS TYPEID INHERITS TYPEID OCUR feature_list CCUR SEMICOLON' + p[0] = ClassDeclarationNode(p[2],p[6],p[4]) + + @staticmethod + def p_feature_list_empty(p): + 'feature_list :' + p[0] = [] + pass + + @staticmethod + def p_feature_list_attr(p): + 'feature_list : def_attr feature_list' + p[0] = [p[1]] + p[2] + + @staticmethod + def p_feature_list_fun(p): + 'feature_list : def_func feature_list' + p[0] = [p[1]] + p[2] + + @staticmethod + def p_attr(p): + 'def_attr : OBJECTID COLON TYPEID SEMICOLON' + p[0] = AttrDeclarationNode(p[1],p[3]) + + @staticmethod + def p_attr_exp(p): + 'def_attr : OBJECTID COLON TYPEID ASSIGN exp SEMICOLON' + p[0] = AttrDeclarationNode(p[1],p[3],p[5]) + + @staticmethod + def p_func(p): + 'def_func : OBJECTID OPAR CPAR COLON TYPEID OCUR exp CCUR SEMICOLON' + p[0] = FuncDeclarationNode(p[1],[],p[5],p[7]) + + @staticmethod + def p_func_param(p): + 'def_func : OBJECTID OPAR param_list CPAR COLON TYPEID OCUR exp CCUR SEMICOLON' + p[0] = FuncDeclarationNode(p[1],p[3],p[6],p[8]) + + @staticmethod + def p_param_list_single(p): + 'param_list : param' + p[0] = [p[1]] + + @staticmethod + def p_param_list_multi(p): + 'param_list : param COMMA param_list' + p[0] = [p[1]] + p[3] + + @staticmethod + def p_param(p): + 'param : OBJECTID COLON TYPEID' + p[0] = VarDeclarationNode(p[1],p[3]) + + @staticmethod + def p_exp_assign(p): + 'exp : OBJECTID ASSIGN exp' + p[0] = AssignNode(p[1],p[3]) + + @staticmethod + def p_exp_let(p): + 'exp : LET ident_list IN exp' + p[0] = LetNode(p[2],p[4]) + + @staticmethod + def p_ident_list_single(p): + 'ident_list : iden' + p[0] = [p[1]] + + @staticmethod + def p_ident_list_multi(p): + 'ident_list : iden COMMA ident_list' + p[0] = [p[1]] + p[3] + + @staticmethod + def p_iden(p): + 'iden : OBJECTID COLON TYPEID' + p[0] = AttrDeclarationNode(p[1],p[3],None) + + @staticmethod + def p_iden_init(p): + 'iden : OBJECTID COLON TYPEID ASSIGN exp' + p[0] = AttrDeclarationNode(p[1],p[3],p[5]) + + @staticmethod + def p_case_list_single(p): + 'case_list : branch' + p[0] = [p[1]] + + @staticmethod + def p_case_list_multi(p): + 'case_list : branch case_list' + p[0] = [p[1]] + p[2] + + @staticmethod + def p_branch(p): + 'branch : OBJECTID COLON TYPEID CASSIGN exp SEMICOLON' + p[0] = CaseAttrNode(p[1],p[3],p[5]) + + @staticmethod + def p_exp_not(p): + 'exp : NOT exp' + p[0] = NotNode(p[2]) + + @staticmethod + def p_exp_comp(p): + 'exp : comp' + p[0] = p[1] + + @staticmethod + def p_comp_arith(p): + 'comp : arith' + p[0] = p[1] + + @staticmethod + def p_comp_lower(p): + 'comp : arith LOWER arith' + p[0] = LessNode(p[1],p[3]) + + @staticmethod + def p_comp_leq(p): + 'comp : arith LEQ arith' + p[0] = ElessNode(p[1],p[3]) + + @staticmethod + def p_comp_equal(p): + 'comp : arith EQUAL arith' + p[0] = EqualsNode(p[1],p[3]) + + # ?????? + @staticmethod + def p_comp_equal_not(p): + 'comp : arith EQUAL NOT exp' + p[0] = EqualsNode(p[1],p[4]) + + @staticmethod + def p_arith_term(p): + 'arith : term' + p[0]= p[1] + + @staticmethod + def p_arith_plus(p): + 'arith : arith PLUS term' + p[0] = PlusNode(p[1],p[3]) + + @staticmethod + def p_arith_minus(p): + 'arith : arith MINUS term' + p[0] = MinusNode(p[1],p[3]) + + @staticmethod + def p_term_fac(p): + 'term : factor' + p[0] = p[1] + + @staticmethod + def p_term_star(p): + 'term : term STAR factor' + p[0] = StarNode(p[1],p[3]) + + @staticmethod + def p_term_div(p): + 'term : term DIV factor' + p[0] = DivNode(p[1],p[3]) + + @staticmethod + def p_factor_atom(p): + 'factor : atom' + p[0] = p[1] + + @staticmethod + def p_factor_neg(p): + 'factor : TILDE factor' + p[0] = PrimeNode(p[2]) + + @staticmethod + def p_factor_case(p): + 'factor : CASE exp OF case_list ESAC' + p[0] = CaseNode(p[2],p[4]) + + @staticmethod + def p_factor_while(p): + 'factor : WHILE exp LOOP exp POOL' + p[0] = LoopNode(p[2],p[4]) + + @staticmethod + def p_factor_block(p): + 'factor : OCUR exp_list CCUR' + p[0] = BlockNode(p[2]) + + @staticmethod + def p_exp_list_single(p): + 'exp_list : exp SEMICOLON' + p[0] = [p[1]] + + @staticmethod + def p_exp_list_multi(p): + 'exp_list : exp SEMICOLON exp_list' + p[0] = [p[1]] + p[3] + + @staticmethod + def p_factor_cond(p): + 'factor : IF exp THEN exp ELSE exp FI' + p[0] = ConditionalNode(p[2],p[4],p[6]) + + @staticmethod + def p_factor_void(p): + 'factor : ISVOID factor' + p[0] = IsVoidNode(p[2]) + + @staticmethod + def p_atom_num(p): + 'atom : INT_CONST' + p[0] = ConstantNumNode(p[1]) + + @staticmethod + def p_atom_string(p): + 'atom : STRING_CONST' + p[0] = StringNode(p[1]) + + @staticmethod + def p_atom_true(p): + 'atom : TRUE' + p[0] = TrueNode(p[1]) + + @staticmethod + def p_atom_false(p): + 'atom : FALSE' + p[0] = FalseNode(p[1]) + + @staticmethod + def p_atom_var(p): + 'atom : OBJECTID' + p[0] = VariableNode(p[1]) + + @staticmethod + def p_atom_new(p): + 'atom : NEW TYPEID' + p[0] = InstantiateNode(p[2]) + + @staticmethod + def p_atom_func_call(p): + 'atom : func_call' + p[0] = p[1] + + @staticmethod + def p_atom_exp(p): + 'atom : OPAR exp CPAR' + p[0] = p[2] + + @staticmethod + def p_func_call_self(p): + 'func_call : OBJECTID OPAR arg_list CPAR' + p[0] = DispatchNode(VariableNode('self'),p[1],p[3]) + + @staticmethod + def p_func_call(p): + 'func_call : atom DOT OBJECTID OPAR arg_list CPAR' + p[0] = DispatchNode(p[1],p[3],p[5]) + + @staticmethod + def p_func_call_at(p): + 'func_call : atom AT TYPEID DOT OBJECTID OPAR arg_list CPAR' + p[0] = DispatchNode(p[1],p[5],p[7],p[3]) + + @staticmethod + def p_arg_list_empty(p): + 'arg_list :' + p[0] = [] + pass + + @staticmethod + def p_arg_list_not_empty(p): + 'arg_list : arg_list_not_empty' + p[0] = p[1] + + @staticmethod + def p_arg_list_not_empty_single(p): + 'arg_list_not_empty : exp' + p[0] = [p[1]] + + @staticmethod + def p_arg_list_not_empty_multi(p): + 'arg_list_not_empty : exp COMMA arg_list_not_empty' + p[0] = [p[1]] + p[3] + + #Error rule for syntax errors + def p_error(self, p): + if not p: + l = COOL_Lexer() + l.build() + for t in l.tokenize(self.input): + if t.value != 'class': #Error at the beginning + p = t + break + + if not p: # Error at the end + self.errors.append('(0, 0) - SyntacticError: ERROR at or near EOF') + return + + col = self.__find_column(p) + line = p.lineno + val = p.value + #(29, 9) - SyntacticError: ERROR at or near "Test1" + self.errors.append(f'({line}, {col}) - SyntacticError: ERROR at or near "{val}"') + + def __find_column(self, token): + input_s = self.input + line_start = input_s.rfind('\n', 0, token.lexpos) + 1 return (token.lexpos - line_start) + 1 \ No newline at end of file diff --git a/src/parsing/parsetab.py b/src/parsing/parsetab.py index 7016a65a9..63203858f 100644 --- a/src/parsing/parsetab.py +++ b/src/parsing/parsetab.py @@ -6,7 +6,7 @@ _lr_method = 'LALR' -_lr_signature = 'ASSIGN AT CASE CASSIGN CCUR CLASS COLON COMMA CPAR DIV DOT ELSE EQUAL ESAC FALSE FI IF IN INHERITS INT_CONST ISVOID LEQ LET LOOP LOWER MINUS NEW NOT OBJECTID OCUR OF OPAR PLUS POOL SEMICOLON STAR STRING_CONST THEN TILDE TRUE TYPEID WHILEprogram : class_listclass_list : def_classclass_list : def_class class_listdef_class : CLASS TYPEID OCUR feature_list CCUR SEMICOLONdef_class : CLASS TYPEID INHERITS TYPEID OCUR feature_list CCUR SEMICOLONfeature_list :feature_list : def_attr feature_listfeature_list : def_func feature_listdef_attr : OBJECTID COLON TYPEID SEMICOLONdef_attr : OBJECTID COLON TYPEID ASSIGN exp SEMICOLONdef_func : OBJECTID OPAR CPAR COLON TYPEID OCUR exp CCUR SEMICOLONdef_func : OBJECTID OPAR param_list CPAR COLON TYPEID OCUR exp CCUR SEMICOLONparam_list : paramparam_list : param COMMA param_listparam : OBJECTID COLON TYPEIDexp : OBJECTID ASSIGN expexp : LET ident_list IN expident_list : idenident_list : iden COMMA ident_listiden : OBJECTID COLON TYPEIDiden : OBJECTID COLON TYPEID ASSIGN expcase_list : branchcase_list : branch case_listbranch : OBJECTID COLON TYPEID CASSIGN exp SEMICOLONexp : NOT expexp : compcomp : arithcomp : arith LOWER arithcomp : arith LEQ arithcomp : arith EQUAL arithcomp : arith EQUAL NOT exparith : termarith : arith PLUS termarith : arith MINUS termterm : factorterm : term STAR factorterm : term DIV factorfactor : atomfactor : TILDE factorfactor : CASE exp OF case_list ESACfactor : WHILE exp LOOP exp POOLfactor : OCUR exp_list CCURexp_list : exp SEMICOLONexp_list : exp SEMICOLON exp_listfactor : IF exp THEN exp ELSE exp FIfactor : ISVOID factoratom : INT_CONSTatom : STRING_CONSTatom : TRUE\n | FALSE\n atom : OBJECTIDatom : NEW TYPEIDatom : func_callatom : OPAR exp CPARfunc_call : OBJECTID OPAR arg_list CPARfunc_call : atom DOT OBJECTID OPAR arg_list CPARfunc_call : atom AT TYPEID DOT OBJECTID OPAR arg_list CPARarg_list :arg_list : arg_list_not_emptyarg_list_not_empty : exparg_list_not_empty : exp COMMA arg_list_not_empty' +_lr_signature = 'ASSIGN AT CASE CASSIGN CCUR CLASS COLON COMMA CPAR DIV DOT ELSE EQUAL ESAC FALSE FI IF IN INHERITS INT_CONST ISVOID LEQ LET LOOP LOWER MINUS NEW NOT OBJECTID OCUR OF OPAR PLUS POOL SEMICOLON STAR STRING_CONST THEN TILDE TRUE TYPEID WHILEprogram : class_listclass_list : def_classclass_list : def_class class_listdef_class : CLASS TYPEID OCUR feature_list CCUR SEMICOLONdef_class : CLASS TYPEID INHERITS TYPEID OCUR feature_list CCUR SEMICOLONfeature_list :feature_list : def_attr feature_listfeature_list : def_func feature_listdef_attr : OBJECTID COLON TYPEID SEMICOLONdef_attr : OBJECTID COLON TYPEID ASSIGN exp SEMICOLONdef_func : OBJECTID OPAR CPAR COLON TYPEID OCUR exp CCUR SEMICOLONdef_func : OBJECTID OPAR param_list CPAR COLON TYPEID OCUR exp CCUR SEMICOLONparam_list : paramparam_list : param COMMA param_listparam : OBJECTID COLON TYPEIDexp : OBJECTID ASSIGN expexp : LET ident_list IN expident_list : idenident_list : iden COMMA ident_listiden : OBJECTID COLON TYPEIDiden : OBJECTID COLON TYPEID ASSIGN expcase_list : branchcase_list : branch case_listbranch : OBJECTID COLON TYPEID CASSIGN exp SEMICOLONexp : NOT expexp : compcomp : arithcomp : arith LOWER arithcomp : arith LEQ arithcomp : arith EQUAL arithcomp : arith EQUAL NOT exparith : termarith : arith PLUS termarith : arith MINUS termterm : factorterm : term STAR factorterm : term DIV factorfactor : atomfactor : TILDE factorfactor : CASE exp OF case_list ESACfactor : WHILE exp LOOP exp POOLfactor : OCUR exp_list CCURexp_list : exp SEMICOLONexp_list : exp SEMICOLON exp_listfactor : IF exp THEN exp ELSE exp FIfactor : ISVOID factoratom : INT_CONSTatom : STRING_CONSTatom : TRUEatom : FALSEatom : OBJECTIDatom : NEW TYPEIDatom : func_callatom : OPAR exp CPARfunc_call : OBJECTID OPAR arg_list CPARfunc_call : atom DOT OBJECTID OPAR arg_list CPARfunc_call : atom AT TYPEID DOT OBJECTID OPAR arg_list CPARarg_list :arg_list : arg_list_not_emptyarg_list_not_empty : exparg_list_not_empty : exp COMMA arg_list_not_empty' _lr_action_items = {'CLASS':([0,3,20,60,],[4,4,-4,-5,]),'$end':([1,2,3,5,20,60,],[0,-1,-2,-3,-4,-5,]),'TYPEID':([4,8,17,29,30,53,58,76,95,136,],[6,13,21,56,57,85,88,105,118,144,]),'OCUR':([6,13,28,37,43,44,45,46,47,48,55,57,61,62,68,69,70,71,72,73,74,87,88,93,99,107,109,110,113,115,120,131,138,143,148,],[7,19,46,46,46,46,46,46,46,46,46,87,46,46,46,46,46,46,46,46,46,46,113,46,46,46,46,46,46,46,46,46,46,46,46,]),'INHERITS':([6,],[8,]),'CCUR':([7,9,10,11,15,16,19,26,27,34,38,39,40,41,42,49,50,51,52,54,63,67,77,78,81,84,85,89,96,97,98,100,101,102,103,108,109,111,112,114,116,119,126,129,134,137,139,142,146,149,150,],[-6,14,-6,-6,-7,-8,-6,33,-9,-51,-26,-27,-32,-35,-38,-47,-48,-49,-50,-53,-10,-25,-39,-51,108,-46,-52,-16,-28,-29,-30,-33,-34,-36,-37,-42,-43,-54,128,-55,-17,-31,-44,140,-40,-41,-11,-56,-12,-45,-57,]),'OBJECTID':([7,10,11,18,19,27,28,32,36,37,43,44,45,46,47,48,55,61,62,63,68,69,70,71,72,73,74,75,87,93,94,99,106,107,109,110,113,115,120,121,123,131,138,139,143,146,148,152,],[12,12,12,22,12,-9,34,22,66,34,78,34,34,34,34,78,34,34,34,-10,78,78,78,78,78,78,78,104,34,34,66,34,124,34,34,34,34,34,34,133,124,34,34,-11,34,-12,34,-24,]),'COLON':([12,22,23,31,66,124,],[17,29,30,58,95,136,]),'OPAR':([12,28,34,37,43,44,45,46,47,48,55,61,62,68,69,70,71,72,73,74,78,87,93,99,104,107,109,110,113,115,120,131,133,138,143,148,],[18,55,62,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,62,55,55,55,120,55,55,55,55,55,55,55,143,55,55,55,]),'SEMICOLON':([14,21,33,34,35,38,39,40,41,42,49,50,51,52,54,67,77,78,82,84,85,89,96,97,98,100,101,102,103,108,111,114,116,119,128,134,137,140,142,149,150,151,],[20,27,60,-51,63,-26,-27,-32,-35,-38,-47,-48,-49,-50,-53,-25,-39,-51,109,-46,-52,-16,-28,-29,-30,-33,-34,-36,-37,-42,-54,-55,-17,-31,139,-40,-41,146,-56,-45,-57,152,]),'CPAR':([18,24,25,34,38,39,40,41,42,49,50,51,52,54,56,59,62,67,77,78,84,85,86,89,90,91,92,96,97,98,100,101,102,103,108,111,114,116,119,120,130,132,134,137,142,143,147,149,150,],[23,31,-13,-51,-26,-27,-32,-35,-38,-47,-48,-49,-50,-53,-15,-14,-58,-25,-39,-51,-46,-52,111,-16,114,-59,-60,-28,-29,-30,-33,-34,-36,-37,-42,-54,-55,-17,-31,-58,-61,142,-40,-41,-56,-58,150,-45,-57,]),'ASSIGN':([21,34,118,],[28,61,131,]),'COMMA':([25,34,38,39,40,41,42,49,50,51,52,54,56,65,67,77,78,84,85,89,92,96,97,98,100,101,102,103,108,111,114,116,118,119,134,137,141,142,149,150,],[32,-51,-26,-27,-32,-35,-38,-47,-48,-49,-50,-53,-15,94,-25,-39,-51,-46,-52,-16,115,-28,-29,-30,-33,-34,-36,-37,-42,-54,-55,-17,-20,-31,-40,-41,-21,-56,-45,-57,]),'LET':([28,37,44,45,46,47,55,61,62,87,93,99,107,109,110,113,115,120,131,138,143,148,],[36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,]),'NOT':([28,37,44,45,46,47,55,61,62,70,87,93,99,107,109,110,113,115,120,131,138,143,148,],[37,37,37,37,37,37,37,37,37,99,37,37,37,37,37,37,37,37,37,37,37,37,37,]),'TILDE':([28,37,43,44,45,46,47,48,55,61,62,68,69,70,71,72,73,74,87,93,99,107,109,110,113,115,120,131,138,143,148,],[43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,]),'CASE':([28,37,43,44,45,46,47,48,55,61,62,68,69,70,71,72,73,74,87,93,99,107,109,110,113,115,120,131,138,143,148,],[44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,]),'WHILE':([28,37,43,44,45,46,47,48,55,61,62,68,69,70,71,72,73,74,87,93,99,107,109,110,113,115,120,131,138,143,148,],[45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,]),'IF':([28,37,43,44,45,46,47,48,55,61,62,68,69,70,71,72,73,74,87,93,99,107,109,110,113,115,120,131,138,143,148,],[47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,]),'ISVOID':([28,37,43,44,45,46,47,48,55,61,62,68,69,70,71,72,73,74,87,93,99,107,109,110,113,115,120,131,138,143,148,],[48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,]),'INT_CONST':([28,37,43,44,45,46,47,48,55,61,62,68,69,70,71,72,73,74,87,93,99,107,109,110,113,115,120,131,138,143,148,],[49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,]),'STRING_CONST':([28,37,43,44,45,46,47,48,55,61,62,68,69,70,71,72,73,74,87,93,99,107,109,110,113,115,120,131,138,143,148,],[50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,]),'TRUE':([28,37,43,44,45,46,47,48,55,61,62,68,69,70,71,72,73,74,87,93,99,107,109,110,113,115,120,131,138,143,148,],[51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,]),'FALSE':([28,37,43,44,45,46,47,48,55,61,62,68,69,70,71,72,73,74,87,93,99,107,109,110,113,115,120,131,138,143,148,],[52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,]),'NEW':([28,37,43,44,45,46,47,48,55,61,62,68,69,70,71,72,73,74,87,93,99,107,109,110,113,115,120,131,138,143,148,],[53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,]),'DOT':([34,42,49,50,51,52,54,78,85,105,111,114,142,150,],[-51,75,-47,-48,-49,-50,-53,-51,-52,121,-54,-55,-56,-57,]),'AT':([34,42,49,50,51,52,54,78,85,111,114,142,150,],[-51,76,-47,-48,-49,-50,-53,-51,-52,-54,-55,-56,-57,]),'STAR':([34,40,41,42,49,50,51,52,54,77,78,84,85,100,101,102,103,108,111,114,134,137,142,149,150,],[-51,73,-35,-38,-47,-48,-49,-50,-53,-39,-51,-46,-52,73,73,-36,-37,-42,-54,-55,-40,-41,-56,-45,-57,]),'DIV':([34,40,41,42,49,50,51,52,54,77,78,84,85,100,101,102,103,108,111,114,134,137,142,149,150,],[-51,74,-35,-38,-47,-48,-49,-50,-53,-39,-51,-46,-52,74,74,-36,-37,-42,-54,-55,-40,-41,-56,-45,-57,]),'LOWER':([34,39,40,41,42,49,50,51,52,54,77,78,84,85,100,101,102,103,108,111,114,134,137,142,149,150,],[-51,68,-32,-35,-38,-47,-48,-49,-50,-53,-39,-51,-46,-52,-33,-34,-36,-37,-42,-54,-55,-40,-41,-56,-45,-57,]),'LEQ':([34,39,40,41,42,49,50,51,52,54,77,78,84,85,100,101,102,103,108,111,114,134,137,142,149,150,],[-51,69,-32,-35,-38,-47,-48,-49,-50,-53,-39,-51,-46,-52,-33,-34,-36,-37,-42,-54,-55,-40,-41,-56,-45,-57,]),'EQUAL':([34,39,40,41,42,49,50,51,52,54,77,78,84,85,100,101,102,103,108,111,114,134,137,142,149,150,],[-51,70,-32,-35,-38,-47,-48,-49,-50,-53,-39,-51,-46,-52,-33,-34,-36,-37,-42,-54,-55,-40,-41,-56,-45,-57,]),'PLUS':([34,39,40,41,42,49,50,51,52,54,77,78,84,85,96,97,98,100,101,102,103,108,111,114,134,137,142,149,150,],[-51,71,-32,-35,-38,-47,-48,-49,-50,-53,-39,-51,-46,-52,71,71,71,-33,-34,-36,-37,-42,-54,-55,-40,-41,-56,-45,-57,]),'MINUS':([34,39,40,41,42,49,50,51,52,54,77,78,84,85,96,97,98,100,101,102,103,108,111,114,134,137,142,149,150,],[-51,72,-32,-35,-38,-47,-48,-49,-50,-53,-39,-51,-46,-52,72,72,72,-33,-34,-36,-37,-42,-54,-55,-40,-41,-56,-45,-57,]),'OF':([34,38,39,40,41,42,49,50,51,52,54,67,77,78,79,84,85,89,96,97,98,100,101,102,103,108,111,114,116,119,134,137,142,149,150,],[-51,-26,-27,-32,-35,-38,-47,-48,-49,-50,-53,-25,-39,-51,106,-46,-52,-16,-28,-29,-30,-33,-34,-36,-37,-42,-54,-55,-17,-31,-40,-41,-56,-45,-57,]),'LOOP':([34,38,39,40,41,42,49,50,51,52,54,67,77,78,80,84,85,89,96,97,98,100,101,102,103,108,111,114,116,119,134,137,142,149,150,],[-51,-26,-27,-32,-35,-38,-47,-48,-49,-50,-53,-25,-39,-51,107,-46,-52,-16,-28,-29,-30,-33,-34,-36,-37,-42,-54,-55,-17,-31,-40,-41,-56,-45,-57,]),'THEN':([34,38,39,40,41,42,49,50,51,52,54,67,77,78,83,84,85,89,96,97,98,100,101,102,103,108,111,114,116,119,134,137,142,149,150,],[-51,-26,-27,-32,-35,-38,-47,-48,-49,-50,-53,-25,-39,-51,110,-46,-52,-16,-28,-29,-30,-33,-34,-36,-37,-42,-54,-55,-17,-31,-40,-41,-56,-45,-57,]),'POOL':([34,38,39,40,41,42,49,50,51,52,54,67,77,78,84,85,89,96,97,98,100,101,102,103,108,111,114,116,119,125,134,137,142,149,150,],[-51,-26,-27,-32,-35,-38,-47,-48,-49,-50,-53,-25,-39,-51,-46,-52,-16,-28,-29,-30,-33,-34,-36,-37,-42,-54,-55,-17,-31,137,-40,-41,-56,-45,-57,]),'ELSE':([34,38,39,40,41,42,49,50,51,52,54,67,77,78,84,85,89,96,97,98,100,101,102,103,108,111,114,116,119,127,134,137,142,149,150,],[-51,-26,-27,-32,-35,-38,-47,-48,-49,-50,-53,-25,-39,-51,-46,-52,-16,-28,-29,-30,-33,-34,-36,-37,-42,-54,-55,-17,-31,138,-40,-41,-56,-45,-57,]),'IN':([34,38,39,40,41,42,49,50,51,52,54,64,65,67,77,78,84,85,89,96,97,98,100,101,102,103,108,111,114,116,117,118,119,134,137,141,142,149,150,],[-51,-26,-27,-32,-35,-38,-47,-48,-49,-50,-53,93,-18,-25,-39,-51,-46,-52,-16,-28,-29,-30,-33,-34,-36,-37,-42,-54,-55,-17,-19,-20,-31,-40,-41,-21,-56,-45,-57,]),'FI':([34,38,39,40,41,42,49,50,51,52,54,67,77,78,84,85,89,96,97,98,100,101,102,103,108,111,114,116,119,134,137,142,145,149,150,],[-51,-26,-27,-32,-35,-38,-47,-48,-49,-50,-53,-25,-39,-51,-46,-52,-16,-28,-29,-30,-33,-34,-36,-37,-42,-54,-55,-17,-31,-40,-41,-56,149,-45,-57,]),'ESAC':([122,123,135,152,],[134,-22,-23,-24,]),'CASSIGN':([144,],[148,]),} @@ -27,65 +27,65 @@ del _lr_goto_items _lr_productions = [ ("S' -> program","S'",1,None,None,None), - ('program -> class_list','program',1,'p_program','parser.py',28), - ('class_list -> def_class','class_list',1,'p_class_list_single','parser.py',33), - ('class_list -> def_class class_list','class_list',2,'p_class_list_multi','parser.py',38), - ('def_class -> CLASS TYPEID OCUR feature_list CCUR SEMICOLON','def_class',6,'p_def_class','parser.py',43), - ('def_class -> CLASS TYPEID INHERITS TYPEID OCUR feature_list CCUR SEMICOLON','def_class',8,'p_def_class_parent','parser.py',48), - ('feature_list -> ','feature_list',0,'p_feature_list_empty','parser.py',53), - ('feature_list -> def_attr feature_list','feature_list',2,'p_feature_list_attr','parser.py',59), - ('feature_list -> def_func feature_list','feature_list',2,'p_feature_list_fun','parser.py',64), - ('def_attr -> OBJECTID COLON TYPEID SEMICOLON','def_attr',4,'p_attr','parser.py',69), - ('def_attr -> OBJECTID COLON TYPEID ASSIGN exp SEMICOLON','def_attr',6,'p_attr_exp','parser.py',74), - ('def_func -> OBJECTID OPAR CPAR COLON TYPEID OCUR exp CCUR SEMICOLON','def_func',9,'p_func','parser.py',79), - ('def_func -> OBJECTID OPAR param_list CPAR COLON TYPEID OCUR exp CCUR SEMICOLON','def_func',10,'p_func_param','parser.py',84), - ('param_list -> param','param_list',1,'p_param_list_single','parser.py',89), - ('param_list -> param COMMA param_list','param_list',3,'p_param_list_multi','parser.py',94), - ('param -> OBJECTID COLON TYPEID','param',3,'p_param','parser.py',99), - ('exp -> OBJECTID ASSIGN exp','exp',3,'p_exp_assign','parser.py',104), - ('exp -> LET ident_list IN exp','exp',4,'p_exp_let','parser.py',114), - ('ident_list -> iden','ident_list',1,'p_ident_list_single','parser.py',120), - ('ident_list -> iden COMMA ident_list','ident_list',3,'p_ident_list_multi','parser.py',125), - ('iden -> OBJECTID COLON TYPEID','iden',3,'p_iden','parser.py',130), - ('iden -> OBJECTID COLON TYPEID ASSIGN exp','iden',5,'p_iden_init','parser.py',135), - ('case_list -> branch','case_list',1,'p_case_list_single','parser.py',142), - ('case_list -> branch case_list','case_list',2,'p_case_list_multi','parser.py',147), - ('branch -> OBJECTID COLON TYPEID CASSIGN exp SEMICOLON','branch',6,'p_branch','parser.py',152), - ('exp -> NOT exp','exp',2,'p_exp_not','parser.py',157), - ('exp -> comp','exp',1,'p_exp_comp','parser.py',163), - ('comp -> arith','comp',1,'p_comp_arith','parser.py',169), - ('comp -> arith LOWER arith','comp',3,'p_comp_lower','parser.py',174), - ('comp -> arith LEQ arith','comp',3,'p_comp_leq','parser.py',179), - ('comp -> arith EQUAL arith','comp',3,'p_comp_equal','parser.py',184), - ('comp -> arith EQUAL NOT exp','comp',4,'p_comp_equal_not','parser.py',189), - ('arith -> term','arith',1,'p_arith_term','parser.py',194), - ('arith -> arith PLUS term','arith',3,'p_arith_plus','parser.py',202), - ('arith -> arith MINUS term','arith',3,'p_arith_minus','parser.py',207), - ('term -> factor','term',1,'p_term_fac','parser.py',212), - ('term -> term STAR factor','term',3,'p_term_star','parser.py',217), - ('term -> term DIV factor','term',3,'p_term_div','parser.py',222), - ('factor -> atom','factor',1,'p_factor_atom','parser.py',227), - ('factor -> TILDE factor','factor',2,'p_factor_neg','parser.py',232), - ('factor -> CASE exp OF case_list ESAC','factor',5,'p_factor_case','parser.py',237), - ('factor -> WHILE exp LOOP exp POOL','factor',5,'p_factor_while','parser.py',242), - ('factor -> OCUR exp_list CCUR','factor',3,'p_factor_block','parser.py',247), - ('exp_list -> exp SEMICOLON','exp_list',2,'p_exp_list_single','parser.py',252), - ('exp_list -> exp SEMICOLON exp_list','exp_list',3,'p_exp_list_multi','parser.py',257), - ('factor -> IF exp THEN exp ELSE exp FI','factor',7,'p_factor_cond','parser.py',264), - ('factor -> ISVOID factor','factor',2,'p_factor_void','parser.py',269), - ('atom -> INT_CONST','atom',1,'p_atom_num','parser.py',275), - ('atom -> STRING_CONST','atom',1,'p_atom_string','parser.py',280), - ('atom -> TRUE','atom',1,'p_atom_bool','parser.py',285), - ('atom -> FALSE','atom',1,'p_atom_bool','parser.py',286), - ('atom -> OBJECTID','atom',1,'p_atom_var','parser.py',292), - ('atom -> NEW TYPEID','atom',2,'p_atom_new','parser.py',297), - ('atom -> func_call','atom',1,'p_atom_func_call','parser.py',302), - ('atom -> OPAR exp CPAR','atom',3,'p_atom_exp','parser.py',307), - ('func_call -> OBJECTID OPAR arg_list CPAR','func_call',4,'p_func_call_self','parser.py',312), - ('func_call -> atom DOT OBJECTID OPAR arg_list CPAR','func_call',6,'p_func_call','parser.py',317), - ('func_call -> atom AT TYPEID DOT OBJECTID OPAR arg_list CPAR','func_call',8,'p_func_call_at','parser.py',322), - ('arg_list -> ','arg_list',0,'p_arg_list_empty','parser.py',327), - ('arg_list -> arg_list_not_empty','arg_list',1,'p_arg_list_not_empty','parser.py',333), - ('arg_list_not_empty -> exp','arg_list_not_empty',1,'p_arg_list_not_empty_single','parser.py',338), - ('arg_list_not_empty -> exp COMMA arg_list_not_empty','arg_list_not_empty',3,'p_arg_list_not_empty_multi','parser.py',343), + ('program -> class_list','program',1,'p_program','parser.py',25), + ('class_list -> def_class','class_list',1,'p_class_list_single','parser.py',30), + ('class_list -> def_class class_list','class_list',2,'p_class_list_multi','parser.py',35), + ('def_class -> CLASS TYPEID OCUR feature_list CCUR SEMICOLON','def_class',6,'p_def_class','parser.py',40), + ('def_class -> CLASS TYPEID INHERITS TYPEID OCUR feature_list CCUR SEMICOLON','def_class',8,'p_def_class_parent','parser.py',45), + ('feature_list -> ','feature_list',0,'p_feature_list_empty','parser.py',50), + ('feature_list -> def_attr feature_list','feature_list',2,'p_feature_list_attr','parser.py',56), + ('feature_list -> def_func feature_list','feature_list',2,'p_feature_list_fun','parser.py',61), + ('def_attr -> OBJECTID COLON TYPEID SEMICOLON','def_attr',4,'p_attr','parser.py',66), + ('def_attr -> OBJECTID COLON TYPEID ASSIGN exp SEMICOLON','def_attr',6,'p_attr_exp','parser.py',71), + ('def_func -> OBJECTID OPAR CPAR COLON TYPEID OCUR exp CCUR SEMICOLON','def_func',9,'p_func','parser.py',76), + ('def_func -> OBJECTID OPAR param_list CPAR COLON TYPEID OCUR exp CCUR SEMICOLON','def_func',10,'p_func_param','parser.py',81), + ('param_list -> param','param_list',1,'p_param_list_single','parser.py',86), + ('param_list -> param COMMA param_list','param_list',3,'p_param_list_multi','parser.py',91), + ('param -> OBJECTID COLON TYPEID','param',3,'p_param','parser.py',96), + ('exp -> OBJECTID ASSIGN exp','exp',3,'p_exp_assign','parser.py',101), + ('exp -> LET ident_list IN exp','exp',4,'p_exp_let','parser.py',106), + ('ident_list -> iden','ident_list',1,'p_ident_list_single','parser.py',111), + ('ident_list -> iden COMMA ident_list','ident_list',3,'p_ident_list_multi','parser.py',116), + ('iden -> OBJECTID COLON TYPEID','iden',3,'p_iden','parser.py',121), + ('iden -> OBJECTID COLON TYPEID ASSIGN exp','iden',5,'p_iden_init','parser.py',126), + ('case_list -> branch','case_list',1,'p_case_list_single','parser.py',131), + ('case_list -> branch case_list','case_list',2,'p_case_list_multi','parser.py',136), + ('branch -> OBJECTID COLON TYPEID CASSIGN exp SEMICOLON','branch',6,'p_branch','parser.py',141), + ('exp -> NOT exp','exp',2,'p_exp_not','parser.py',146), + ('exp -> comp','exp',1,'p_exp_comp','parser.py',151), + ('comp -> arith','comp',1,'p_comp_arith','parser.py',156), + ('comp -> arith LOWER arith','comp',3,'p_comp_lower','parser.py',161), + ('comp -> arith LEQ arith','comp',3,'p_comp_leq','parser.py',166), + ('comp -> arith EQUAL arith','comp',3,'p_comp_equal','parser.py',171), + ('comp -> arith EQUAL NOT exp','comp',4,'p_comp_equal_not','parser.py',177), + ('arith -> term','arith',1,'p_arith_term','parser.py',182), + ('arith -> arith PLUS term','arith',3,'p_arith_plus','parser.py',187), + ('arith -> arith MINUS term','arith',3,'p_arith_minus','parser.py',192), + ('term -> factor','term',1,'p_term_fac','parser.py',197), + ('term -> term STAR factor','term',3,'p_term_star','parser.py',202), + ('term -> term DIV factor','term',3,'p_term_div','parser.py',207), + ('factor -> atom','factor',1,'p_factor_atom','parser.py',212), + ('factor -> TILDE factor','factor',2,'p_factor_neg','parser.py',217), + ('factor -> CASE exp OF case_list ESAC','factor',5,'p_factor_case','parser.py',222), + ('factor -> WHILE exp LOOP exp POOL','factor',5,'p_factor_while','parser.py',227), + ('factor -> OCUR exp_list CCUR','factor',3,'p_factor_block','parser.py',232), + ('exp_list -> exp SEMICOLON','exp_list',2,'p_exp_list_single','parser.py',237), + ('exp_list -> exp SEMICOLON exp_list','exp_list',3,'p_exp_list_multi','parser.py',242), + ('factor -> IF exp THEN exp ELSE exp FI','factor',7,'p_factor_cond','parser.py',247), + ('factor -> ISVOID factor','factor',2,'p_factor_void','parser.py',252), + ('atom -> INT_CONST','atom',1,'p_atom_num','parser.py',257), + ('atom -> STRING_CONST','atom',1,'p_atom_string','parser.py',262), + ('atom -> TRUE','atom',1,'p_atom_true','parser.py',267), + ('atom -> FALSE','atom',1,'p_atom_false','parser.py',272), + ('atom -> OBJECTID','atom',1,'p_atom_var','parser.py',277), + ('atom -> NEW TYPEID','atom',2,'p_atom_new','parser.py',282), + ('atom -> func_call','atom',1,'p_atom_func_call','parser.py',287), + ('atom -> OPAR exp CPAR','atom',3,'p_atom_exp','parser.py',292), + ('func_call -> OBJECTID OPAR arg_list CPAR','func_call',4,'p_func_call_self','parser.py',297), + ('func_call -> atom DOT OBJECTID OPAR arg_list CPAR','func_call',6,'p_func_call','parser.py',302), + ('func_call -> atom AT TYPEID DOT OBJECTID OPAR arg_list CPAR','func_call',8,'p_func_call_at','parser.py',307), + ('arg_list -> ','arg_list',0,'p_arg_list_empty','parser.py',312), + ('arg_list -> arg_list_not_empty','arg_list',1,'p_arg_list_not_empty','parser.py',318), + ('arg_list_not_empty -> exp','arg_list_not_empty',1,'p_arg_list_not_empty_single','parser.py',323), + ('arg_list_not_empty -> exp COMMA arg_list_not_empty','arg_list_not_empty',3,'p_arg_list_not_empty_multi','parser.py',328), ] diff --git a/src/test.txt b/src/test.txt new file mode 100644 index 000000000..26c184426 --- /dev/null +++ b/src/test.txt @@ -0,0 +1,9 @@ +class Point { +x : AUTO_TYPE; +y : AUTO_TYPE; +init(n : Int, m : Int) : SELF_TYPE { +{ +x <- n; +y <- m; +}}; +}; diff --git a/src/tours/TypeBuilder.py b/src/tours/TypeBuilder.py new file mode 100644 index 000000000..b0d7914c3 --- /dev/null +++ b/src/tours/TypeBuilder.py @@ -0,0 +1,106 @@ +from parsing.ast import * +from cmp.semantic import SemanticError +from cmp.semantic import ErrorType, StringType, IntType, AutoType, BoolType, ObjectType, IOType, SelfType +import cmp.visitor as visitor + +class TypeBuilder: + def __init__(self, context, errors=[]): + self.context = context + self.errors = errors + self.current_type = None + + @visitor.on('node') + def visit(self, node): + pass + + @visitor.when(ProgramNode) + def visit(self, node): + for dec in node.declarations: + self.visit(dec) + + # Check that class Main contains method main + try: + main_type = self.context.get_type('Main') + try: + main_type.get_method('main') + except SemanticError: + self.errors.append("Method 'main' must be defined in 'Main' class.") + except SemanticError: + pass + + @visitor.when(ClassDeclarationNode) + def visit(self, node): + self.current_type = self.context.get_type(node.id) + + # Set class parent, if it does not exist then the class inherits from Object + parent = self.context.get_type('Object') + if node.parent is not None: + try: + parent = self.context.get_type(node.parent) + if parent == BoolType() or parent == IntType() or parent == StringType() or parent == SelfType() or parent == AutoType(): + self.errors.append(f"Class '{parent.name}' is not heritable.") + parent = ErrorType() + else: + try: + main_type = self.context.get_type('Main') + if parent == main_type: + self.errors.append(f"Class 'Main' is not heritable.") + parent = ErrorType() + except SemanticError: + pass + except SemanticError as error: + self.errors.append(error.text) + parent = ErrorType() + + if parent.conforms_to(self.current_type): + self.errors.append(f"The graph defined by parent-child relation on classes may not contain cycles.") + parent = ErrorType() + + self.current_type.set_parent(parent) + + for feature in node.features: + self.visit(feature) + + @visitor.when(AttrDeclarationNode) + def visit(self, node): + try: + att_type = self.context.get_type(node.type) + except SemanticError as error: + self.errors.append(error.text) + att_type = ErrorType() + + try: + self.current_type.define_attribute(node.id, att_type) + except SemanticError as error: + self.errors.append(error.text) + + @visitor.when(FuncDeclarationNode) + def visit(self, node): + try: + return_type = self.context.get_type(node.type) + except SemanticError as error: + self.errors.append(error.text) + return_type = ErrorType() + + params = [] + types = [] + for var in node.params: + try: + param_type = self.context.get_type(var.type) + if param_type == SelfType(): + self.errors.append(f"The type of the parameter '{var.id}' can not be SELF_TYPE in method '{node.id}' in class '{self.current_type.name}'.") + param_type = ErrorType() + except SemanticError as error: + self.errors.append(error.text) + param_type = ErrorType() + + if var.id in params: + self.errors.append(f"The identifier '{var.id}' is already used in the param list of method '{node.id}' in class '{self.current_type.name}'.") + + params.append(var.id) + types.append(param_type) + + try: + self.current_type.define_method(node.id, params, types, return_type) + except SemanticError as error: + self.errors.append(error.text) \ No newline at end of file diff --git a/src/tours/TypeChecker.py b/src/tours/TypeChecker.py new file mode 100644 index 000000000..c4bc9f823 --- /dev/null +++ b/src/tours/TypeChecker.py @@ -0,0 +1,439 @@ +from parsing.ast import * +from .utils import find_parent_type, InferType +from cmp.semantic import Scope, SemanticError +from cmp.semantic import Type, ObjectType, IntType, StringType, BoolType, AutoType, ErrorType, SelfType, IOType +import cmp.visitor as visitor + +SELF_IS_READONLY = "Variable 'self' is read-only." +LOCAL_ALREADY_DEFINED = "Variable '%s' is already defined in method '%s'." +INCOMPATIBLE_TYPES = "Can not convert '%s' into '%s'." +VARIABLE_NOT_DEFINED = "Variable '%s' is not defined in '%s'." +INVALID_OPERATION = "Operation '%s' is not defined between '%s' and '%s'." +OPERATION_NOT_DEFINED = "Operation '%s' is not defined for type '%s'." +PREDICATE_OPERATIONS = "Predicate of the '%s' operation must be bool in method '%s'." +TYPE_VOID = "The expression can not be void." +ATTRIBUTE_NOT_INFERED = "Can not infered attribute '%s' in class '%s'." +RETURN_TYPE_METHOD = "Can not infered the return type of the method '%s' in class '%s'." +VAR_TYPE_NOT_INFERED = "Can not infered the type of the '%s' '%s' in method '%s' in class '%s'." + +class TypeChecker: + def __init__(self, context, errors=[]): + self.context = context + self.errors = errors + self.current_type = None + self.current_method = None + + @visitor.on('node') + def visit(self, node, scope): + pass + + @visitor.when(ProgramNode) + def visit(self, node, scope=None): + scope = Scope() + for dec in node.declarations: + self.visit(dec, scope.create_child(dec.id)) + return scope + + @visitor.when(ClassDeclarationNode) + def visit(self, node, scope): + self.current_type = self.context.get_type(node.id) + scope.define_variable('self', self.current_type) + + for feature in node.features: + # If two attributes with the same name are defined, the second one is not added to the attribute + # list, so I will only visit its expression. + if isinstance(feature, AttrDeclarationNode): + if self.current_type.get_attribute(feature.id).type.name == feature.type: + self.visit(feature, scope) + elif feature.expr is not None: + self.visit(feature.expr, scope) + else: + self.visit(feature, scope) + + @visitor.when(AttrDeclarationNode) + def visit(self, node, scope): + # Ask if the attribute is defined in the parent, if true an error is added + parent = self.current_type.parent + if parent is not None: + try: + parent.get_attribute(node.id) + self.errors.append(f'Attribute "{node.id}" is already defined in {parent.name}.') + except SemanticError: + pass + + node_type = self.current_type.get_attribute(node.id).type + if node_type == SelfType(): + node_type = self.current_type + + if node.expr is not None: + self.visit(node.expr, scope) + expr_type = node.expr.computed_type + if expr_type == SelfType(): + expr_type = self.current_type + + if node_type != AutoType() and expr_type != AutoType() and not expr_type.conforms_to(node_type): + self.errors.append(INCOMPATIBLE_TYPES.replace('%s', expr_type.name, 1).replace('%s', node_type.name, 1)) + elif node_type == AutoType() and expr_type != AutoType(): + InferType(self.current_type, node_type, expr_type) + elif node_type != AutoType() and expr_type == AutoType(): + InferType(self.current_type, expr_type, node_type) + + @visitor.when(FuncDeclarationNode) + def visit(self, node, scope): + self.current_method = self.current_type.get_method(node.id) + child = scope.create_child(scope.class_name, self.current_method.name) + + # Ask if the method is defined with a diffrent signature in the parent, if true an error is added + parent = self.current_type.parent + if parent is not None: + try: + method = parent.get_method(node.id) + if method != self.current_method: + self.errors.append(f"Method '{self.current_method.name}' already defined in '{parent.name}' with a different signature.") + except SemanticError: + pass + + for name, typex in zip(self.current_method.param_names, self.current_method.param_types): + child.define_variable(name, typex) + + self.visit(node.expr, child) + + return_type_exp = node.expr.computed_type if node.expr.computed_type != SelfType() else self.current_type + return_type_met = self.current_method.return_type if self.current_method.return_type != SelfType() else self.current_type + + if return_type_met != AutoType() and return_type_exp != AutoType(): + if not return_type_exp.conforms_to(return_type_met): + self.errors.append(INCOMPATIBLE_TYPES.replace('%s',return_type_exp.name , 1).replace('%s',return_type_met.name , 1)) + elif return_type_met == AutoType() and return_type_exp != AutoType(): + InferType(self.current_type, return_type_met, return_type_exp) + elif return_type_met != AutoType() and return_type_exp == AutoType(): + InferType(self.current_type, return_type_exp, return_type_met) + + @visitor.when(BlockNode) + def visit(self, node, scope): + for expr in node.expr_lis: + self.visit(expr, scope) + node.computed_type = node.expr_lis[-1].computed_type + + @visitor.when(DispatchNode) + def visit(self, node, scope): + typee = None + if node.expr is not None: + self.visit(node.expr, scope) + obj_type = node.expr.computed_type if node.expr.computed_type != SelfType() else self.current_type + + if node.type is not None: + try: + typex = self.context.get_type(node.type) + if not obj_type.conforms_to(typex): + self.errors.append(INCOMPATIBLE_TYPES.replace('%s', node.obj.name, 1).replace('%s', typex.name, 1)) + typex = ErrorType() + obj_type = typex + except SemanticError as error: + self.errors.append(error.text) + obj_type = ErrorType() + else: + obj_type = scope.find_variable('self').type + + try: + method = obj_type.get_method(node.id) + if (node.arg is None and method.arg is None) or (len(node.arg) == len(method.param_types)): + if node.arg is not None: + for arg, param_type in zip(node.arg, method.param_types): + self.visit(arg, scope) + arg_type = arg.computed_type if arg.computed_type != SelfType() else self.current_type + + if param_type != AutoType() and arg_type != AutoType() and not arg_type.conforms_to(param_type): + self.errors.append(INCOMPATIBLE_TYPES.replace('%s', arg_type.name, 1).replace('%s', param_type.name, 1)) + typee = ErrorType() + elif param_type == AutoType() and arg_type != AutoType(): + InferType(self.current_type, param_type, arg_type) + + elif param_type != AutoType() and arg_type == AutoType(): + InferType(self.current_type, arg_type, param_type) + else: + self.errors.append(f"Method '{method.name}' only accepts '{len(method.param_types)}' arguments.") + + if typee is None: + ret_type = method.return_type if method.return_type != SelfType() else obj_type + else: + ret_type = typee + + except SemanticError as error: + self.errors.append(error.text) + ret_type = ErrorType() + + node.computed_type = ret_type + + @visitor.when(ConditionalNode) + def visit(self, node, scope): + self.visit(node.predicate, scope) + predicate_type = node.predicate.computed_type + + self.visit(node.then, scope) + self.visit(node.elsex, scope) + + if predicate_type != AutoType() and predicate_type.conforms_to(BoolType()): + node.computed_type = find_parent_type(self.current_type, node.then.computed_type, node.elsex.computed_type) + elif predicate_type != AutoType(): + self.errors.append(PREDICATE_OPERATIONS.replace('%s', "Conditional", 1).replace('%s', self.current_method.name, 1)) + node.computed_type = ErrorType() + else: + InferType(self.current_type, predicate_type, BoolType()) + + @visitor.when(LetNode) + def visit(self, node, scope): + child = scope.create_child(scope.class_name, scope.method_name) + for item in node.variables: + self.visit(item, child) + + self.visit(node.expr, child) + node.computed_type = node.expr.computed_type + + @visitor.when(VarDeclarationNode) + def visit(self, node, scope): + if node.id == 'self': + self.errors.append(SELF_IS_READONLY) + + try: + var_type = self.context.get_type(node.type) + except SemanticError as error: + self.errors.append(str(error)) + var_type = ErrorType() + + if node.expr is not None: + self.visit(node.expr, scope) + expresion_type = node.expr.computed_type if node.expr.computed_type != SelfType() else self.current_type + + if expresion_type != AutoType() and var_type != AutoType() and not expresion_type.conforms_to(var_type): + self.errors.append(INCOMPATIBLE_TYPES.replace('%s', expresion_type.name, 1).replace('%s', var_type.name, 1)) + elif var_type == AutoType() and expresion_type != AutoType(): + InferType(self.current_type, var_type, expresion_type) + elif var_type != AutoType() and expresion_type == AutoType(): + InferType(self.current_type, expresion_type, var_type) + + if scope.is_local(node.id): + scope.remove_variable(node.id) + else: + scope.define_variable(node.id, var_type) + + node.computed_type = var_type + + @visitor.when(LoopNode) + def visit(self, node, scope): + self.visit(node.predicate, scope) + predicate_type = node.predicate.computed_type + self.visit(node.body, scope) + + if predicate_type != AutoType() and predicate_type.conforms_to(BoolType()): + node.computed_type = ObjectType() + elif predicate_type != AutoType(): + self.errors.append(PREDICATE_OPERATIONS.replace('%s',"Loop", 1).replace('%s', self.current_method, 1)) + node.computed_type = ErrorType() + else: + InferType(self.current_type, predicate_type, BoolType()) + node.computed_type = ObjectType() + + @visitor.when(CaseNode) + def visit(self, node, scope): + self.visit(node.expr, scope) + types = [] + + for attr in node.cases: + self.visit(attr, scope) + types.append(attr.computed_type) + + typex = types[0] + for i in range(1,len(types)): + typex = find_parent_type(self.current_type, typex, types[i]) + node.computed_type = typex + + @visitor.when(CaseAttrNode) + def visit(self, node, scope): + try: + typex = self.context.get_type(node.type) + if typex == AutoType(): + self.errors.append("The type of a case attribute can not be AUTO_TYPE.") + typex = ErrorType() + except SemanticError as error: + self.errors.append(error.text) + typex = ErrorType() + + child_scope = scope.create_child(scope.class_name, scope.method_name) + child_scope.define_variable(node.id, typex) + self.visit(node.expr, child_scope) + + node.computed_type = node.expr.computed_type + + @visitor.when(AssignNode) + def visit(self, node, scope): + self.visit(node.id, scope) + var_type = node.id.computed_type + + self.visit(node.expr, scope) + expresion_type = node.expr.computed_type if node.expr.computed_type != SelfType() else self.current_type + + node.computed_type = expresion_type + + if node.id == 'self': + self.errors.append(SELF_IS_READONLY) + node.computed_type = ErrorType() + elif var_type != AutoType() and expresion_type != AutoType() and not expresion_type.conforms_to(var_type): + self.errors.append(INCOMPATIBLE_TYPES.replace('%s', expresion_type.name, 1).replace('%s', var_type.name, 1)) + node.computed_type = ErrorType() + elif var_type == AutoType() and expresion_type != AutoType(): + InferType(self.current_type, var_type, expresion_type) + elif var_type != AutoType() and expresion_type == AutoType(): + InferType(self.current_type, expresion_type, var_type) + + @visitor.when(BinaryNode) + def visit(self, node, scope): + self.visit(node.left,scope) + left_type = node.left.computed_type + self.visit(node.right,scope) + right_type = node.right.computed_type + + if isinstance(node, PlusNode): + operation = "plus" + elif isinstance(node, MinusNode): + operation= "minus" + elif isinstance(node, DivNode): + operation = "division" + elif isinstance(node, StarNode): + operation = "multiplication" + elif isinstance(node, ElessNode): + operation = "less or equals" + elif isinstance(node, LessNode): + operation = "less" + + if left_type != AutoType() and right_type != AutoType(): + if not isinstance(node, EqualsNode): + if left_type == IntType() and right_type == IntType(): + if isinstance(node, ElessNode) or isinstance(node, LessNode): + node.computed_type = BoolType() + else: + node.computed_type = IntType() + else: + if(left_type == right_type): + self.errors.append(OPERATION_NOT_DEFINED.replace('%s', operation, 1).replace('%s', left_type.name, 1)) + else: + self.errors.append(INVALID_OPERATION.replace('%s', operation, 1).replace('%s', left_type.name, 1).replace('%s', right_type.name, 1)) + node.computed_type = ErrorType() + else: + if left_type == right_type: + if left_type == StringType() or left_type == IntType() or left_type == BoolType(): + node.computed_type = BoolType() + else: + self.errors.append(OPERATION_NOT_DEFINED.replace('%s', "equals", 1).replace('%s', left_type.name, 1)) + node.computed_type = ErrorType() + else: + self.errors.append(INVALID_OPERATION.replace('%s', 'equals', 1).replace('%s', left_type.name, 1).replace('%s', right_type.name, 1)) + node.computed_type = ErrorType() + + else: + if left_type == AutoType() and right_type == AutoType(): + if isinstance(node, ElessNode) or isinstance(node, LessNode) or isinstance(node, EqualsNode): + node.computed_type = BoolType() + else: + node.computed_type = IntType() + + if not isinstance(node, EqualsNode): + InferType(self.current_type, left_type, IntType()) + InferType(self.current_type, right_type, IntType()) + + else: + if left_type == AutoType(): + auto_node = node.left + auto_var = left_type + not_auto_var = right_type + else: + auto_node = node.right + auto_var = right_type + not_auto_var = left_type + + if not isinstance(node, EqualsNode): + if not_auto_var == IntType(): + if isinstance(node, ElessNode) or isinstance(node, LessNode): + node.computed_type = BoolType() + else: + node.computed_type = IntType() + else: + self.errors.append(OPERATION_NOT_DEFINED.replace('%s', operation, 1).replace('%s', not_auto_var.name, 1)) + node.computed_type = ErrorType() + InferType(self.current_type, auto_var, IntType()) + else: + if not_auto_var == StringType() or not_auto_var == IntType() or not_auto_var == BoolType(): + node.computed_type = BoolType() + InferType(self.current_type, auto_var, not_auto_var) + else: + self.errors.append(OPERATION_NOT_DEFINED.replace('%s', "equals", 1).replace('%s', not_auto_var.name, 1)) + node.computed_type = ErrorType() + + @visitor.when(PrimeNode) + def visit(self, node, scope): + self.visit(node.expr, scope) + type_expr = node.expr.computed_type + + if type_expr == IntType() or type_expr == AutoType(): + node.computed_type = IntType() + if type_expr == AutoType(): + InferType(self.current_type, type_expr, IntType()) + else: + self.errors.append(OPERATION_NOT_DEFINED.replace('%s', "Prime", 1).replace('%s', type_expr, 1)) + node.computed_type = ErrorType() + + @visitor.when(NotNode) + def visit(self, node, scope): + self.visit(node.expr, scope) + type_expr = node.expr.computed_type + + if type_expr == BoolType() or type_expr == AutoType(): + node.computed_type = BoolType() + if type_expr == AutoType(): + InferType(self.current_type, type_expr, BoolType()) + else: + self.errors.append(OPERATION_NOT_DEFINED.replace('%s', "Not", 1).replace('%s', type_expr.name, 1)) + node.computed_type = ErrorType() + + @visitor.when(StringNode) + def visit(self, node, scope): + node.computed_type = StringType() + + @visitor.when(IsVoidNode) + def visit(self, node, scope): + self.visit(node.expr, scope) + node.computed_type = BoolType() + + @visitor.when(ConstantNumNode) + def visit(self, node, scope): + node.computed_type = IntType() + + @visitor.when(VariableNode) + def visit(self, node, scope): + if scope.is_defined(node.lex, self.current_type): + var_type = scope.find_variable_or_attribute(node.lex, self.current_type).type + else: + self.errors.append(VARIABLE_NOT_DEFINED.replace('%s', node.lex, 1).replace('%s', self.current_type.name, 1)) + var_type = ErrorType() + node.computed_type = var_type + + @visitor.when(TrueNode) + def visit(self, node, scope): + node.computed_type = BoolType() + + @visitor.when(FalseNode) + def visit(self, node, scope): + node.computed_type = BoolType() + + @visitor.when(InstantiateNode) + def visit(self, node, scope): + try: + var_type = self.context.get_type(node.lex) + if var_type == AutoType(): + self.errors.append('Class AUTO_TYPE can not be instantiated.') + var_type = ErrorType() + except SemanticError as error: + self.errors.append(error.text) + var_type = ErrorType() + + node.computed_type = var_type \ No newline at end of file diff --git a/src/tours/TypeCollector.py b/src/tours/TypeCollector.py new file mode 100644 index 000000000..0d38f002c --- /dev/null +++ b/src/tours/TypeCollector.py @@ -0,0 +1,66 @@ +from parsing.ast import * +from cmp.semantic import SemanticError, Context +from cmp.semantic import ObjectType, StringType, IntType, AutoType, BoolType, IOType, SelfType +import cmp.visitor as visitor + +class TypeCollector(object): + def __init__(self): + self.context = None + self.errors = [] + + @visitor.on('node') + def visit(self, node): + pass + + @visitor.when(ProgramNode) + def visit(self, node): + self.context = Context() + + # Define base classes and their methods + DefineBaseClasses(self.context) + + for dec in node.declarations: + self.visit(dec) + + # Check that class Main is defined + try: + self.context.get_type('Main') + except SemanticError: + self.errors.append("Class 'Main' must be defined.") + + @visitor.when(ClassDeclarationNode) + def visit(self, node): + try: + self.context.get_type(node.id) + self.errors.append(f"Class '{node.id}' is already defined.") + except SemanticError: + self.context.create_type(node.id) + + +def DefineBaseClasses(context): + object_type = context.types['Object'] = ObjectType() + io_type = context.types['IO'] = IOType() + int_type = context.types['Int'] = IntType() + string_type = context.types['String'] = StringType() + bool_type = context.types['Bool'] = BoolType() + auto_type = context.types['AUTO_TYPE'] = AutoType() + self_type = context.types['SELF_TYPE'] = SelfType() + + object_type.define_method('abort', [], [], object_type) + object_type.define_method('type_name', [], [], string_type) + object_type.define_method('copy', [], [], self_type) + + int_type.set_parent(object_type) + + string_type.set_parent(object_type) + string_type.define_method('length', [], [], int_type) + string_type.define_method('concat', ['s'], [string_type], string_type) + string_type.define_method('substr', ['i', 'l'], [int_type, int_type], string_type) + + bool_type.set_parent(object_type) + + io_type.set_parent(object_type) + io_type.define_method('out_string', ['x'], [string_type], self_type) + io_type.define_method('out_int', ['x'], [int_type], self_type) + io_type.define_method('in_string', [], [], string_type) + io_type.define_method('in_int', [], [], int_type) diff --git a/src/tours/TypeInferencer.py b/src/tours/TypeInferencer.py new file mode 100644 index 000000000..353f5246e --- /dev/null +++ b/src/tours/TypeInferencer.py @@ -0,0 +1,200 @@ +from parsing.ast import * +from .utils import InferType +from cmp.semantic import Scope, SemanticError +from cmp.semantic import Type, ObjectType, IntType, StringType, BoolType, AutoType, ErrorType, SelfType, IOType +import cmp.visitor as visitor + +class TypeInferencer: + def __init__(self, context=None, errors=[]): + self.context = context + self.errors = errors + self.current_type = None + self.current_method = None + self.change = False + + @visitor.on('node') + def visit(self, node): + pass + + @visitor.when(ProgramNode) + def visit(self, node): + for dec in node.declarations: + self.visit(dec) + return self.change + + @visitor.when(ClassDeclarationNode) + def visit(self, node): + self.current_type = self.context.get_type(node.id) + + for feature in node.features: + if isinstance(feature, AttrDeclarationNode): + if self.current_type.get_attribute(feature.id).type.name == feature.type: + self.visit(feature) + elif feature.expr is not None: + self.visit(feature.expr) + else: + self.visit(feature) + + @visitor.when(AttrDeclarationNode) + def visit(self, node): + node_type = self.current_type.get_attribute(node.id).type + + if node.expr is not None: + self.visit(node.expr) + expr_type = node.expr.computed_type + + if node_type == AutoType() and expr_type == AutoType(): + if expr_type.infered_type is not None: + self.change |= InferType(self.current_type, node_type, expr_type.infered_type) + if node_type.infered_type is not None: + self.change |= InferType(self.current_type, expr_type, node_type.infered_type) + + @visitor.when(FuncDeclarationNode) + def visit(self, node): + self.current_method = self.current_type.get_method(node.id) + self.visit(node.expr) + + return_type_exp = node.expr.computed_type + return_type_met = self.current_method.return_type + + if return_type_met == AutoType() and return_type_exp == AutoType(): + if return_type_exp.infered_type is not None: + self.change |= InferType(self.current_type, return_type_met, return_type_exp.infered_type) + if return_type_met.infered_type is not None: + self.change |= InferType(self.current_type, return_type_exp, return_type_met.infered_type) + + @visitor.when(BlockNode) + def visit(self,node): + for expr in node.expr_lis: + self.visit(expr) + + @visitor.when(DispatchNode) + def visit(self, node): + if node.expr is not None: + self.visit(node.expr) + + if node.computed_type != ErrorType(): + obj_type = node.expr.computed_type + if node.type is not None: + obj_type = self.context.get_type(node.type) + else: + obj_type = self.current_type + + try: + method = obj_type.get_method(node.id) + if (node.arg is None and method.arg is None) or (len(node.arg) == len(method.param_types)): + if node.arg is not None: + for arg, param_type in zip(node.arg, method.param_types): + self.visit(arg) + arg_type = arg.computed_type + if param_type == AutoType() and arg_type == AutoType(): + if arg_type.infered_type is not None: + self.change |= InferType(self.current_type, param_type, arg_type.infered_type) + if param_type.infered_type is not None: + self.change |= InferType(self.current_type, arg_type, param_type.infered_type) + except: + pass + + @visitor.when(ConditionalNode) + def visit(self, node): + self.visit(node.predicate) + self.visit(node.then) + self.visit(node.elsex) + + @visitor.when(LetNode) + def visit(self, node): + for item in node.variables: + self.visit(item) + self.visit(node.expr) + + @visitor.when(VarDeclarationNode) + def visit(self, node): + try: + var_type = node.computed_type + if node.expr is not None: + self.visit(node.expr) + expresion_type = node.expr.computed_type + + if var_type == AutoType() and expresion_type == AutoType(): + if expresion_type.infered_type is not None: + self.change |= InferType(self.current_type, var_type, expresion_type.infered_type) + if var_type.infered_type is not None: + self.change |= InferType(self.current_type, expresion_type, var_type.infered_type) + except: + pass + + @visitor.when(LoopNode) + def visit(self, node): + self.visit(node.predicate) + self.visit(node.body) + + @visitor.when(CaseNode) + def visit(self, node): + self.visit(node.expr) + for attr in node.cases: + self.visit(attr) + + @visitor.when(CaseAttrNode) + def visit(self, node): + self.visit(node.expr) + + @visitor.when(AssignNode) + def visit(self, node): + self.visit(node.id) + var_type = node.id.computed_type + self.visit(node.expr) + expresion_type = node.expr.computed_type + + if var_type == AutoType() and expresion_type == AutoType(): + if expresion_type.infered_type is not None: + self.change |= InferType(self.current_type, var_type, expresion_type.infered_type) + if var_type.infered_type is not None: + self.change |= InferType(self.current_type, expresion_type, var_type.infered_type) + + @visitor.when(BinaryNode) + def visit(self, node): + self.visit(node.left) + self.visit(node.right) + + if isinstance(node, EqualsNode): + left_type = node.left.computed_type + right_type = node.right.computed_type + + if left_type == AutoType() and right_type == AutoType(): + if left_type.infered_type is not None and (left_type.infered_type == StringType() or left_type.infered_type == BoolType() or left_type.infered_type == IntType()): + self.change |= InferType(self.current_type, right_type, left_type.infered_type) + + if right_type.infered_type is not None and (right_type.infered_type == StringType() or right_type.infered_type == BoolType() or right_type.infered_type == IntType()): + self.change |= InferType(self.current_type, left_type, right_type.infered_type) + + @visitor.when(PrimeNode) + def visit(self, node): + self.visit(node.expr) + + @visitor.when(NotNode) + def visit(self, node): + self.visit(node.expr) + + @visitor.when(StringNode) + def visit(self, node): + pass + + @visitor.when(IsVoidNode) + def visit(self, node): + self.visit(node.expr) + + @visitor.when(VariableNode) + def visit(self, node): + pass + + @visitor.when(TrueNode) + def visit(self, node): + pass + + @visitor.when(FalseNode) + def visit(self, node): + pass + + @visitor.when(InstantiateNode) + def visit(self, node): + pass \ No newline at end of file diff --git a/src/tours/utils.py b/src/tours/utils.py new file mode 100644 index 000000000..b0df05ad5 --- /dev/null +++ b/src/tours/utils.py @@ -0,0 +1,78 @@ +from parsing.ast import * +from cmp.semantic import SemanticError, Attribute, Method, Context +from cmp.semantic import Type, ErrorType, StringType, IntType, AutoType, BoolType, ObjectType, IOType, SelfType + +def AnalizeClassAutoTypes(class_type, errors, inferences): + for attribute in class_type.attributes: + if attribute.type == AutoType(): + if attribute.type.infered_type is None: + errors.append(f"Can not infered the type of the attribute '{attribute.name}' of the class '{class_type.name}'.") + else: + inferences.append(f"The type of the attribute '{attribute.name}' of the class '{class_type.name}' was infered to '{attribute.type.infered_type.name}'.") + + for method in class_type.methods: + if method.return_type == AutoType(): + if method.return_type.infered_type is None: + errors.append(f"Can not infered the return type of the method '{method.name}' of the class '{class_type.name}'.") + else: + inferences.append(f"The return type of the method '{method.name}' of the class '{class_type.name}' was infered to '{method.return_type.infered_type.name}'.") + +def AnalizeScopeAutoTypes(scope, errors, inferences): + stack = [scope] + while len(stack) != 0: + temp = stack.pop(0) + for s in temp.children: + stack.append(s) + + for var in temp.locals: + if var.type == AutoType(): + if var.type.infered_type is None: + errors.append(f"Can not infered the type of the variable '{var.name}' of the class '{temp.class_name}'.") + else: + inferences.append(f"The type of the variable '{var.name}' of the class '{temp.class_name}' was infered to '{var.type.infered_type.name}'.") + +def find_parent_type(current_type, type1, type2): + if type1 == AutoType() and type2 != AutoType(): + return type2 + elif type2 == AutoType(): + return type1 + + if type1 == SelfType(): + type1 = current_type + if type2 == SelfType(): + type2 = current_type + + if type1 == type2: + return type1 + elif type1 == ErrorType() or type2 == ErrorType(): + return ErrorType() + elif type1 == ObjectType() or type2 == ObjectType(): + return ObjectType() + + parent1 = find_parent_type(current_type, type1.parent, type2) + parent2 = find_parent_type(current_type, type1, type2.parent) + parent3 = find_parent_type(current_type, type1.parent, type2.parent) + + if parent1.conforms_to(parent2): + temp = parent1 + else: + temp = parent2 + + if temp.conforms_to(parent3): + return temp + else: + return parent3 + +def InferType(current_type, auto_var, not_auto_var): + if not_auto_var != ErrorType(): + if auto_var.infered_type is not None: + temp = find_parent_type(current_type, auto_var.infered_type, not_auto_var) + + if auto_var.infered_type != temp : + auto_var.infered_type = temp + return True + else: + auto_var.infered_type = not_auto_var + return True + + return False \ No newline at end of file From 040608c64839f6bff61300686338bd4ba94c6ef3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karla=20Olivera=20Hern=C3=A1ndez?= Date: Wed, 9 Feb 2022 23:00:25 -0500 Subject: [PATCH 03/81] Fix some errors in semantic checking and fix error messages --- src/cmp/semantic.py | 19 ++++++++++++- src/cmp/visitor.py | 4 ++- src/cool.py | 43 ++++++++++++++++++++++++++++++ src/parsing/__init__.py | 0 src/parsing/ast.py | 40 ++++++++++++++++++++++++---- src/parsing/lexer.py | 5 ++-- src/parsing/parser.py | 8 +++--- src/tours/TypeBuilder.py | 28 +++++++++++++------- src/tours/TypeChecker.py | 53 +++++++++++++++++++++---------------- src/tours/TypeCollector.py | 23 ++++++++++++---- src/tours/TypeInferencer.py | 1 + src/tours/utils.py | 4 +++ 12 files changed, 177 insertions(+), 51 deletions(-) delete mode 100644 src/parsing/__init__.py diff --git a/src/cmp/semantic.py b/src/cmp/semantic.py index 03c639aa4..a408e0fa9 100644 --- a/src/cmp/semantic.py +++ b/src/cmp/semantic.py @@ -1,11 +1,13 @@ import itertools as itt from collections import OrderedDict + class SemanticError(Exception): @property def text(self): return self.args[0] + class Attribute: def __init__(self, name, typex): self.name = name @@ -17,6 +19,7 @@ def __str__(self): def __repr__(self): return str(self) + class Method: def __init__(self, name, param_names, params_types, return_type): self.name = name @@ -33,7 +36,7 @@ def __eq__(self, other): other.return_type == self.return_type and \ other.param_types == self.param_types -# Types + class Type: def __init__(self, name:str): self.name = name @@ -142,6 +145,7 @@ def __str__(self): def __repr__(self): return str(self) + class ErrorType(Type): def __init__(self): Type.__init__(self, '') @@ -155,6 +159,7 @@ def bypass(self): def __eq__(self, other): return isinstance(other, ErrorType) + class ObjectType(Type): def __init__(self): Type.__init__(self, 'Object') @@ -162,6 +167,7 @@ def __init__(self): def __eq__(self, other): return other.name == self.name or isinstance(other, ObjectType) + class IntType(Type): def __init__(self): Type.__init__(self, 'Int') @@ -170,6 +176,7 @@ def __init__(self): def __eq__(self, other): return other.name == self.name or isinstance(other, IntType) + class StringType(Type): def __init__(self): Type.__init__(self, 'String') @@ -178,6 +185,7 @@ def __init__(self): def __eq__(self, other): return other.name == self.name or isinstance(other, StringType) + class BoolType(Type): def __init__(self): Type.__init__(self, 'Bool') @@ -186,6 +194,7 @@ def __init__(self): def __eq__(self, other): return other.name == self.name or isinstance(other, BoolType) + class AutoType(Type): def __init__(self): Type.__init__(self, 'AUTO_TYPE') @@ -194,6 +203,7 @@ def __init__(self): def __eq__(self, other): return isinstance(other, AutoType) + class SelfType(Type): def __init__(self): Type.__init__(self, 'SELF_TYPE') @@ -201,6 +211,7 @@ def __init__(self): def __eq__(self, other): return isinstance(other, SelfType) + class IOType(Type): def __init__(self): Type.__init__(self, 'IO') @@ -209,6 +220,7 @@ def __init__(self): def __eq__(self, other): return isinstance(other, IOType) + class Context: def __init__(self): self.types = {} @@ -231,11 +243,13 @@ def __str__(self): def __repr__(self): return str(self) + class VariableInfo: def __init__(self, name, vtype): self.name = name self.type = vtype + class Scope: def __init__(self, parent=None): self.locals = [] @@ -260,6 +274,9 @@ def define_variable(self, vname, vtype): self.locals.append(info) return info + def remove_variable(self, vname): + self.locals = [v for v in self.locals if v.name == vname] + def find_variable(self, vname, index=None): locals = self.locals if index is None else itt.islice(self.locals, index) try: diff --git a/src/cmp/visitor.py b/src/cmp/visitor.py index 964842836..567fa5a78 100644 --- a/src/cmp/visitor.py +++ b/src/cmp/visitor.py @@ -22,8 +22,10 @@ import inspect + __all__ = ['on', 'when'] + def on(param_name): def f(fn): dispatcher = Dispatcher(param_name, fn) @@ -77,4 +79,4 @@ def __argspec(fn): if hasattr(inspect, 'getfullargspec'): return inspect.getfullargspec(fn) else: - return inspect.getargspec(fn) + return inspect.getargspec(fn) \ No newline at end of file diff --git a/src/cool.py b/src/cool.py index 577d86d6e..a4e7372a8 100644 --- a/src/cool.py +++ b/src/cool.py @@ -1,6 +1,11 @@ import sys from parsing.parser import COOL_Parser from parsing.lexer import COOL_Lexer +from tours.TypeCollector import TypeCollector +from tours.TypeBuilder import TypeBuilder +from tours.TypeChecker import TypeChecker +from tours.TypeInferencer import TypeInferencer +from tours.utils import AnalizeScopeAutoTypes, AnalizeClassAutoTypes input_file = sys.argv[1] with open(input_file, 'r') as f: @@ -20,4 +25,42 @@ for e in errors: print(e) exit(1) + +# Collecting Types +collector = TypeCollector() +collector.visit(ast) +context = collector.context +errors = collector.errors + +# Building Types +builder = TypeBuilder(context, errors) +builder.visit(ast) + +# Checking Types +checker = TypeChecker(context, errors) +scope = checker.visit(ast) + +# # Infering Types +# while True: +# inferencer = TypeInferencer(context, errors) +# if not inferencer.visit(ast): +# break + +# inferences = [] +# for declaration in ast.declarations: +# AnalizeClassAutoTypes(context.get_type(declaration.id), errors, inferences) +# AnalizeScopeAutoTypes(scope, errors, inferences) + +# print("Infered Types:") +# if inferences: +# for inf in inferences: +# print(inf) +# else: +# print("There wasn't any variable type infered.") + +if errors: + for e in errors: + print(e) + exit(1) + exit(0) \ No newline at end of file diff --git a/src/parsing/__init__.py b/src/parsing/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/parsing/ast.py b/src/parsing/ast.py index 38af21d6d..0a782b197 100644 --- a/src/parsing/ast.py +++ b/src/parsing/ast.py @@ -1,16 +1,20 @@ class Node: pass + class ProgramNode(Node): def __init__(self, declarations): self.declarations = declarations + class DeclarationNode(Node): pass + class ExpressionNode(Node): pass + # Class class ClassDeclarationNode(DeclarationNode): def __init__(self, idx, features, parent=None): @@ -18,6 +22,7 @@ def __init__(self, idx, features, parent=None): self.parent = parent self.features = features + # Features class FuncDeclarationNode(DeclarationNode): def __init__(self, idx, params, return_type, body): @@ -26,22 +31,26 @@ def __init__(self, idx, params, return_type, body): self.type = return_type self.expr = body + class AttrDeclarationNode(DeclarationNode): def __init__(self, idx, typex, expr=None): self.id = idx self.type = typex self.expr = expr + class VarDeclarationNode(ExpressionNode): def __init__(self, idx, typex, expr=None): self.id = idx self.type = typex self.expr = expr + class AssignNode(ExpressionNode): def __init__(self, idx, expr): self.id = idx self.expr = expr + class DispatchNode(ExpressionNode): def __init__(self, obj, idx, args, from_type=None): @@ -50,102 +59,123 @@ def __init__(self, obj, idx, args, from_type=None): self.arg = args self.type = from_type + class BinaryNode(ExpressionNode): def __init__(self, left, right): self.left = left self.right = right + class UnaryNode(ExpressionNode): def __init__(self, exp): self.expr = exp + class ConditionalNode(ExpressionNode): def __init__(self, if_exp, then_exp, else_exp): self.predicate = if_exp self.then = then_exp self.elsex = else_exp + class LoopNode(ExpressionNode): def __init__(self, while_exp, loop_exp): self.predicate = while_exp self.body = loop_exp + class BlockNode(ExpressionNode): def __init__(self, exp_list): self.expr_lis = exp_list + class LetNode(ExpressionNode): def __init__(self, var_list, in_exp): self.variables = var_list self.expr = in_exp + class CaseNode(ExpressionNode): def __init__(self, cond, case_list): self.expr = cond self.cases = case_list + class CaseAttrNode(ExpressionNode): def __init__(self, idx, typex, expr): self.id = idx self.type = typex self.expr = expr + class AtomicNode(ExpressionNode): def __init__(self, lex): self.lex = lex + # Atomic Expressions class ConstantNumNode(AtomicNode): pass + class StringNode(AtomicNode): pass + class TrueNode(AtomicNode): pass + class FalseNode(AtomicNode): pass + class VariableNode(AtomicNode): pass + class InstantiateNode(AtomicNode): pass + # Arithmetic Operations class PlusNode(BinaryNode): pass + class MinusNode(BinaryNode): pass + class StarNode(BinaryNode): pass + class DivNode(BinaryNode): pass + # Comparison Operations class LessNode(BinaryNode): pass + class ElessNode(BinaryNode): pass + class EqualsNode(BinaryNode): pass + # Unary Operations class NotNode(UnaryNode): pass + class PrimeNode(UnaryNode): pass -class IsVoidNode(UnaryNode): - pass - - - +class IsVoidNode(UnaryNode): + pass \ No newline at end of file diff --git a/src/parsing/lexer.py b/src/parsing/lexer.py index af299d672..f77191685 100644 --- a/src/parsing/lexer.py +++ b/src/parsing/lexer.py @@ -1,5 +1,6 @@ import ply.lex as lex + class COOL_Lexer: tokens = [ 'OBJECTID', # object identifiers @@ -232,6 +233,4 @@ def t_error(self, t): # not recognized symbol t.lexer.skip(1) def register_error(self, line, column, text): - self.errors.append(f'{line,column} - {text}') - - + self.errors.append(f'{line,column} - {text}') \ No newline at end of file diff --git a/src/parsing/parser.py b/src/parsing/parser.py index 75c76e9f3..c3a6039e9 100644 --- a/src/parsing/parser.py +++ b/src/parsing/parser.py @@ -2,6 +2,7 @@ from .lexer import COOL_Lexer from .ast import * + class COOL_Parser: def __init__(self): @@ -100,7 +101,7 @@ def p_param(p): @staticmethod def p_exp_assign(p): 'exp : OBJECTID ASSIGN exp' - p[0] = AssignNode(p[1],p[3]) + p[0] = AssignNode(VariableNode(p[1]),p[3]) @staticmethod def p_exp_let(p): @@ -120,12 +121,12 @@ def p_ident_list_multi(p): @staticmethod def p_iden(p): 'iden : OBJECTID COLON TYPEID' - p[0] = AttrDeclarationNode(p[1],p[3],None) + p[0] = VarDeclarationNode(p[1],p[3],None) @staticmethod def p_iden_init(p): 'iden : OBJECTID COLON TYPEID ASSIGN exp' - p[0] = AttrDeclarationNode(p[1],p[3],p[5]) + p[0] = VarDeclarationNode(p[1],p[3],p[5]) @staticmethod def p_case_list_single(p): @@ -172,7 +173,6 @@ def p_comp_equal(p): 'comp : arith EQUAL arith' p[0] = EqualsNode(p[1],p[3]) - # ?????? @staticmethod def p_comp_equal_not(p): 'comp : arith EQUAL NOT exp' diff --git a/src/tours/TypeBuilder.py b/src/tours/TypeBuilder.py index b0d7914c3..062665880 100644 --- a/src/tours/TypeBuilder.py +++ b/src/tours/TypeBuilder.py @@ -1,8 +1,17 @@ from parsing.ast import * from cmp.semantic import SemanticError -from cmp.semantic import ErrorType, StringType, IntType, AutoType, BoolType, ObjectType, IOType, SelfType +from cmp.semantic import ErrorType, StringType, IntType, AutoType, BoolType, ObjectType, SelfType import cmp.visitor as visitor + +CANNOT_INHERIT = 'SemanticError: Class %s cannot inherit class %s.' +MAIN_NOT_DEFINED = 'Method "main" must be defined in "Main" class.' +MAIN_NOT_HERITABLE = 'Class "Main" is not heritable.' +CYCLES_IN_CLASES = 'The graph defined by parent-child relation on classes may not contain cycles.' +NOT_SELF_TYPE = 'The type of the parameter "%s" can not be SELF_TYPE in method "%s" in class "%s".' +IDENTIFIER_USED = 'The identifier "%s" is already used in the param list of method "%s" in class "%s.' + + class TypeBuilder: def __init__(self, context, errors=[]): self.context = context @@ -24,7 +33,7 @@ def visit(self, node): try: main_type.get_method('main') except SemanticError: - self.errors.append("Method 'main' must be defined in 'Main' class.") + self.errors.append(MAIN_NOT_DEFINED) except SemanticError: pass @@ -38,13 +47,13 @@ def visit(self, node): try: parent = self.context.get_type(node.parent) if parent == BoolType() or parent == IntType() or parent == StringType() or parent == SelfType() or parent == AutoType(): - self.errors.append(f"Class '{parent.name}' is not heritable.") + self.errors.append(CANNOT_INHERIT.replace('%s', node.id, 1).replace('%s', parent.name, 1)) parent = ErrorType() else: try: main_type = self.context.get_type('Main') if parent == main_type: - self.errors.append(f"Class 'Main' is not heritable.") + self.errors.append(MAIN_NOT_HERITABLE) parent = ErrorType() except SemanticError: pass @@ -53,10 +62,11 @@ def visit(self, node): parent = ErrorType() if parent.conforms_to(self.current_type): - self.errors.append(f"The graph defined by parent-child relation on classes may not contain cycles.") + self.errors.append(CYCLES_IN_CLASES) parent = ErrorType() - - self.current_type.set_parent(parent) + + if self.current_type != ObjectType(): + self.current_type.set_parent(parent) for feature in node.features: self.visit(feature) @@ -88,14 +98,14 @@ def visit(self, node): try: param_type = self.context.get_type(var.type) if param_type == SelfType(): - self.errors.append(f"The type of the parameter '{var.id}' can not be SELF_TYPE in method '{node.id}' in class '{self.current_type.name}'.") + self.errors.append(NOT_SELF_TYPE.replace('%s', var.id, 1).replace('%s', node.id, 1).replace('%s', self.current_type.name, 1)) param_type = ErrorType() except SemanticError as error: self.errors.append(error.text) param_type = ErrorType() if var.id in params: - self.errors.append(f"The identifier '{var.id}' is already used in the param list of method '{node.id}' in class '{self.current_type.name}'.") + self.errors.append(IDENTIFIER_USED.replace('%s', var.id, 1).replace('%s', node.id, 1).replace('%s', self.current_type.name, 1)) params.append(var.id) types.append(param_type) diff --git a/src/tours/TypeChecker.py b/src/tours/TypeChecker.py index c4bc9f823..84ea1dcba 100644 --- a/src/tours/TypeChecker.py +++ b/src/tours/TypeChecker.py @@ -4,17 +4,24 @@ from cmp.semantic import Type, ObjectType, IntType, StringType, BoolType, AutoType, ErrorType, SelfType, IOType import cmp.visitor as visitor + SELF_IS_READONLY = "Variable 'self' is read-only." LOCAL_ALREADY_DEFINED = "Variable '%s' is already defined in method '%s'." -INCOMPATIBLE_TYPES = "Can not convert '%s' into '%s'." -VARIABLE_NOT_DEFINED = "Variable '%s' is not defined in '%s'." -INVALID_OPERATION = "Operation '%s' is not defined between '%s' and '%s'." +INCOMPATIBLE_ATTRIBUTE_TYPE = "TypeError: Inferred type %s of initialization of attribute %s does not conform to declared type %s." +INCOMPATIBLE_RET_FUNC_TYPE = "TypeError: Inferred return type %s of method %s does not conform to declared return type %s." +INCOMPATIBLE_DISPATCH_TYPE = "TypeError: In call of method %s, type %s of parameter %s does not conform to declared type %s." +INCOMPATIBLE_DISPATCH_DEC_TYPE = "TypeError: Expression type %s does not conform to declared static dispatch type %s." +VARIABLE_NOT_DEFINED = "NameError: Undeclared identifier %s." +INVALID_OPERATION = "TypeError: non-Int arguments: %s %s %s" OPERATION_NOT_DEFINED = "Operation '%s' is not defined for type '%s'." -PREDICATE_OPERATIONS = "Predicate of the '%s' operation must be bool in method '%s'." +UNARY_OPERATION_NOT_DEFINED = "TypeError: Argument of '%s' has type %s instead of %s." +PREDICATE_OPERATIONS = "TypeError: Predicate of '%s' does not have type Bool." TYPE_VOID = "The expression can not be void." ATTRIBUTE_NOT_INFERED = "Can not infered attribute '%s' in class '%s'." RETURN_TYPE_METHOD = "Can not infered the return type of the method '%s' in class '%s'." VAR_TYPE_NOT_INFERED = "Can not infered the type of the '%s' '%s' in method '%s' in class '%s'." +WRONG_NUMBER_ARGUMENTS = "SemanticError: Method %s called with wrong number of arguments." + class TypeChecker: def __init__(self, context, errors=[]): @@ -72,7 +79,7 @@ def visit(self, node, scope): expr_type = self.current_type if node_type != AutoType() and expr_type != AutoType() and not expr_type.conforms_to(node_type): - self.errors.append(INCOMPATIBLE_TYPES.replace('%s', expr_type.name, 1).replace('%s', node_type.name, 1)) + self.errors.append(INCOMPATIBLE_ATTRIBUTE_TYPE.replace('%s', expr_type.name, 1).replace('%s', node.id, 1).replace('%s', node_type.name, 1)) elif node_type == AutoType() and expr_type != AutoType(): InferType(self.current_type, node_type, expr_type) elif node_type != AutoType() and expr_type == AutoType(): @@ -103,7 +110,7 @@ def visit(self, node, scope): if return_type_met != AutoType() and return_type_exp != AutoType(): if not return_type_exp.conforms_to(return_type_met): - self.errors.append(INCOMPATIBLE_TYPES.replace('%s',return_type_exp.name , 1).replace('%s',return_type_met.name , 1)) + self.errors.append(INCOMPATIBLE_RET_FUNC_TYPE.replace('%s', return_type_exp.name, 1).replace('%s',node.id , 1).replace('%s',return_type_met.name , 1)) elif return_type_met == AutoType() and return_type_exp != AutoType(): InferType(self.current_type, return_type_met, return_type_exp) elif return_type_met != AutoType() and return_type_exp == AutoType(): @@ -126,7 +133,7 @@ def visit(self, node, scope): try: typex = self.context.get_type(node.type) if not obj_type.conforms_to(typex): - self.errors.append(INCOMPATIBLE_TYPES.replace('%s', node.obj.name, 1).replace('%s', typex.name, 1)) + self.errors.append(INCOMPATIBLE_DISPATCH_DEC_TYPE.replace('%s', obj_type.name, 1).replace('%s', typex.name, 1)) typex = ErrorType() obj_type = typex except SemanticError as error: @@ -139,12 +146,12 @@ def visit(self, node, scope): method = obj_type.get_method(node.id) if (node.arg is None and method.arg is None) or (len(node.arg) == len(method.param_types)): if node.arg is not None: - for arg, param_type in zip(node.arg, method.param_types): + for arg, param_type, param_name in zip(node.arg, method.param_types, method.param_names): self.visit(arg, scope) arg_type = arg.computed_type if arg.computed_type != SelfType() else self.current_type if param_type != AutoType() and arg_type != AutoType() and not arg_type.conforms_to(param_type): - self.errors.append(INCOMPATIBLE_TYPES.replace('%s', arg_type.name, 1).replace('%s', param_type.name, 1)) + self.errors.append(INCOMPATIBLE_DISPATCH_TYPE.replace('%s', node.id, 1).replace('%s', arg_type.name, 1).replace('%s', param_name, 1).replace('%s', param_type.name, 1)) typee = ErrorType() elif param_type == AutoType() and arg_type != AutoType(): InferType(self.current_type, param_type, arg_type) @@ -152,7 +159,7 @@ def visit(self, node, scope): elif param_type != AutoType() and arg_type == AutoType(): InferType(self.current_type, arg_type, param_type) else: - self.errors.append(f"Method '{method.name}' only accepts '{len(method.param_types)}' arguments.") + self.errors.append(WRONG_NUMBER_ARGUMENTS.replace('%s', method.name, 1)) if typee is None: ret_type = method.return_type if method.return_type != SelfType() else obj_type @@ -176,7 +183,7 @@ def visit(self, node, scope): if predicate_type != AutoType() and predicate_type.conforms_to(BoolType()): node.computed_type = find_parent_type(self.current_type, node.then.computed_type, node.elsex.computed_type) elif predicate_type != AutoType(): - self.errors.append(PREDICATE_OPERATIONS.replace('%s', "Conditional", 1).replace('%s', self.current_method.name, 1)) + self.errors.append(PREDICATE_OPERATIONS.replace('%s', "if", 1)) node.computed_type = ErrorType() else: InferType(self.current_type, predicate_type, BoolType()) @@ -228,7 +235,7 @@ def visit(self, node, scope): if predicate_type != AutoType() and predicate_type.conforms_to(BoolType()): node.computed_type = ObjectType() elif predicate_type != AutoType(): - self.errors.append(PREDICATE_OPERATIONS.replace('%s',"Loop", 1).replace('%s', self.current_method, 1)) + self.errors.append(PREDICATE_OPERATIONS.replace('%s',"Loop", 1)) node.computed_type = ErrorType() else: InferType(self.current_type, predicate_type, BoolType()) @@ -294,17 +301,17 @@ def visit(self, node, scope): right_type = node.right.computed_type if isinstance(node, PlusNode): - operation = "plus" + operation = "+" elif isinstance(node, MinusNode): - operation= "minus" + operation= "-" elif isinstance(node, DivNode): - operation = "division" + operation = "/" elif isinstance(node, StarNode): - operation = "multiplication" + operation = "*" elif isinstance(node, ElessNode): - operation = "less or equals" + operation = "<=" elif isinstance(node, LessNode): - operation = "less" + operation = "<" if left_type != AutoType() and right_type != AutoType(): if not isinstance(node, EqualsNode): @@ -317,7 +324,7 @@ def visit(self, node, scope): if(left_type == right_type): self.errors.append(OPERATION_NOT_DEFINED.replace('%s', operation, 1).replace('%s', left_type.name, 1)) else: - self.errors.append(INVALID_OPERATION.replace('%s', operation, 1).replace('%s', left_type.name, 1).replace('%s', right_type.name, 1)) + self.errors.append(INVALID_OPERATION.replace('%s', left_type.name, 1).replace('%s', operation, 1).replace('%s', right_type.name, 1)) node.computed_type = ErrorType() else: if left_type == right_type: @@ -327,7 +334,7 @@ def visit(self, node, scope): self.errors.append(OPERATION_NOT_DEFINED.replace('%s', "equals", 1).replace('%s', left_type.name, 1)) node.computed_type = ErrorType() else: - self.errors.append(INVALID_OPERATION.replace('%s', 'equals', 1).replace('%s', left_type.name, 1).replace('%s', right_type.name, 1)) + self.errors.append(INVALID_OPERATION.replace('%s', left_type.name, 1).replace('%s', "=", 1).replace('%s', right_type.name, 1)) node.computed_type = ErrorType() else: @@ -379,7 +386,7 @@ def visit(self, node, scope): if type_expr == AutoType(): InferType(self.current_type, type_expr, IntType()) else: - self.errors.append(OPERATION_NOT_DEFINED.replace('%s', "Prime", 1).replace('%s', type_expr, 1)) + self.errors.append(UNARY_OPERATION_NOT_DEFINED.replace('%s', "~", 1).replace('%s', type_expr.name, 1).replace('%s', "Int", 1)) node.computed_type = ErrorType() @visitor.when(NotNode) @@ -392,7 +399,7 @@ def visit(self, node, scope): if type_expr == AutoType(): InferType(self.current_type, type_expr, BoolType()) else: - self.errors.append(OPERATION_NOT_DEFINED.replace('%s', "Not", 1).replace('%s', type_expr.name, 1)) + self.errors.append(UNARY_OPERATION_NOT_DEFINED.replace('%s', "not", 1).replace('%s', type_expr.name, 1).replace('%s', "Bool", 1)) node.computed_type = ErrorType() @visitor.when(StringNode) @@ -413,7 +420,7 @@ def visit(self, node, scope): if scope.is_defined(node.lex, self.current_type): var_type = scope.find_variable_or_attribute(node.lex, self.current_type).type else: - self.errors.append(VARIABLE_NOT_DEFINED.replace('%s', node.lex, 1).replace('%s', self.current_type.name, 1)) + self.errors.append(VARIABLE_NOT_DEFINED.replace('%s', node.lex, 1)) var_type = ErrorType() node.computed_type = var_type diff --git a/src/tours/TypeCollector.py b/src/tours/TypeCollector.py index 0d38f002c..03065b55c 100644 --- a/src/tours/TypeCollector.py +++ b/src/tours/TypeCollector.py @@ -3,6 +3,12 @@ from cmp.semantic import ObjectType, StringType, IntType, AutoType, BoolType, IOType, SelfType import cmp.visitor as visitor + +BASIC_CLASS_REDEFINED = 'SemanticError: Redefinition of basic class %s.' +CLASS_REDEFINED = 'SemanticError: Classes may not be redefined' +MAIN_NOT_DEFINED = 'Class Main must be defined.' + + class TypeCollector(object): def __init__(self): self.context = None @@ -17,7 +23,7 @@ def visit(self, node): self.context = Context() # Define base classes and their methods - DefineBaseClasses(self.context) + define_base_classes(self.context) for dec in node.declarations: self.visit(dec) @@ -26,18 +32,25 @@ def visit(self, node): try: self.context.get_type('Main') except SemanticError: - self.errors.append("Class 'Main' must be defined.") + self.errors.append(MAIN_NOT_DEFINED) @visitor.when(ClassDeclarationNode) def visit(self, node): try: self.context.get_type(node.id) - self.errors.append(f"Class '{node.id}' is already defined.") + if is_base_class(node.id): + self.errors.append(BASIC_CLASS_REDEFINED.replace('%s', node.id, 1)) + else: + self.errors.append(CLASS_REDEFINED) except SemanticError: self.context.create_type(node.id) -def DefineBaseClasses(context): +def is_base_class(id): + return id in ['Object', 'IO', 'Int', 'String', 'Bool'] + + +def define_base_classes(context): object_type = context.types['Object'] = ObjectType() io_type = context.types['IO'] = IOType() int_type = context.types['Int'] = IntType() @@ -63,4 +76,4 @@ def DefineBaseClasses(context): io_type.define_method('out_string', ['x'], [string_type], self_type) io_type.define_method('out_int', ['x'], [int_type], self_type) io_type.define_method('in_string', [], [], string_type) - io_type.define_method('in_int', [], [], int_type) + io_type.define_method('in_int', [], [], int_type) \ No newline at end of file diff --git a/src/tours/TypeInferencer.py b/src/tours/TypeInferencer.py index 353f5246e..fde251b75 100644 --- a/src/tours/TypeInferencer.py +++ b/src/tours/TypeInferencer.py @@ -4,6 +4,7 @@ from cmp.semantic import Type, ObjectType, IntType, StringType, BoolType, AutoType, ErrorType, SelfType, IOType import cmp.visitor as visitor + class TypeInferencer: def __init__(self, context=None, errors=[]): self.context = context diff --git a/src/tours/utils.py b/src/tours/utils.py index b0df05ad5..8c9e4baa0 100644 --- a/src/tours/utils.py +++ b/src/tours/utils.py @@ -2,6 +2,7 @@ from cmp.semantic import SemanticError, Attribute, Method, Context from cmp.semantic import Type, ErrorType, StringType, IntType, AutoType, BoolType, ObjectType, IOType, SelfType + def AnalizeClassAutoTypes(class_type, errors, inferences): for attribute in class_type.attributes: if attribute.type == AutoType(): @@ -17,6 +18,7 @@ def AnalizeClassAutoTypes(class_type, errors, inferences): else: inferences.append(f"The return type of the method '{method.name}' of the class '{class_type.name}' was infered to '{method.return_type.infered_type.name}'.") + def AnalizeScopeAutoTypes(scope, errors, inferences): stack = [scope] while len(stack) != 0: @@ -31,6 +33,7 @@ def AnalizeScopeAutoTypes(scope, errors, inferences): else: inferences.append(f"The type of the variable '{var.name}' of the class '{temp.class_name}' was infered to '{var.type.infered_type.name}'.") + def find_parent_type(current_type, type1, type2): if type1 == AutoType() and type2 != AutoType(): return type2 @@ -63,6 +66,7 @@ def find_parent_type(current_type, type1, type2): else: return parent3 + def InferType(current_type, auto_var, not_auto_var): if not_auto_var != ErrorType(): if auto_var.infered_type is not None: From 24a05a68ea7ad11d4ebf9fe0fa891f68895bec73 Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Fri, 11 Feb 2022 20:31:12 -0500 Subject: [PATCH 04/81] Add docker environment for the project --- Dockerfile | 9 +++++++++ docker-compose.yml | 8 ++++++++ requirements.txt | 1 + 3 files changed, 18 insertions(+) create mode 100644 Dockerfile create mode 100644 docker-compose.yml diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..25fabcff5 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +FROM docker.uclv.cu/python:latest + +COPY ./requirements.txt ./requirements.txt + +RUN pip3 install -r requirements.txt + +RUN mkdir cool-compiler-2021 + +WORKDIR /cool-compiler-2021 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..7385c9329 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,8 @@ +version: "3.7" +services: + compiler: + build: . + command: make test + working_dir: /cool-compiler-2021/src + volumes: + - ./:/cool-compiler-2021 diff --git a/requirements.txt b/requirements.txt index 9eb0cad1a..cba16ee2f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ pytest pytest-ordering +ply From 36bf5c2ecaddcc59c32873fca1fb315cef40e5b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karla=20Olivera=20Hern=C3=A1ndez?= Date: Sun, 20 Feb 2022 15:36:45 -0500 Subject: [PATCH 05/81] Fix errors messages --- src/tours/TypeBuilder.py | 34 +++++++++++----- src/tours/TypeChecker.py | 83 +++++++++++++++++++++++++++----------- src/tours/TypeCollector.py | 5 +-- src/tours/utils.py | 6 ++- 4 files changed, 88 insertions(+), 40 deletions(-) diff --git a/src/tours/TypeBuilder.py b/src/tours/TypeBuilder.py index 062665880..4d5eb4ebe 100644 --- a/src/tours/TypeBuilder.py +++ b/src/tours/TypeBuilder.py @@ -7,9 +7,17 @@ CANNOT_INHERIT = 'SemanticError: Class %s cannot inherit class %s.' MAIN_NOT_DEFINED = 'Method "main" must be defined in "Main" class.' MAIN_NOT_HERITABLE = 'Class "Main" is not heritable.' -CYCLES_IN_CLASES = 'The graph defined by parent-child relation on classes may not contain cycles.' +CYCLES_IN_CLASES = 'SemanticError: Class %s, or an ancestor of %s, is involved in an inheritance cycle.' NOT_SELF_TYPE = 'The type of the parameter "%s" can not be SELF_TYPE in method "%s" in class "%s".' -IDENTIFIER_USED = 'The identifier "%s" is already used in the param list of method "%s" in class "%s.' +SELF_IS_READONLY = "Variable 'self' is read-only." +IDENTIFIER_USED = 'SemanticError: Formal parameter %s is multiply defined.' +ATTRIBUTE_REDEFINED = "SemanticError: Attribute %s is multiply defined in class." +METHOD_REDEFINED = "SemanticError: Method %s is multiply defined in class." +UNDEFINED_ATTRIBUTE_TYPE ="TypeError: Class %s of attribute %s is undefined." +PARENT_ATTRIBUTE_REDEFINED = "SemanticError: Attribute %s is an attribute of an inherited class." +PARENT_NOT_DEFINED = "TypeError: Class %s inhertits from an undefined class %s." +UNDEFINED_PARAM_TYPE = "TypeError: Class %s of formal parameter %s is undefined." +UNDEFINED_RETURN_TYPE = "TypeError: Undefined return type %s in method %s." class TypeBuilder: @@ -58,11 +66,11 @@ def visit(self, node): except SemanticError: pass except SemanticError as error: - self.errors.append(error.text) + self.errors.append(PARENT_NOT_DEFINED.replace('%s', node.id, 1).replace('%s', node.parent, 1)) parent = ErrorType() if parent.conforms_to(self.current_type): - self.errors.append(CYCLES_IN_CLASES) + self.errors.append(CYCLES_IN_CLASES.replace('%s', node.id, 2)) parent = ErrorType() if self.current_type != ObjectType(): @@ -76,20 +84,24 @@ def visit(self, node): try: att_type = self.context.get_type(node.type) except SemanticError as error: - self.errors.append(error.text) + self.errors.append(UNDEFINED_ATTRIBUTE_TYPE.replace('%s', node.type, 1).replace('%s', node.id, 1)) att_type = ErrorType() try: self.current_type.define_attribute(node.id, att_type) except SemanticError as error: - self.errors.append(error.text) - + x = self.current_type.get_attribute_parent(node.id) + if x == self.current_type: + self.errors.append(ATTRIBUTE_REDEFINED.replace('%s', node.id, 1)) + else: + self.errors.append(PARENT_ATTRIBUTE_REDEFINED.replace('%s', node.id, 1)) + @visitor.when(FuncDeclarationNode) def visit(self, node): try: return_type = self.context.get_type(node.type) except SemanticError as error: - self.errors.append(error.text) + self.errors.append(UNDEFINED_RETURN_TYPE.replace('%s', node.type, 1).replace('%s', node.id, 1)) return_type = ErrorType() params = [] @@ -101,11 +113,11 @@ def visit(self, node): self.errors.append(NOT_SELF_TYPE.replace('%s', var.id, 1).replace('%s', node.id, 1).replace('%s', self.current_type.name, 1)) param_type = ErrorType() except SemanticError as error: - self.errors.append(error.text) + self.errors.append(UNDEFINED_PARAM_TYPE.replace('%s', var.type, 1).replace('%s', var.id, 1)) param_type = ErrorType() if var.id in params: - self.errors.append(IDENTIFIER_USED.replace('%s', var.id, 1).replace('%s', node.id, 1).replace('%s', self.current_type.name, 1)) + self.errors.append(IDENTIFIER_USED.replace('%s', var.id, 1)) params.append(var.id) types.append(param_type) @@ -113,4 +125,4 @@ def visit(self, node): try: self.current_type.define_method(node.id, params, types, return_type) except SemanticError as error: - self.errors.append(error.text) \ No newline at end of file + self.errors.append(METHOD_REDEFINED.replace('%s', node.id, 1)) \ No newline at end of file diff --git a/src/tours/TypeChecker.py b/src/tours/TypeChecker.py index 84ea1dcba..59dde2950 100644 --- a/src/tours/TypeChecker.py +++ b/src/tours/TypeChecker.py @@ -1,26 +1,40 @@ from parsing.ast import * -from .utils import find_parent_type, InferType +from .utils import find_parent_type, InferType, is_base_class from cmp.semantic import Scope, SemanticError from cmp.semantic import Type, ObjectType, IntType, StringType, BoolType, AutoType, ErrorType, SelfType, IOType import cmp.visitor as visitor -SELF_IS_READONLY = "Variable 'self' is read-only." +SELF_IS_READONLY = "SemanticError: Cannot assign to 'self'." +SELF_IS_READONLY_LET = "SemanticError: 'self' cannot be bound in a 'let' expression." +SELF_IS_READONLY_PARAM = "SemanticError: 'self' cannot be the name of a formal parameter." +SELF_IS_READONLY_ATTRIBUTE = "SemanticError: 'self' cannot be the name of an attribute." LOCAL_ALREADY_DEFINED = "Variable '%s' is already defined in method '%s'." INCOMPATIBLE_ATTRIBUTE_TYPE = "TypeError: Inferred type %s of initialization of attribute %s does not conform to declared type %s." +INCOMPATIBLE_VARIABLE_TYPE = "TypeError: Inferred type %s of initialization of %s does not conform to identifier's declared type %s." INCOMPATIBLE_RET_FUNC_TYPE = "TypeError: Inferred return type %s of method %s does not conform to declared return type %s." INCOMPATIBLE_DISPATCH_TYPE = "TypeError: In call of method %s, type %s of parameter %s does not conform to declared type %s." INCOMPATIBLE_DISPATCH_DEC_TYPE = "TypeError: Expression type %s does not conform to declared static dispatch type %s." VARIABLE_NOT_DEFINED = "NameError: Undeclared identifier %s." INVALID_OPERATION = "TypeError: non-Int arguments: %s %s %s" +INVALID_BASIC_COMPARISON = "TypeError: Illegal comparison with a basic type." OPERATION_NOT_DEFINED = "Operation '%s' is not defined for type '%s'." UNARY_OPERATION_NOT_DEFINED = "TypeError: Argument of '%s' has type %s instead of %s." -PREDICATE_OPERATIONS = "TypeError: Predicate of '%s' does not have type Bool." +PREDICATE_OPERATIONS = "TypeError: %s condition does not have type Bool." TYPE_VOID = "The expression can not be void." ATTRIBUTE_NOT_INFERED = "Can not infered attribute '%s' in class '%s'." RETURN_TYPE_METHOD = "Can not infered the return type of the method '%s' in class '%s'." VAR_TYPE_NOT_INFERED = "Can not infered the type of the '%s' '%s' in method '%s' in class '%s'." WRONG_NUMBER_ARGUMENTS = "SemanticError: Method %s called with wrong number of arguments." +DUPLICATE_BRANCH = "SemanticError: Duplicate branch %s in case statement." +CASE_TYPE_UNDEFINED = "TypeError: Class %s of case branch is undefined." +UNDEFINED_METHOD = "AttributeError: Dispatch to undefined method %s." +PARENT_ATTRIBUTE_REDEFINED = "SemanticError: Attribute %s is an attribute of an inherited class." +UNDEFINED_VARIABLE_TYPE = "TypeError: Class %s of let-bound identifier %s is undefined." +METHOD_REDEFINED_PARAM = "SemanticError: In redefined method %s, parameter type %s is different from original type %s." +METHOD_REDEFINED_RETURN = "SemanticError: In redefined method %s, return type %s is different from original return type %s." +METHOD_REDEFINED_NPARAM = "SemanticError: Incompatible number of formal parameters in redefined method %s." +UNDEFINED_NEW_TYPE = "TypeError: 'new' used with undefined class %s." class TypeChecker: @@ -64,10 +78,13 @@ def visit(self, node, scope): if parent is not None: try: parent.get_attribute(node.id) - self.errors.append(f'Attribute "{node.id}" is already defined in {parent.name}.') + self.errors.append(PARENT_ATTRIBUTE_REDEFINED.replace('%s', node.id, 1)) except SemanticError: pass - + + if node.id == "self": + self.errors.append(SELF_IS_READONLY_ATTRIBUTE) + node_type = self.current_type.get_attribute(node.id).type if node_type == SelfType(): node_type = self.current_type @@ -95,13 +112,23 @@ def visit(self, node, scope): if parent is not None: try: method = parent.get_method(node.id) - if method != self.current_method: - self.errors.append(f"Method '{self.current_method.name}' already defined in '{parent.name}' with a different signature.") + if method.return_type != self.current_method.return_type: + self.errors.append(METHOD_REDEFINED_RETURN.replace('%s', node.id, 1).replace('%s', self.current_method.return_type.name, 1).replace('%s', method.return_type.name, 1)) + if len(self.current_method.param_types) != len(method.param_types): + self.errors.append(METHOD_REDEFINED_NPARAM.replace('%s', node.id, 1)) + else: + for type_child, type_parent in zip(self.current_method.param_types, method.param_types): + if type_child != type_parent: + self.errors.append(METHOD_REDEFINED_PARAM.replace('%s', node.id, 1).replace('%s', type_child.name, 1).replace('%s', type_parent.name, 1)) + except SemanticError: pass for name, typex in zip(self.current_method.param_names, self.current_method.param_types): - child.define_variable(name, typex) + if name != "self": + child.define_variable(name, typex) + else: + self.errors.append(SELF_IS_READONLY_PARAM) self.visit(node.expr, child) @@ -167,8 +194,8 @@ def visit(self, node, scope): ret_type = typee except SemanticError as error: - self.errors.append(error.text) - ret_type = ErrorType() + self.errors.append(UNDEFINED_METHOD.replace('%s',node.id)) + ret_type = ErrorType() node.computed_type = ret_type @@ -183,7 +210,7 @@ def visit(self, node, scope): if predicate_type != AutoType() and predicate_type.conforms_to(BoolType()): node.computed_type = find_parent_type(self.current_type, node.then.computed_type, node.elsex.computed_type) elif predicate_type != AutoType(): - self.errors.append(PREDICATE_OPERATIONS.replace('%s', "if", 1)) + self.errors.append(PREDICATE_OPERATIONS.replace('%s', "If", 1)) node.computed_type = ErrorType() else: InferType(self.current_type, predicate_type, BoolType()) @@ -200,12 +227,12 @@ def visit(self, node, scope): @visitor.when(VarDeclarationNode) def visit(self, node, scope): if node.id == 'self': - self.errors.append(SELF_IS_READONLY) + self.errors.append(SELF_IS_READONLY_LET) try: var_type = self.context.get_type(node.type) except SemanticError as error: - self.errors.append(str(error)) + self.errors.append(UNDEFINED_VARIABLE_TYPE.replace('%s', node.type, 1).replace('%s', node.id, 1)) var_type = ErrorType() if node.expr is not None: @@ -213,7 +240,7 @@ def visit(self, node, scope): expresion_type = node.expr.computed_type if node.expr.computed_type != SelfType() else self.current_type if expresion_type != AutoType() and var_type != AutoType() and not expresion_type.conforms_to(var_type): - self.errors.append(INCOMPATIBLE_TYPES.replace('%s', expresion_type.name, 1).replace('%s', var_type.name, 1)) + self.errors.append(INCOMPATIBLE_VARIABLE_TYPE.replace('%s', expresion_type.name, 1).replace('%s', node.id, 1).replace('%s', var_type.name, 1)) elif var_type == AutoType() and expresion_type != AutoType(): InferType(self.current_type, var_type, expresion_type) elif var_type != AutoType() and expresion_type == AutoType(): @@ -244,15 +271,20 @@ def visit(self, node, scope): @visitor.when(CaseNode) def visit(self, node, scope): self.visit(node.expr, scope) + + types_computed = [] types = [] - for attr in node.cases: self.visit(attr, scope) - types.append(attr.computed_type) + types_computed.append(attr.computed_type) + if attr.type in types: + self.errors.append(DUPLICATE_BRANCH.replace('%s', attr.type, 1)) + else: + types.append(attr.type) - typex = types[0] - for i in range(1,len(types)): - typex = find_parent_type(self.current_type, typex, types[i]) + typex = types_computed[0] + for i in range(1,len(types_computed)): + typex = find_parent_type(self.current_type, typex, types_computed[i]) node.computed_type = typex @visitor.when(CaseAttrNode) @@ -263,7 +295,7 @@ def visit(self, node, scope): self.errors.append("The type of a case attribute can not be AUTO_TYPE.") typex = ErrorType() except SemanticError as error: - self.errors.append(error.text) + self.errors.append(CASE_TYPE_UNDEFINED.replace('%s', node.type, 1)) typex = ErrorType() child_scope = scope.create_child(scope.class_name, scope.method_name) @@ -282,7 +314,7 @@ def visit(self, node, scope): node.computed_type = expresion_type - if node.id == 'self': + if node.id.lex == 'self': self.errors.append(SELF_IS_READONLY) node.computed_type = ErrorType() elif var_type != AutoType() and expresion_type != AutoType() and not expresion_type.conforms_to(var_type): @@ -334,8 +366,11 @@ def visit(self, node, scope): self.errors.append(OPERATION_NOT_DEFINED.replace('%s', "equals", 1).replace('%s', left_type.name, 1)) node.computed_type = ErrorType() else: - self.errors.append(INVALID_OPERATION.replace('%s', left_type.name, 1).replace('%s', "=", 1).replace('%s', right_type.name, 1)) - node.computed_type = ErrorType() + if is_base_class(left_type.name) or is_base_class(right_type.name): + self.errors.append(INVALID_BASIC_COMPARISON) + node.computed_type = ErrorType() + else: + node.computed_type = BoolType() else: if left_type == AutoType() and right_type == AutoType(): @@ -440,7 +475,7 @@ def visit(self, node, scope): self.errors.append('Class AUTO_TYPE can not be instantiated.') var_type = ErrorType() except SemanticError as error: - self.errors.append(error.text) + self.errors.append(UNDEFINED_NEW_TYPE.replace('%s', node.lex, 1)) var_type = ErrorType() node.computed_type = var_type \ No newline at end of file diff --git a/src/tours/TypeCollector.py b/src/tours/TypeCollector.py index 03065b55c..9393afe22 100644 --- a/src/tours/TypeCollector.py +++ b/src/tours/TypeCollector.py @@ -2,6 +2,7 @@ from cmp.semantic import SemanticError, Context from cmp.semantic import ObjectType, StringType, IntType, AutoType, BoolType, IOType, SelfType import cmp.visitor as visitor +from .utils import is_base_class BASIC_CLASS_REDEFINED = 'SemanticError: Redefinition of basic class %s.' @@ -46,10 +47,6 @@ def visit(self, node): self.context.create_type(node.id) -def is_base_class(id): - return id in ['Object', 'IO', 'Int', 'String', 'Bool'] - - def define_base_classes(context): object_type = context.types['Object'] = ObjectType() io_type = context.types['IO'] = IOType() diff --git a/src/tours/utils.py b/src/tours/utils.py index 8c9e4baa0..8d8e5bec7 100644 --- a/src/tours/utils.py +++ b/src/tours/utils.py @@ -79,4 +79,8 @@ def InferType(current_type, auto_var, not_auto_var): auto_var.infered_type = not_auto_var return True - return False \ No newline at end of file + return False + + +def is_base_class(id): + return id in ['Object', 'IO', 'Int', 'String', 'Bool'] \ No newline at end of file From 3bd33f432901c7caaf5c057255eea1d208bf1033 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karla=20Olivera=20Hern=C3=A1ndez?= Date: Sun, 20 Feb 2022 21:50:35 -0500 Subject: [PATCH 06/81] Fix errors in semantic --- src/tours/TypeBuilder.py | 13 ++++++------- src/tours/TypeChecker.py | 9 ++------- src/tours/TypeCollector.py | 6 +++--- 3 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/tours/TypeBuilder.py b/src/tours/TypeBuilder.py index 4d5eb4ebe..0bdab1c29 100644 --- a/src/tours/TypeBuilder.py +++ b/src/tours/TypeBuilder.py @@ -4,13 +4,12 @@ import cmp.visitor as visitor -CANNOT_INHERIT = 'SemanticError: Class %s cannot inherit class %s.' -MAIN_NOT_DEFINED = 'Method "main" must be defined in "Main" class.' -MAIN_NOT_HERITABLE = 'Class "Main" is not heritable.' -CYCLES_IN_CLASES = 'SemanticError: Class %s, or an ancestor of %s, is involved in an inheritance cycle.' -NOT_SELF_TYPE = 'The type of the parameter "%s" can not be SELF_TYPE in method "%s" in class "%s".' -SELF_IS_READONLY = "Variable 'self' is read-only." -IDENTIFIER_USED = 'SemanticError: Formal parameter %s is multiply defined.' +CANNOT_INHERIT = "SemanticError: Class %s cannot inherit class %s." +MAIN_NOT_DEFINED = "SemanticError: Method main must be defined in Main class." +MAIN_NOT_HERITABLE = "SemanticError: Class Main is not heritable." +CYCLES_IN_CLASES = "SemanticError: Class %s, or an ancestor of %s, is involved in an inheritance cycle." +NOT_SELF_TYPE = "TypeError: The type of the parameter %s can not be SELF_TYPE in method %s in class %s." +IDENTIFIER_USED = "SemanticError: Formal parameter %s is multiply defined." ATTRIBUTE_REDEFINED = "SemanticError: Attribute %s is multiply defined in class." METHOD_REDEFINED = "SemanticError: Method %s is multiply defined in class." UNDEFINED_ATTRIBUTE_TYPE ="TypeError: Class %s of attribute %s is undefined." diff --git a/src/tours/TypeChecker.py b/src/tours/TypeChecker.py index 59dde2950..be4d9eb75 100644 --- a/src/tours/TypeChecker.py +++ b/src/tours/TypeChecker.py @@ -9,7 +9,6 @@ SELF_IS_READONLY_LET = "SemanticError: 'self' cannot be bound in a 'let' expression." SELF_IS_READONLY_PARAM = "SemanticError: 'self' cannot be the name of a formal parameter." SELF_IS_READONLY_ATTRIBUTE = "SemanticError: 'self' cannot be the name of an attribute." -LOCAL_ALREADY_DEFINED = "Variable '%s' is already defined in method '%s'." INCOMPATIBLE_ATTRIBUTE_TYPE = "TypeError: Inferred type %s of initialization of attribute %s does not conform to declared type %s." INCOMPATIBLE_VARIABLE_TYPE = "TypeError: Inferred type %s of initialization of %s does not conform to identifier's declared type %s." INCOMPATIBLE_RET_FUNC_TYPE = "TypeError: Inferred return type %s of method %s does not conform to declared return type %s." @@ -18,13 +17,9 @@ VARIABLE_NOT_DEFINED = "NameError: Undeclared identifier %s." INVALID_OPERATION = "TypeError: non-Int arguments: %s %s %s" INVALID_BASIC_COMPARISON = "TypeError: Illegal comparison with a basic type." -OPERATION_NOT_DEFINED = "Operation '%s' is not defined for type '%s'." +OPERATION_NOT_DEFINED = "TypeError: Operation '%s' is not defined for type '%s'." UNARY_OPERATION_NOT_DEFINED = "TypeError: Argument of '%s' has type %s instead of %s." PREDICATE_OPERATIONS = "TypeError: %s condition does not have type Bool." -TYPE_VOID = "The expression can not be void." -ATTRIBUTE_NOT_INFERED = "Can not infered attribute '%s' in class '%s'." -RETURN_TYPE_METHOD = "Can not infered the return type of the method '%s' in class '%s'." -VAR_TYPE_NOT_INFERED = "Can not infered the type of the '%s' '%s' in method '%s' in class '%s'." WRONG_NUMBER_ARGUMENTS = "SemanticError: Method %s called with wrong number of arguments." DUPLICATE_BRANCH = "SemanticError: Duplicate branch %s in case statement." CASE_TYPE_UNDEFINED = "TypeError: Class %s of case branch is undefined." @@ -318,7 +313,7 @@ def visit(self, node, scope): self.errors.append(SELF_IS_READONLY) node.computed_type = ErrorType() elif var_type != AutoType() and expresion_type != AutoType() and not expresion_type.conforms_to(var_type): - self.errors.append(INCOMPATIBLE_TYPES.replace('%s', expresion_type.name, 1).replace('%s', var_type.name, 1)) + self.errors.append(INCOMPATIBLE_VARIABLE_TYPE.replace('%s', expresion_type.name, 1).replace('%s', node.id.lex).replace('%s', var_type.name, 1)) node.computed_type = ErrorType() elif var_type == AutoType() and expresion_type != AutoType(): InferType(self.current_type, var_type, expresion_type) diff --git a/src/tours/TypeCollector.py b/src/tours/TypeCollector.py index 9393afe22..6c00c30f8 100644 --- a/src/tours/TypeCollector.py +++ b/src/tours/TypeCollector.py @@ -5,9 +5,9 @@ from .utils import is_base_class -BASIC_CLASS_REDEFINED = 'SemanticError: Redefinition of basic class %s.' -CLASS_REDEFINED = 'SemanticError: Classes may not be redefined' -MAIN_NOT_DEFINED = 'Class Main must be defined.' +BASIC_CLASS_REDEFINED = "SemanticError: Redefinition of basic class %s." +CLASS_REDEFINED = "SemanticError: Classes may not be redefined" +MAIN_NOT_DEFINED = "SemanticError: Class Main must be defined." class TypeCollector(object): From ff911c7976800eba0045104e93295e13267900a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karla=20Olivera=20Hern=C3=A1ndez?= Date: Mon, 21 Feb 2022 09:09:28 -0500 Subject: [PATCH 07/81] Clean type inferencer logic --- src/cmp/semantic.py | 2 +- src/cool.py | 21 +--- src/main.py | 67 ------------ src/tours/TypeBuilder.py | 4 +- src/tours/TypeChecker.py | 143 ++++++------------------- src/tours/TypeCollector.py | 3 +- src/tours/TypeInferencer.py | 201 ------------------------------------ src/tours/utils.py | 54 +--------- 8 files changed, 39 insertions(+), 456 deletions(-) delete mode 100644 src/main.py delete mode 100644 src/tours/TypeInferencer.py diff --git a/src/cmp/semantic.py b/src/cmp/semantic.py index a408e0fa9..4d9748406 100644 --- a/src/cmp/semantic.py +++ b/src/cmp/semantic.py @@ -306,4 +306,4 @@ def child_find_variable(self, vname): return self else: for child in self.children: - child.child_find_variable(vname) + child.child_find_variable(vname) \ No newline at end of file diff --git a/src/cool.py b/src/cool.py index a4e7372a8..643241064 100644 --- a/src/cool.py +++ b/src/cool.py @@ -4,8 +4,7 @@ from tours.TypeCollector import TypeCollector from tours.TypeBuilder import TypeBuilder from tours.TypeChecker import TypeChecker -from tours.TypeInferencer import TypeInferencer -from tours.utils import AnalizeScopeAutoTypes, AnalizeClassAutoTypes + input_file = sys.argv[1] with open(input_file, 'r') as f: @@ -40,24 +39,6 @@ checker = TypeChecker(context, errors) scope = checker.visit(ast) -# # Infering Types -# while True: -# inferencer = TypeInferencer(context, errors) -# if not inferencer.visit(ast): -# break - -# inferences = [] -# for declaration in ast.declarations: -# AnalizeClassAutoTypes(context.get_type(declaration.id), errors, inferences) -# AnalizeScopeAutoTypes(scope, errors, inferences) - -# print("Infered Types:") -# if inferences: -# for inf in inferences: -# print(inf) -# else: -# print("There wasn't any variable type infered.") - if errors: for e in errors: print(e) diff --git a/src/main.py b/src/main.py deleted file mode 100644 index dbb44b9de..000000000 --- a/src/main.py +++ /dev/null @@ -1,67 +0,0 @@ - -from parsing.parser import COOL_Parser -from parsing.lexer import COOL_Lexer -from tours.TypeCollector import TypeCollector -from tours.TypeBuilder import TypeBuilder -from tours.TypeChecker import TypeChecker -from tours.TypeInferencer import TypeInferencer -from tours.utils import AnalizeScopeAutoTypes, AnalizeClassAutoTypes - -input_file = "test.txt" -with open(input_file, 'r') as f: - s = f.read() - -lexer = COOL_Lexer() -lexer.build() - -tokens = list(lexer.tokenize(s)) -if lexer.errors: - for e in lexer.errors: - print(e) - #exit(1) - -parser = COOL_Parser() -ast, errors = parser.parse(s) -if errors: - for e in errors: - print(e) - -# Collecting Types -collector = TypeCollector() -collector.visit(ast) -context = collector.context -errors = collector.errors - -# Building Types -builder = TypeBuilder(context, errors) -builder.visit(ast) - -# Checking Types -checker = TypeChecker(context, errors) -scope = checker.visit(ast) - -# Infering Types -while True: - inferencer = TypeInferencer(context, errors) - if not inferencer.visit(ast): - break - -inferences = [] -for declaration in ast.declarations: - AnalizeClassAutoTypes(context.get_type(declaration.id), errors, inferences) -AnalizeScopeAutoTypes(scope, errors, inferences) - -print("Infered Types:") -if inferences: - for inf in inferences: - print(inf) -else: - print("There wasn't any variable type infered.") - -# Print Errors -print("Errors:") -if errors: - for error in errors: - print(error) -else: - print("There wasn't any error in the code entered.") diff --git a/src/tours/TypeBuilder.py b/src/tours/TypeBuilder.py index 0bdab1c29..555973ea5 100644 --- a/src/tours/TypeBuilder.py +++ b/src/tours/TypeBuilder.py @@ -1,6 +1,6 @@ from parsing.ast import * from cmp.semantic import SemanticError -from cmp.semantic import ErrorType, StringType, IntType, AutoType, BoolType, ObjectType, SelfType +from cmp.semantic import ErrorType, StringType, IntType, BoolType, ObjectType, SelfType import cmp.visitor as visitor @@ -53,7 +53,7 @@ def visit(self, node): if node.parent is not None: try: parent = self.context.get_type(node.parent) - if parent == BoolType() or parent == IntType() or parent == StringType() or parent == SelfType() or parent == AutoType(): + if parent == BoolType() or parent == IntType() or parent == StringType() or parent == SelfType(): self.errors.append(CANNOT_INHERIT.replace('%s', node.id, 1).replace('%s', parent.name, 1)) parent = ErrorType() else: diff --git a/src/tours/TypeChecker.py b/src/tours/TypeChecker.py index be4d9eb75..3268eb3b3 100644 --- a/src/tours/TypeChecker.py +++ b/src/tours/TypeChecker.py @@ -1,7 +1,7 @@ from parsing.ast import * -from .utils import find_parent_type, InferType, is_base_class +from .utils import find_parent_type, is_base_class from cmp.semantic import Scope, SemanticError -from cmp.semantic import Type, ObjectType, IntType, StringType, BoolType, AutoType, ErrorType, SelfType, IOType +from cmp.semantic import ObjectType, IntType, StringType, BoolType, ErrorType, SelfType import cmp.visitor as visitor @@ -90,12 +90,8 @@ def visit(self, node, scope): if expr_type == SelfType(): expr_type = self.current_type - if node_type != AutoType() and expr_type != AutoType() and not expr_type.conforms_to(node_type): + if not expr_type.conforms_to(node_type): self.errors.append(INCOMPATIBLE_ATTRIBUTE_TYPE.replace('%s', expr_type.name, 1).replace('%s', node.id, 1).replace('%s', node_type.name, 1)) - elif node_type == AutoType() and expr_type != AutoType(): - InferType(self.current_type, node_type, expr_type) - elif node_type != AutoType() and expr_type == AutoType(): - InferType(self.current_type, expr_type, node_type) @visitor.when(FuncDeclarationNode) def visit(self, node, scope): @@ -130,13 +126,8 @@ def visit(self, node, scope): return_type_exp = node.expr.computed_type if node.expr.computed_type != SelfType() else self.current_type return_type_met = self.current_method.return_type if self.current_method.return_type != SelfType() else self.current_type - if return_type_met != AutoType() and return_type_exp != AutoType(): - if not return_type_exp.conforms_to(return_type_met): - self.errors.append(INCOMPATIBLE_RET_FUNC_TYPE.replace('%s', return_type_exp.name, 1).replace('%s',node.id , 1).replace('%s',return_type_met.name , 1)) - elif return_type_met == AutoType() and return_type_exp != AutoType(): - InferType(self.current_type, return_type_met, return_type_exp) - elif return_type_met != AutoType() and return_type_exp == AutoType(): - InferType(self.current_type, return_type_exp, return_type_met) + if not return_type_exp.conforms_to(return_type_met): + self.errors.append(INCOMPATIBLE_RET_FUNC_TYPE.replace('%s', return_type_exp.name, 1).replace('%s',node.id , 1).replace('%s',return_type_met.name , 1)) @visitor.when(BlockNode) def visit(self, node, scope): @@ -172,14 +163,9 @@ def visit(self, node, scope): self.visit(arg, scope) arg_type = arg.computed_type if arg.computed_type != SelfType() else self.current_type - if param_type != AutoType() and arg_type != AutoType() and not arg_type.conforms_to(param_type): + if not arg_type.conforms_to(param_type): self.errors.append(INCOMPATIBLE_DISPATCH_TYPE.replace('%s', node.id, 1).replace('%s', arg_type.name, 1).replace('%s', param_name, 1).replace('%s', param_type.name, 1)) typee = ErrorType() - elif param_type == AutoType() and arg_type != AutoType(): - InferType(self.current_type, param_type, arg_type) - - elif param_type != AutoType() and arg_type == AutoType(): - InferType(self.current_type, arg_type, param_type) else: self.errors.append(WRONG_NUMBER_ARGUMENTS.replace('%s', method.name, 1)) @@ -202,13 +188,11 @@ def visit(self, node, scope): self.visit(node.then, scope) self.visit(node.elsex, scope) - if predicate_type != AutoType() and predicate_type.conforms_to(BoolType()): + if predicate_type.conforms_to(BoolType()): node.computed_type = find_parent_type(self.current_type, node.then.computed_type, node.elsex.computed_type) - elif predicate_type != AutoType(): + else: self.errors.append(PREDICATE_OPERATIONS.replace('%s', "If", 1)) node.computed_type = ErrorType() - else: - InferType(self.current_type, predicate_type, BoolType()) @visitor.when(LetNode) def visit(self, node, scope): @@ -234,12 +218,8 @@ def visit(self, node, scope): self.visit(node.expr, scope) expresion_type = node.expr.computed_type if node.expr.computed_type != SelfType() else self.current_type - if expresion_type != AutoType() and var_type != AutoType() and not expresion_type.conforms_to(var_type): + if not expresion_type.conforms_to(var_type): self.errors.append(INCOMPATIBLE_VARIABLE_TYPE.replace('%s', expresion_type.name, 1).replace('%s', node.id, 1).replace('%s', var_type.name, 1)) - elif var_type == AutoType() and expresion_type != AutoType(): - InferType(self.current_type, var_type, expresion_type) - elif var_type != AutoType() and expresion_type == AutoType(): - InferType(self.current_type, expresion_type, var_type) if scope.is_local(node.id): scope.remove_variable(node.id) @@ -254,14 +234,11 @@ def visit(self, node, scope): predicate_type = node.predicate.computed_type self.visit(node.body, scope) - if predicate_type != AutoType() and predicate_type.conforms_to(BoolType()): + if predicate_type.conforms_to(BoolType()): node.computed_type = ObjectType() - elif predicate_type != AutoType(): + else: self.errors.append(PREDICATE_OPERATIONS.replace('%s',"Loop", 1)) node.computed_type = ErrorType() - else: - InferType(self.current_type, predicate_type, BoolType()) - node.computed_type = ObjectType() @visitor.when(CaseNode) def visit(self, node, scope): @@ -286,9 +263,6 @@ def visit(self, node, scope): def visit(self, node, scope): try: typex = self.context.get_type(node.type) - if typex == AutoType(): - self.errors.append("The type of a case attribute can not be AUTO_TYPE.") - typex = ErrorType() except SemanticError as error: self.errors.append(CASE_TYPE_UNDEFINED.replace('%s', node.type, 1)) typex = ErrorType() @@ -312,13 +286,9 @@ def visit(self, node, scope): if node.id.lex == 'self': self.errors.append(SELF_IS_READONLY) node.computed_type = ErrorType() - elif var_type != AutoType() and expresion_type != AutoType() and not expresion_type.conforms_to(var_type): + elif not expresion_type.conforms_to(var_type): self.errors.append(INCOMPATIBLE_VARIABLE_TYPE.replace('%s', expresion_type.name, 1).replace('%s', node.id.lex).replace('%s', var_type.name, 1)) node.computed_type = ErrorType() - elif var_type == AutoType() and expresion_type != AutoType(): - InferType(self.current_type, var_type, expresion_type) - elif var_type != AutoType() and expresion_type == AutoType(): - InferType(self.current_type, expresion_type, var_type) @visitor.when(BinaryNode) def visit(self, node, scope): @@ -339,82 +309,40 @@ def visit(self, node, scope): operation = "<=" elif isinstance(node, LessNode): operation = "<" - - if left_type != AutoType() and right_type != AutoType(): - if not isinstance(node, EqualsNode): - if left_type == IntType() and right_type == IntType(): - if isinstance(node, ElessNode) or isinstance(node, LessNode): - node.computed_type = BoolType() - else: - node.computed_type = IntType() + + if not isinstance(node, EqualsNode): + if left_type == IntType() and right_type == IntType(): + if isinstance(node, ElessNode) or isinstance(node, LessNode): + node.computed_type = BoolType() else: - if(left_type == right_type): - self.errors.append(OPERATION_NOT_DEFINED.replace('%s', operation, 1).replace('%s', left_type.name, 1)) - else: - self.errors.append(INVALID_OPERATION.replace('%s', left_type.name, 1).replace('%s', operation, 1).replace('%s', right_type.name, 1)) - node.computed_type = ErrorType() + node.computed_type = IntType() else: - if left_type == right_type: - if left_type == StringType() or left_type == IntType() or left_type == BoolType(): - node.computed_type = BoolType() - else: - self.errors.append(OPERATION_NOT_DEFINED.replace('%s', "equals", 1).replace('%s', left_type.name, 1)) - node.computed_type = ErrorType() + if(left_type == right_type): + self.errors.append(OPERATION_NOT_DEFINED.replace('%s', operation, 1).replace('%s', left_type.name, 1)) else: - if is_base_class(left_type.name) or is_base_class(right_type.name): - self.errors.append(INVALID_BASIC_COMPARISON) - node.computed_type = ErrorType() - else: - node.computed_type = BoolType() - + self.errors.append(INVALID_OPERATION.replace('%s', left_type.name, 1).replace('%s', operation, 1).replace('%s', right_type.name, 1)) + node.computed_type = ErrorType() else: - if left_type == AutoType() and right_type == AutoType(): - if isinstance(node, ElessNode) or isinstance(node, LessNode) or isinstance(node, EqualsNode): + if left_type == right_type: + if left_type == StringType() or left_type == IntType() or left_type == BoolType(): node.computed_type = BoolType() else: - node.computed_type = IntType() - - if not isinstance(node, EqualsNode): - InferType(self.current_type, left_type, IntType()) - InferType(self.current_type, right_type, IntType()) - + self.errors.append(OPERATION_NOT_DEFINED.replace('%s', "equals", 1).replace('%s', left_type.name, 1)) + node.computed_type = ErrorType() else: - if left_type == AutoType(): - auto_node = node.left - auto_var = left_type - not_auto_var = right_type - else: - auto_node = node.right - auto_var = right_type - not_auto_var = left_type - - if not isinstance(node, EqualsNode): - if not_auto_var == IntType(): - if isinstance(node, ElessNode) or isinstance(node, LessNode): - node.computed_type = BoolType() - else: - node.computed_type = IntType() - else: - self.errors.append(OPERATION_NOT_DEFINED.replace('%s', operation, 1).replace('%s', not_auto_var.name, 1)) - node.computed_type = ErrorType() - InferType(self.current_type, auto_var, IntType()) + if is_base_class(left_type.name) or is_base_class(right_type.name): + self.errors.append(INVALID_BASIC_COMPARISON) + node.computed_type = ErrorType() else: - if not_auto_var == StringType() or not_auto_var == IntType() or not_auto_var == BoolType(): - node.computed_type = BoolType() - InferType(self.current_type, auto_var, not_auto_var) - else: - self.errors.append(OPERATION_NOT_DEFINED.replace('%s', "equals", 1).replace('%s', not_auto_var.name, 1)) - node.computed_type = ErrorType() - + node.computed_type = BoolType() + @visitor.when(PrimeNode) def visit(self, node, scope): self.visit(node.expr, scope) type_expr = node.expr.computed_type - if type_expr == IntType() or type_expr == AutoType(): + if type_expr == IntType(): node.computed_type = IntType() - if type_expr == AutoType(): - InferType(self.current_type, type_expr, IntType()) else: self.errors.append(UNARY_OPERATION_NOT_DEFINED.replace('%s', "~", 1).replace('%s', type_expr.name, 1).replace('%s', "Int", 1)) node.computed_type = ErrorType() @@ -424,10 +352,8 @@ def visit(self, node, scope): self.visit(node.expr, scope) type_expr = node.expr.computed_type - if type_expr == BoolType() or type_expr == AutoType(): + if type_expr == BoolType(): node.computed_type = BoolType() - if type_expr == AutoType(): - InferType(self.current_type, type_expr, BoolType()) else: self.errors.append(UNARY_OPERATION_NOT_DEFINED.replace('%s', "not", 1).replace('%s', type_expr.name, 1).replace('%s', "Bool", 1)) node.computed_type = ErrorType() @@ -466,9 +392,6 @@ def visit(self, node, scope): def visit(self, node, scope): try: var_type = self.context.get_type(node.lex) - if var_type == AutoType(): - self.errors.append('Class AUTO_TYPE can not be instantiated.') - var_type = ErrorType() except SemanticError as error: self.errors.append(UNDEFINED_NEW_TYPE.replace('%s', node.lex, 1)) var_type = ErrorType() diff --git a/src/tours/TypeCollector.py b/src/tours/TypeCollector.py index 6c00c30f8..2959d1124 100644 --- a/src/tours/TypeCollector.py +++ b/src/tours/TypeCollector.py @@ -1,6 +1,6 @@ from parsing.ast import * from cmp.semantic import SemanticError, Context -from cmp.semantic import ObjectType, StringType, IntType, AutoType, BoolType, IOType, SelfType +from cmp.semantic import ObjectType, StringType, IntType, BoolType, IOType, SelfType import cmp.visitor as visitor from .utils import is_base_class @@ -53,7 +53,6 @@ def define_base_classes(context): int_type = context.types['Int'] = IntType() string_type = context.types['String'] = StringType() bool_type = context.types['Bool'] = BoolType() - auto_type = context.types['AUTO_TYPE'] = AutoType() self_type = context.types['SELF_TYPE'] = SelfType() object_type.define_method('abort', [], [], object_type) diff --git a/src/tours/TypeInferencer.py b/src/tours/TypeInferencer.py deleted file mode 100644 index fde251b75..000000000 --- a/src/tours/TypeInferencer.py +++ /dev/null @@ -1,201 +0,0 @@ -from parsing.ast import * -from .utils import InferType -from cmp.semantic import Scope, SemanticError -from cmp.semantic import Type, ObjectType, IntType, StringType, BoolType, AutoType, ErrorType, SelfType, IOType -import cmp.visitor as visitor - - -class TypeInferencer: - def __init__(self, context=None, errors=[]): - self.context = context - self.errors = errors - self.current_type = None - self.current_method = None - self.change = False - - @visitor.on('node') - def visit(self, node): - pass - - @visitor.when(ProgramNode) - def visit(self, node): - for dec in node.declarations: - self.visit(dec) - return self.change - - @visitor.when(ClassDeclarationNode) - def visit(self, node): - self.current_type = self.context.get_type(node.id) - - for feature in node.features: - if isinstance(feature, AttrDeclarationNode): - if self.current_type.get_attribute(feature.id).type.name == feature.type: - self.visit(feature) - elif feature.expr is not None: - self.visit(feature.expr) - else: - self.visit(feature) - - @visitor.when(AttrDeclarationNode) - def visit(self, node): - node_type = self.current_type.get_attribute(node.id).type - - if node.expr is not None: - self.visit(node.expr) - expr_type = node.expr.computed_type - - if node_type == AutoType() and expr_type == AutoType(): - if expr_type.infered_type is not None: - self.change |= InferType(self.current_type, node_type, expr_type.infered_type) - if node_type.infered_type is not None: - self.change |= InferType(self.current_type, expr_type, node_type.infered_type) - - @visitor.when(FuncDeclarationNode) - def visit(self, node): - self.current_method = self.current_type.get_method(node.id) - self.visit(node.expr) - - return_type_exp = node.expr.computed_type - return_type_met = self.current_method.return_type - - if return_type_met == AutoType() and return_type_exp == AutoType(): - if return_type_exp.infered_type is not None: - self.change |= InferType(self.current_type, return_type_met, return_type_exp.infered_type) - if return_type_met.infered_type is not None: - self.change |= InferType(self.current_type, return_type_exp, return_type_met.infered_type) - - @visitor.when(BlockNode) - def visit(self,node): - for expr in node.expr_lis: - self.visit(expr) - - @visitor.when(DispatchNode) - def visit(self, node): - if node.expr is not None: - self.visit(node.expr) - - if node.computed_type != ErrorType(): - obj_type = node.expr.computed_type - if node.type is not None: - obj_type = self.context.get_type(node.type) - else: - obj_type = self.current_type - - try: - method = obj_type.get_method(node.id) - if (node.arg is None and method.arg is None) or (len(node.arg) == len(method.param_types)): - if node.arg is not None: - for arg, param_type in zip(node.arg, method.param_types): - self.visit(arg) - arg_type = arg.computed_type - if param_type == AutoType() and arg_type == AutoType(): - if arg_type.infered_type is not None: - self.change |= InferType(self.current_type, param_type, arg_type.infered_type) - if param_type.infered_type is not None: - self.change |= InferType(self.current_type, arg_type, param_type.infered_type) - except: - pass - - @visitor.when(ConditionalNode) - def visit(self, node): - self.visit(node.predicate) - self.visit(node.then) - self.visit(node.elsex) - - @visitor.when(LetNode) - def visit(self, node): - for item in node.variables: - self.visit(item) - self.visit(node.expr) - - @visitor.when(VarDeclarationNode) - def visit(self, node): - try: - var_type = node.computed_type - if node.expr is not None: - self.visit(node.expr) - expresion_type = node.expr.computed_type - - if var_type == AutoType() and expresion_type == AutoType(): - if expresion_type.infered_type is not None: - self.change |= InferType(self.current_type, var_type, expresion_type.infered_type) - if var_type.infered_type is not None: - self.change |= InferType(self.current_type, expresion_type, var_type.infered_type) - except: - pass - - @visitor.when(LoopNode) - def visit(self, node): - self.visit(node.predicate) - self.visit(node.body) - - @visitor.when(CaseNode) - def visit(self, node): - self.visit(node.expr) - for attr in node.cases: - self.visit(attr) - - @visitor.when(CaseAttrNode) - def visit(self, node): - self.visit(node.expr) - - @visitor.when(AssignNode) - def visit(self, node): - self.visit(node.id) - var_type = node.id.computed_type - self.visit(node.expr) - expresion_type = node.expr.computed_type - - if var_type == AutoType() and expresion_type == AutoType(): - if expresion_type.infered_type is not None: - self.change |= InferType(self.current_type, var_type, expresion_type.infered_type) - if var_type.infered_type is not None: - self.change |= InferType(self.current_type, expresion_type, var_type.infered_type) - - @visitor.when(BinaryNode) - def visit(self, node): - self.visit(node.left) - self.visit(node.right) - - if isinstance(node, EqualsNode): - left_type = node.left.computed_type - right_type = node.right.computed_type - - if left_type == AutoType() and right_type == AutoType(): - if left_type.infered_type is not None and (left_type.infered_type == StringType() or left_type.infered_type == BoolType() or left_type.infered_type == IntType()): - self.change |= InferType(self.current_type, right_type, left_type.infered_type) - - if right_type.infered_type is not None and (right_type.infered_type == StringType() or right_type.infered_type == BoolType() or right_type.infered_type == IntType()): - self.change |= InferType(self.current_type, left_type, right_type.infered_type) - - @visitor.when(PrimeNode) - def visit(self, node): - self.visit(node.expr) - - @visitor.when(NotNode) - def visit(self, node): - self.visit(node.expr) - - @visitor.when(StringNode) - def visit(self, node): - pass - - @visitor.when(IsVoidNode) - def visit(self, node): - self.visit(node.expr) - - @visitor.when(VariableNode) - def visit(self, node): - pass - - @visitor.when(TrueNode) - def visit(self, node): - pass - - @visitor.when(FalseNode) - def visit(self, node): - pass - - @visitor.when(InstantiateNode) - def visit(self, node): - pass \ No newline at end of file diff --git a/src/tours/utils.py b/src/tours/utils.py index 8d8e5bec7..249ba46aa 100644 --- a/src/tours/utils.py +++ b/src/tours/utils.py @@ -1,45 +1,8 @@ from parsing.ast import * -from cmp.semantic import SemanticError, Attribute, Method, Context -from cmp.semantic import Type, ErrorType, StringType, IntType, AutoType, BoolType, ObjectType, IOType, SelfType - - -def AnalizeClassAutoTypes(class_type, errors, inferences): - for attribute in class_type.attributes: - if attribute.type == AutoType(): - if attribute.type.infered_type is None: - errors.append(f"Can not infered the type of the attribute '{attribute.name}' of the class '{class_type.name}'.") - else: - inferences.append(f"The type of the attribute '{attribute.name}' of the class '{class_type.name}' was infered to '{attribute.type.infered_type.name}'.") - - for method in class_type.methods: - if method.return_type == AutoType(): - if method.return_type.infered_type is None: - errors.append(f"Can not infered the return type of the method '{method.name}' of the class '{class_type.name}'.") - else: - inferences.append(f"The return type of the method '{method.name}' of the class '{class_type.name}' was infered to '{method.return_type.infered_type.name}'.") - - -def AnalizeScopeAutoTypes(scope, errors, inferences): - stack = [scope] - while len(stack) != 0: - temp = stack.pop(0) - for s in temp.children: - stack.append(s) - - for var in temp.locals: - if var.type == AutoType(): - if var.type.infered_type is None: - errors.append(f"Can not infered the type of the variable '{var.name}' of the class '{temp.class_name}'.") - else: - inferences.append(f"The type of the variable '{var.name}' of the class '{temp.class_name}' was infered to '{var.type.infered_type.name}'.") +from cmp.semantic import ErrorType, ObjectType, SelfType def find_parent_type(current_type, type1, type2): - if type1 == AutoType() and type2 != AutoType(): - return type2 - elif type2 == AutoType(): - return type1 - if type1 == SelfType(): type1 = current_type if type2 == SelfType(): @@ -67,20 +30,5 @@ def find_parent_type(current_type, type1, type2): return parent3 -def InferType(current_type, auto_var, not_auto_var): - if not_auto_var != ErrorType(): - if auto_var.infered_type is not None: - temp = find_parent_type(current_type, auto_var.infered_type, not_auto_var) - - if auto_var.infered_type != temp : - auto_var.infered_type = temp - return True - else: - auto_var.infered_type = not_auto_var - return True - - return False - - def is_base_class(id): return id in ['Object', 'IO', 'Int', 'String', 'Bool'] \ No newline at end of file From 4e30a3add626593a59d6674c24fda8ecbc06fd4d Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Tue, 22 Feb 2022 05:06:46 -0500 Subject: [PATCH 08/81] Update lexer to be used as the yacc lexer Added required interface method so it can be used by the ply yacc parser: input(str) and token() Fix small bug with comment line messing with the token location --- src/parsing/lexer.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/parsing/lexer.py b/src/parsing/lexer.py index f77191685..8ddca5cbf 100644 --- a/src/parsing/lexer.py +++ b/src/parsing/lexer.py @@ -53,19 +53,21 @@ class COOL_Lexer: } tokens += list(keywords.values()) - - def __init__(self): + + def input(self, string): self.errors = [] self.prev_last_newline = 0 self.current_last_newline = 0 + self.output = self.tokenize(string) - def build(self): - self.lexer = lex.lex(module=self) + + def token(self): + return next(self.output, None) def tokenize(self, text): - self.last_newline = 0 - self.lexer.input(text) - for t in self.lexer: + lexer = lex.lex(module=self) + lexer.input(text) + for t in lexer: t.lexpos = t.lexpos - self.prev_last_newline + 1 self.prev_last_newline = self.current_last_newline yield t @@ -153,6 +155,7 @@ def t_SINGLE_LINE_COMMENT(self, t): t.lexer.lineno += 1 value += text[pos] pos+=1 + self.prev_last_newline = pos self.current_last_newline = pos break value += text[pos] @@ -222,6 +225,7 @@ def t_newline(self, t): self.prev_last_newline = t.lexer.lexpos self.current_last_newline = t.lexer.lexpos + t_ignore = ' \t\r' ######################################################################## @@ -233,4 +237,6 @@ def t_error(self, t): # not recognized symbol t.lexer.skip(1) def register_error(self, line, column, text): - self.errors.append(f'{line,column} - {text}') \ No newline at end of file + self.errors.append(f'{line,column} - {text}') + + From 8bc62c3739c367f5bae0e31305f397f28de11a2c Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Tue, 22 Feb 2022 05:09:33 -0500 Subject: [PATCH 09/81] Add support for node location in the AST and the grammar --- src/parsing/ast.py | 63 +++++++++++------- src/parsing/parser.py | 149 +++++++++++++++++++++++++++--------------- 2 files changed, 137 insertions(+), 75 deletions(-) diff --git a/src/parsing/ast.py b/src/parsing/ast.py index 0a782b197..c821864d6 100644 --- a/src/parsing/ast.py +++ b/src/parsing/ast.py @@ -3,7 +3,8 @@ class Node: class ProgramNode(Node): - def __init__(self, declarations): + def __init__(self, location, declarations): + self.location = location self.declarations = declarations @@ -17,43 +18,51 @@ class ExpressionNode(Node): # Class class ClassDeclarationNode(DeclarationNode): - def __init__(self, idx, features, parent=None): - self.id = idx + def __init__(self, location, idx, features, parent=None, parent_location=None): + self.location = location + self.id, self.id_location = idx self.parent = parent self.features = features + self.parent_location = parent_location # Features class FuncDeclarationNode(DeclarationNode): - def __init__(self, idx, params, return_type, body): + def __init__(self, location, idx, params, return_type, body): + self.location = location self.id = idx self.params = params - self.type = return_type + self.type, self.type_location = return_type self.expr = body class AttrDeclarationNode(DeclarationNode): - def __init__(self, idx, typex, expr=None): + def __init__(self, location, idx, typex, expr=None): + self.location = location self.id = idx - self.type = typex + self.type, self.type_location = typex self.expr = expr class VarDeclarationNode(ExpressionNode): - def __init__(self, idx, typex, expr=None): + def __init__(self, location, idx, typex, expr=None): + self.location = location self.id = idx - self.type = typex + self.type, self.type_location = typex self.expr = expr class AssignNode(ExpressionNode): - def __init__(self, idx, expr): + def __init__(self, location, symbol_location, idx, expr): + self.location = location + self.symbol_location = symbol_location self.id = idx self.expr = expr class DispatchNode(ExpressionNode): - def __init__(self, obj, idx, args, from_type=None): + def __init__(self, location, obj, idx, args, from_type=None): + self.location = location self.expr = obj self.id = idx self.arg = args @@ -61,55 +70,65 @@ def __init__(self, obj, idx, args, from_type=None): class BinaryNode(ExpressionNode): - def __init__(self, left, right): + def __init__(self, location, symbol_location, left, right): + self.symbol_location = symbol_location + self.location = location self.left = left self.right = right class UnaryNode(ExpressionNode): - def __init__(self, exp): + def __init__(self, location, exp): + self.location = location self.expr = exp class ConditionalNode(ExpressionNode): - def __init__(self, if_exp, then_exp, else_exp): + def __init__(self, location, if_exp, then_exp, else_exp): + self.location = location self.predicate = if_exp self.then = then_exp self.elsex = else_exp class LoopNode(ExpressionNode): - def __init__(self, while_exp, loop_exp): + def __init__(self, location, while_exp, loop_exp): + self.location = location self.predicate = while_exp self.body = loop_exp class BlockNode(ExpressionNode): - def __init__(self, exp_list): + def __init__(self, location, exp_list): + self.location = location self.expr_lis = exp_list class LetNode(ExpressionNode): - def __init__(self, var_list, in_exp): + def __init__(self,location, var_list, in_exp): + self.location = location self.variables = var_list self.expr = in_exp class CaseNode(ExpressionNode): - def __init__(self, cond, case_list): + def __init__(self,location, cond, case_list): + self.location = location self.expr = cond self.cases = case_list class CaseAttrNode(ExpressionNode): - def __init__(self, idx, typex, expr): + def __init__(self, location, idx, typex, expr): + self.location = location self.id = idx - self.type = typex + self.type, self.type_location = typex self.expr = expr class AtomicNode(ExpressionNode): - def __init__(self, lex): + def __init__(self, location, lex): + self.location = location self.lex = lex @@ -178,4 +197,4 @@ class PrimeNode(UnaryNode): class IsVoidNode(UnaryNode): - pass \ No newline at end of file + pass diff --git a/src/parsing/parser.py b/src/parsing/parser.py index c3a6039e9..530ab495b 100644 --- a/src/parsing/parser.py +++ b/src/parsing/parser.py @@ -9,13 +9,13 @@ def __init__(self): self.tokens = COOL_Lexer.tokens def parse(self, input_string): - l = COOL_Lexer() - l.build() - self.lex = l + #l = COOL_Lexer() + #l.build() + self.lex = COOL_Lexer() self.errors = [] self.parser = yacc.yacc(module=self) self.input = input_string - result = self.parser.parse(input_string, lexer=self.lex.lexer) + result = self.parser.parse(input_string, lexer=self.lex) return result, self.errors ###################################################################### @@ -25,7 +25,7 @@ def parse(self, input_string): @staticmethod def p_program(p): 'program : class_list' - p[0] = ProgramNode(p[1]) + p[0] = ProgramNode(None,p[1]) # location of this is @staticmethod def p_class_list_single(p): @@ -40,12 +40,18 @@ def p_class_list_multi(p): @staticmethod def p_def_class(p): 'def_class : CLASS TYPEID OCUR feature_list CCUR SEMICOLON' - p[0] = ClassDeclarationNode(p[2],p[4]) + location = (p.lineno(1), p.lexpos(1)) + type_location = (p.lineno(2), p.lexpos(2)) + p[0] = ClassDeclarationNode(location,(p[2], type_location),p[4]) @staticmethod def p_def_class_parent(p): 'def_class : CLASS TYPEID INHERITS TYPEID OCUR feature_list CCUR SEMICOLON' - p[0] = ClassDeclarationNode(p[2],p[6],p[4]) + location = (p.lineno(1), p.lexpos(1)) + type_location = (p.lineno(2), p.lexpos(2)) + parent_location = (p.lineno(4), p.lexpos(4)) + p[0] = ClassDeclarationNode(location,(p[2], type_location),p[6],p[4], parent_location) + @staticmethod def p_feature_list_empty(p): @@ -66,22 +72,31 @@ def p_feature_list_fun(p): @staticmethod def p_attr(p): 'def_attr : OBJECTID COLON TYPEID SEMICOLON' - p[0] = AttrDeclarationNode(p[1],p[3]) + location = (p.lineno(1), p.lexpos(1)) + type_location = (p.lineno(3), p.lexpos(3)) + p[0] = AttrDeclarationNode(location,p[1],(p[3], type_location)) + @staticmethod def p_attr_exp(p): 'def_attr : OBJECTID COLON TYPEID ASSIGN exp SEMICOLON' - p[0] = AttrDeclarationNode(p[1],p[3],p[5]) + location = (p.lineno(1), p.lexpos(1)) + type_location = (p.lineno(3), p.lexpos(3)) + p[0] = AttrDeclarationNode(location,p[1],(p[3], type_location),p[5]) @staticmethod def p_func(p): 'def_func : OBJECTID OPAR CPAR COLON TYPEID OCUR exp CCUR SEMICOLON' - p[0] = FuncDeclarationNode(p[1],[],p[5],p[7]) + location = (p.lineno(1), p.lexpos(1)) + return_location = (p.lineno(5), p.lexpos(5)) + p[0] = FuncDeclarationNode(location,p[1],[],(p[5], return_location),p[7]) @staticmethod def p_func_param(p): 'def_func : OBJECTID OPAR param_list CPAR COLON TYPEID OCUR exp CCUR SEMICOLON' - p[0] = FuncDeclarationNode(p[1],p[3],p[6],p[8]) + location = (p.lineno(1), p.lexpos(1)) + return_location = (p.lineno(6), p.lexpos(6)) + p[0] = FuncDeclarationNode(location,p[1],p[3],(p[6], return_location),p[8]) @staticmethod def p_param_list_single(p): @@ -96,17 +111,22 @@ def p_param_list_multi(p): @staticmethod def p_param(p): 'param : OBJECTID COLON TYPEID' - p[0] = VarDeclarationNode(p[1],p[3]) + location = (p.lineno(1), p.lexpos(1)) + type_location = (p.lineno(3), p.lexpos(3)) + p[0] = VarDeclarationNode(location,p[1],(p[3], type_location)) @staticmethod def p_exp_assign(p): 'exp : OBJECTID ASSIGN exp' - p[0] = AssignNode(VariableNode(p[1]),p[3]) + location = (p.lineno(1), p.lexpos(1)) + symbol_location = (p.lineno(2), p.lexpos(2)) + p[0] = AssignNode(location, symbol_location, VariableNode(location,p[1]),p[3]) @staticmethod def p_exp_let(p): 'exp : LET ident_list IN exp' - p[0] = LetNode(p[2],p[4]) + location = (p.lineno(1), p.lexpos(1)) + p[0] = LetNode(location,p[2],p[4]) @staticmethod def p_ident_list_single(p): @@ -121,12 +141,17 @@ def p_ident_list_multi(p): @staticmethod def p_iden(p): 'iden : OBJECTID COLON TYPEID' - p[0] = VarDeclarationNode(p[1],p[3],None) + location = (p.lineno(1), p.lexpos(1)) + type_location = (p.lineno(3), p.lexpos(3)) + p[0] = VarDeclarationNode(location,p[1],(p[3], type_location),None) @staticmethod def p_iden_init(p): 'iden : OBJECTID COLON TYPEID ASSIGN exp' - p[0] = VarDeclarationNode(p[1],p[3],p[5]) + location = (p.lineno(1), p.lexpos(1)) + type_location = (p.lineno(3), p.lexpos(3)) + p[0] = VarDeclarationNode(location,p[1],(p[3], type_location),p[5]) + @staticmethod def p_case_list_single(p): @@ -141,12 +166,15 @@ def p_case_list_multi(p): @staticmethod def p_branch(p): 'branch : OBJECTID COLON TYPEID CASSIGN exp SEMICOLON' - p[0] = CaseAttrNode(p[1],p[3],p[5]) + location = (p.lineno(1), p.lexpos(1)) + type_location = (p.lineno(3), p.lexpos(3)) + p[0] = CaseAttrNode(location,p[1],(p[3], type_location),p[5]) @staticmethod def p_exp_not(p): 'exp : NOT exp' - p[0] = NotNode(p[2]) + location = (p.lineno(1), p.lexpos(1)) + p[0] = NotNode(location,p[2]) @staticmethod def p_exp_comp(p): @@ -161,22 +189,26 @@ def p_comp_arith(p): @staticmethod def p_comp_lower(p): 'comp : arith LOWER arith' - p[0] = LessNode(p[1],p[3]) + symbol_location = (p.lineno(2), p.lexpos(2)) + p[0] = LessNode(p[1].location, symbol_location, p[1],p[3]) @staticmethod def p_comp_leq(p): 'comp : arith LEQ arith' - p[0] = ElessNode(p[1],p[3]) + symbol_location = (p.lineno(2), p.lexpos(2)) + p[0] = ElessNode(p[1].location,symbol_location,p[1],p[3]) @staticmethod def p_comp_equal(p): 'comp : arith EQUAL arith' - p[0] = EqualsNode(p[1],p[3]) + symbol_location = (p.lineno(2), p.lexpos(2)) + p[0] = EqualsNode(p[1].location,symbol_location,p[1],p[3]) @staticmethod def p_comp_equal_not(p): 'comp : arith EQUAL NOT exp' - p[0] = EqualsNode(p[1],p[4]) + symbol_location = (p.lineno(2), p.lexpos(2)) + p[0] = EqualsNode(p[1].location,symbol_location,p[1],p[4]) @staticmethod def p_arith_term(p): @@ -186,12 +218,15 @@ def p_arith_term(p): @staticmethod def p_arith_plus(p): 'arith : arith PLUS term' - p[0] = PlusNode(p[1],p[3]) + location = (p.lineno(2), p.lexpos(2)) + symbol_location = (p.lineno(2), p.lexpos(2)) + p[0] = PlusNode(location,symbol_location,p[1],p[3]) @staticmethod def p_arith_minus(p): 'arith : arith MINUS term' - p[0] = MinusNode(p[1],p[3]) + symbol_location = (p.lineno(2), p.lexpos(2)) + p[0] = MinusNode(p[1].location,symbol_location,p[1],p[3]) @staticmethod def p_term_fac(p): @@ -201,12 +236,14 @@ def p_term_fac(p): @staticmethod def p_term_star(p): 'term : term STAR factor' - p[0] = StarNode(p[1],p[3]) + symbol_location = (p.lineno(2), p.lexpos(2)) + p[0] = StarNode(p[1].location,symbol_location,p[1],p[3]) @staticmethod def p_term_div(p): 'term : term DIV factor' - p[0] = DivNode(p[1],p[3]) + symbol_location = (p.lineno(2), p.lexpos(2)) + p[0] = DivNode(p[1].location,symbol_location,p[1],p[3]) @staticmethod def p_factor_atom(p): @@ -216,22 +253,26 @@ def p_factor_atom(p): @staticmethod def p_factor_neg(p): 'factor : TILDE factor' - p[0] = PrimeNode(p[2]) + location = (p.lineno(1), p.lexpos(1)) + p[0] = PrimeNode(location,p[2]) @staticmethod def p_factor_case(p): 'factor : CASE exp OF case_list ESAC' - p[0] = CaseNode(p[2],p[4]) + location = (p.lineno(1), p.lexpos(1)) + p[0] = CaseNode(location,p[2],p[4]) @staticmethod def p_factor_while(p): 'factor : WHILE exp LOOP exp POOL' - p[0] = LoopNode(p[2],p[4]) + location = (p.lineno(1), p.lexpos(1)) + p[0] = LoopNode(location,p[2],p[4]) @staticmethod def p_factor_block(p): 'factor : OCUR exp_list CCUR' - p[0] = BlockNode(p[2]) + location = (p.lineno(1), p.lexpos(1)) + p[0] = BlockNode(location,p[2]) @staticmethod def p_exp_list_single(p): @@ -246,42 +287,50 @@ def p_exp_list_multi(p): @staticmethod def p_factor_cond(p): 'factor : IF exp THEN exp ELSE exp FI' - p[0] = ConditionalNode(p[2],p[4],p[6]) + location = (p.lineno(1), p.lexpos(1)) + p[0] = ConditionalNode(location,p[2],p[4],p[6]) @staticmethod def p_factor_void(p): 'factor : ISVOID factor' - p[0] = IsVoidNode(p[2]) + location = (p.lineno(1), p.lexpos(1)) + p[0] = IsVoidNode(location,p[2]) @staticmethod def p_atom_num(p): 'atom : INT_CONST' - p[0] = ConstantNumNode(p[1]) + location = (p.lineno(1), p.lexpos(1)) + p[0] = ConstantNumNode(location,p[1]) @staticmethod def p_atom_string(p): 'atom : STRING_CONST' - p[0] = StringNode(p[1]) + location = (p.lineno(1), p.lexpos(1)) + p[0] = StringNode(location,p[1]) @staticmethod def p_atom_true(p): 'atom : TRUE' - p[0] = TrueNode(p[1]) + location = (p.lineno(1), p.lexpos(1)) + p[0] = TrueNode(location,p[1]) @staticmethod def p_atom_false(p): 'atom : FALSE' - p[0] = FalseNode(p[1]) + location = (p.lineno(1), p.lexpos(1)) + p[0] = FalseNode(location,p[1]) @staticmethod def p_atom_var(p): 'atom : OBJECTID' - p[0] = VariableNode(p[1]) + location = (p.lineno(1), p.lexpos(1)) + p[0] = VariableNode(location,p[1]) @staticmethod def p_atom_new(p): 'atom : NEW TYPEID' - p[0] = InstantiateNode(p[2]) + location = (p.lineno(1), p.lexpos(1)) + p[0] = InstantiateNode(location,p[2]) @staticmethod def p_atom_func_call(p): @@ -292,21 +341,23 @@ def p_atom_func_call(p): def p_atom_exp(p): 'atom : OPAR exp CPAR' p[0] = p[2] + p[0].location = (p.lineno(1), p.lexpos(1)) @staticmethod def p_func_call_self(p): 'func_call : OBJECTID OPAR arg_list CPAR' - p[0] = DispatchNode(VariableNode('self'),p[1],p[3]) + location = (p.lineno(1), p.lexpos(1)) + p[0] = DispatchNode(location,VariableNode(None,'self'),p[1],p[3]) @staticmethod def p_func_call(p): 'func_call : atom DOT OBJECTID OPAR arg_list CPAR' - p[0] = DispatchNode(p[1],p[3],p[5]) + p[0] = DispatchNode(p[1].location,p[1],p[3],p[5]) @staticmethod def p_func_call_at(p): 'func_call : atom AT TYPEID DOT OBJECTID OPAR arg_list CPAR' - p[0] = DispatchNode(p[1],p[5],p[7],p[3]) + p[0] = DispatchNode(p[1].location,p[1],p[5],p[7],p[3]) @staticmethod def p_arg_list_empty(p): @@ -332,18 +383,10 @@ def p_arg_list_not_empty_multi(p): #Error rule for syntax errors def p_error(self, p): if not p: - l = COOL_Lexer() - l.build() - for t in l.tokenize(self.input): - if t.value != 'class': #Error at the beginning - p = t - break - - if not p: # Error at the end - self.errors.append('(0, 0) - SyntacticError: ERROR at or near EOF') - return + self.errors.append('(0, 0) - SyntacticError: ERROR at or near EOF') + return - col = self.__find_column(p) + col = p.lexpos line = p.lineno val = p.value #(29, 9) - SyntacticError: ERROR at or near "Test1" @@ -352,4 +395,4 @@ def p_error(self, p): def __find_column(self, token): input_s = self.input line_start = input_s.rfind('\n', 0, token.lexpos) + 1 - return (token.lexpos - line_start) + 1 \ No newline at end of file + return (token.lexpos - line_start) + 1 From 05ab2e54f84ef9e12c8d559cfaa856e5d254f314 Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Tue, 22 Feb 2022 05:10:38 -0500 Subject: [PATCH 10/81] Add location to semantic errors :) --- src/tours/TypeBuilder.py | 40 ++++++++++---- src/tours/TypeChecker.py | 106 ++++++++++++++++++++++++++----------- src/tours/TypeCollector.py | 7 +-- 3 files changed, 109 insertions(+), 44 deletions(-) diff --git a/src/tours/TypeBuilder.py b/src/tours/TypeBuilder.py index 555973ea5..6dc9f5807 100644 --- a/src/tours/TypeBuilder.py +++ b/src/tours/TypeBuilder.py @@ -54,7 +54,9 @@ def visit(self, node): try: parent = self.context.get_type(node.parent) if parent == BoolType() or parent == IntType() or parent == StringType() or parent == SelfType(): - self.errors.append(CANNOT_INHERIT.replace('%s', node.id, 1).replace('%s', parent.name, 1)) + e = CANNOT_INHERIT.replace('%s', node.id, 1).replace('%s', parent.name, 1) + location = node.parent_location + self.errors.append(f'{location} - {e}') parent = ErrorType() else: try: @@ -65,11 +67,15 @@ def visit(self, node): except SemanticError: pass except SemanticError as error: - self.errors.append(PARENT_NOT_DEFINED.replace('%s', node.id, 1).replace('%s', node.parent, 1)) + e = PARENT_NOT_DEFINED.replace('%s', node.id, 1).replace('%s', node.parent, 1) + location = node.parent_location + self.errors.append(f'{location} - {e}') parent = ErrorType() if parent.conforms_to(self.current_type): - self.errors.append(CYCLES_IN_CLASES.replace('%s', node.id, 2)) + e = CYCLES_IN_CLASES.replace('%s', node.id, 2) + location = node.parent_location + self.errors.append(f'{location} - {e}') parent = ErrorType() if self.current_type != ObjectType(): @@ -83,7 +89,9 @@ def visit(self, node): try: att_type = self.context.get_type(node.type) except SemanticError as error: - self.errors.append(UNDEFINED_ATTRIBUTE_TYPE.replace('%s', node.type, 1).replace('%s', node.id, 1)) + e = UNDEFINED_ATTRIBUTE_TYPE.replace('%s', node.type, 1).replace('%s', node.id, 1) + location = node.type_location + self.errors.append(f'{location} - {e}') att_type = ErrorType() try: @@ -91,16 +99,20 @@ def visit(self, node): except SemanticError as error: x = self.current_type.get_attribute_parent(node.id) if x == self.current_type: - self.errors.append(ATTRIBUTE_REDEFINED.replace('%s', node.id, 1)) + e = ATTRIBUTE_REDEFINED.replace('%s', node.id, 1) + self.errors.append(f'{node.location} - {e}') else: - self.errors.append(PARENT_ATTRIBUTE_REDEFINED.replace('%s', node.id, 1)) + e = PARENT_ATTRIBUTE_REDEFINED.replace('%s', node.id, 1) + self.errors.append(f'{node.location} - {e}') @visitor.when(FuncDeclarationNode) def visit(self, node): try: return_type = self.context.get_type(node.type) except SemanticError as error: - self.errors.append(UNDEFINED_RETURN_TYPE.replace('%s', node.type, 1).replace('%s', node.id, 1)) + e = UNDEFINED_RETURN_TYPE.replace('%s', node.type, 1).replace('%s', node.id, 1) + location = node.type_location + self.errors.append(f'{location} - {e}') return_type = ErrorType() params = [] @@ -109,14 +121,19 @@ def visit(self, node): try: param_type = self.context.get_type(var.type) if param_type == SelfType(): - self.errors.append(NOT_SELF_TYPE.replace('%s', var.id, 1).replace('%s', node.id, 1).replace('%s', self.current_type.name, 1)) + e = NOT_SELF_TYPE.replace('%s', var.id, 1).replace('%s', node.id, 1).replace('%s', self.current_type.name, 1) + location = var.type_location + self.errors.append(f'{location} - {e}') param_type = ErrorType() except SemanticError as error: - self.errors.append(UNDEFINED_PARAM_TYPE.replace('%s', var.type, 1).replace('%s', var.id, 1)) + e = UNDEFINED_PARAM_TYPE.replace('%s', var.type, 1).replace('%s', var.id, 1) + location = var.type_location + self.errors.append(f'{location} - {e}') param_type = ErrorType() if var.id in params: - self.errors.append(IDENTIFIER_USED.replace('%s', var.id, 1)) + e = IDENTIFIER_USED.replace('%s', var.id, 1) + self.errors.append(f'{var.location} - {e}') params.append(var.id) types.append(param_type) @@ -124,4 +141,5 @@ def visit(self, node): try: self.current_type.define_method(node.id, params, types, return_type) except SemanticError as error: - self.errors.append(METHOD_REDEFINED.replace('%s', node.id, 1)) \ No newline at end of file + e = (METHOD_REDEFINED.replace('%s', node.id, 1)) + self.errors.append(f'{node.location} - {e}') diff --git a/src/tours/TypeChecker.py b/src/tours/TypeChecker.py index 3268eb3b3..c04886647 100644 --- a/src/tours/TypeChecker.py +++ b/src/tours/TypeChecker.py @@ -73,12 +73,14 @@ def visit(self, node, scope): if parent is not None: try: parent.get_attribute(node.id) - self.errors.append(PARENT_ATTRIBUTE_REDEFINED.replace('%s', node.id, 1)) + e = PARENT_ATTRIBUTE_REDEFINED.replace('%s', node.id, 1) + self.errors.append(f'{node.location} - {e}') except SemanticError: pass if node.id == "self": - self.errors.append(SELF_IS_READONLY_ATTRIBUTE) + e = SELF_IS_READONLY_ATTRIBUTE + self.errors.append(f"{node.location} - {e}") node_type = self.current_type.get_attribute(node.id).type if node_type == SelfType(): @@ -91,7 +93,9 @@ def visit(self, node, scope): expr_type = self.current_type if not expr_type.conforms_to(node_type): - self.errors.append(INCOMPATIBLE_ATTRIBUTE_TYPE.replace('%s', expr_type.name, 1).replace('%s', node.id, 1).replace('%s', node_type.name, 1)) + e = INCOMPATIBLE_ATTRIBUTE_TYPE.replace('%s', expr_type.name, 1).replace('%s', node.id, 1).replace('%s', node_type.name, 1) + location = node.expr.location + self.errors.append(f"{location} - {e}") @visitor.when(FuncDeclarationNode) def visit(self, node, scope): @@ -104,22 +108,33 @@ def visit(self, node, scope): try: method = parent.get_method(node.id) if method.return_type != self.current_method.return_type: - self.errors.append(METHOD_REDEFINED_RETURN.replace('%s', node.id, 1).replace('%s', self.current_method.return_type.name, 1).replace('%s', method.return_type.name, 1)) + e = METHOD_REDEFINED_RETURN.replace('%s', node.id, 1).replace('%s', self.current_method.return_type.name, 1).replace('%s', method.return_type.name, 1) + location = node.type_location + self.errors.append(f'{location} - {e}') if len(self.current_method.param_types) != len(method.param_types): - self.errors.append(METHOD_REDEFINED_NPARAM.replace('%s', node.id, 1)) + e = METHOD_REDEFINED_NPARAM.replace('%s', node.id, 1) + self.errors.append(f'{node.location} - {e}') else: + index = 0 for type_child, type_parent in zip(self.current_method.param_types, method.param_types): if type_child != type_parent: - self.errors.append(METHOD_REDEFINED_PARAM.replace('%s', node.id, 1).replace('%s', type_child.name, 1).replace('%s', type_parent.name, 1)) + e = METHOD_REDEFINED_PARAM.replace('%s', node.id, 1).replace('%s', type_child.name, 1).replace('%s', type_parent.name, 1) + location = node.params[index].location + self.errors.append(f'{location} - {e}') + index += 1 except SemanticError: pass - + + index = 0 for name, typex in zip(self.current_method.param_names, self.current_method.param_types): if name != "self": child.define_variable(name, typex) else: - self.errors.append(SELF_IS_READONLY_PARAM) + e = SELF_IS_READONLY_PARAM + location = node.params[index].location + self.errors.append(f'{location} - {e}') + index += 1 self.visit(node.expr, child) @@ -127,7 +142,9 @@ def visit(self, node, scope): return_type_met = self.current_method.return_type if self.current_method.return_type != SelfType() else self.current_type if not return_type_exp.conforms_to(return_type_met): - self.errors.append(INCOMPATIBLE_RET_FUNC_TYPE.replace('%s', return_type_exp.name, 1).replace('%s',node.id , 1).replace('%s',return_type_met.name , 1)) + e = INCOMPATIBLE_RET_FUNC_TYPE.replace('%s', return_type_exp.name, 1).replace('%s',node.id , 1).replace('%s',return_type_met.name , 1) + location = node.expr.location + self.errors.append(f'{location} - {e}') @visitor.when(BlockNode) def visit(self, node, scope): @@ -146,7 +163,8 @@ def visit(self, node, scope): try: typex = self.context.get_type(node.type) if not obj_type.conforms_to(typex): - self.errors.append(INCOMPATIBLE_DISPATCH_DEC_TYPE.replace('%s', obj_type.name, 1).replace('%s', typex.name, 1)) + e = INCOMPATIBLE_DISPATCH_DEC_TYPE.replace('%s', obj_type.name, 1).replace('%s', typex.name, 1) + self.errors.append(f'{node.location} - {e}') typex = ErrorType() obj_type = typex except SemanticError as error: @@ -164,10 +182,13 @@ def visit(self, node, scope): arg_type = arg.computed_type if arg.computed_type != SelfType() else self.current_type if not arg_type.conforms_to(param_type): - self.errors.append(INCOMPATIBLE_DISPATCH_TYPE.replace('%s', node.id, 1).replace('%s', arg_type.name, 1).replace('%s', param_name, 1).replace('%s', param_type.name, 1)) + e = INCOMPATIBLE_DISPATCH_TYPE.replace('%s', node.id, 1).replace('%s', arg_type.name, 1).replace('%s', param_name, 1).replace('%s', param_type.name, 1) + location = arg.location + self.errors.append(f'{location} - {e}') typee = ErrorType() else: - self.errors.append(WRONG_NUMBER_ARGUMENTS.replace('%s', method.name, 1)) + e = WRONG_NUMBER_ARGUMENTS.replace('%s', method.name, 1) + self.errors.append(f'{node.location} - {e}') if typee is None: ret_type = method.return_type if method.return_type != SelfType() else obj_type @@ -175,7 +196,8 @@ def visit(self, node, scope): ret_type = typee except SemanticError as error: - self.errors.append(UNDEFINED_METHOD.replace('%s',node.id)) + e = UNDEFINED_METHOD.replace('%s',node.id) + self.errors.append(f'{node.location} - {e}') ret_type = ErrorType() node.computed_type = ret_type @@ -191,7 +213,8 @@ def visit(self, node, scope): if predicate_type.conforms_to(BoolType()): node.computed_type = find_parent_type(self.current_type, node.then.computed_type, node.elsex.computed_type) else: - self.errors.append(PREDICATE_OPERATIONS.replace('%s', "If", 1)) + e = PREDICATE_OPERATIONS.replace('%s', "If", 1) + self.errors.append(f'{node.location} - {e}') node.computed_type = ErrorType() @visitor.when(LetNode) @@ -206,12 +229,14 @@ def visit(self, node, scope): @visitor.when(VarDeclarationNode) def visit(self, node, scope): if node.id == 'self': - self.errors.append(SELF_IS_READONLY_LET) + self.errors.append(f'{node.location} - {SELF_IS_READONLY_LET}') try: var_type = self.context.get_type(node.type) except SemanticError as error: - self.errors.append(UNDEFINED_VARIABLE_TYPE.replace('%s', node.type, 1).replace('%s', node.id, 1)) + e = UNDEFINED_VARIABLE_TYPE.replace('%s', node.type, 1).replace('%s', node.id, 1) + location = node.type_location + self.errors.append(f'{location} - {e}') var_type = ErrorType() if node.expr is not None: @@ -219,7 +244,9 @@ def visit(self, node, scope): expresion_type = node.expr.computed_type if node.expr.computed_type != SelfType() else self.current_type if not expresion_type.conforms_to(var_type): - self.errors.append(INCOMPATIBLE_VARIABLE_TYPE.replace('%s', expresion_type.name, 1).replace('%s', node.id, 1).replace('%s', var_type.name, 1)) + e = INCOMPATIBLE_VARIABLE_TYPE.replace('%s', expresion_type.name, 1).replace('%s', node.id, 1).replace('%s', var_type.name, 1) + location = node.expr.location + self.errors.append(f'{location} - {e}') if scope.is_local(node.id): scope.remove_variable(node.id) @@ -237,7 +264,8 @@ def visit(self, node, scope): if predicate_type.conforms_to(BoolType()): node.computed_type = ObjectType() else: - self.errors.append(PREDICATE_OPERATIONS.replace('%s',"Loop", 1)) + e = PREDICATE_OPERATIONS.replace('%s',"Loop", 1) + self.errors.append(f'{node.location} - {e}') node.computed_type = ErrorType() @visitor.when(CaseNode) @@ -250,7 +278,9 @@ def visit(self, node, scope): self.visit(attr, scope) types_computed.append(attr.computed_type) if attr.type in types: - self.errors.append(DUPLICATE_BRANCH.replace('%s', attr.type, 1)) + e = DUPLICATE_BRANCH.replace('%s', attr.type, 1) + location = attr.type_location + self.errors.append(f'{location} - {e}') else: types.append(attr.type) @@ -264,7 +294,9 @@ def visit(self, node, scope): try: typex = self.context.get_type(node.type) except SemanticError as error: - self.errors.append(CASE_TYPE_UNDEFINED.replace('%s', node.type, 1)) + e = (CASE_TYPE_UNDEFINED.replace('%s', node.type, 1)) + location = node.type_location + self.errors.append(f'{location} - {e}') typex = ErrorType() child_scope = scope.create_child(scope.class_name, scope.method_name) @@ -284,7 +316,7 @@ def visit(self, node, scope): node.computed_type = expresion_type if node.id.lex == 'self': - self.errors.append(SELF_IS_READONLY) + self.errors.append(f'{node.symbol_location} - {SELF_IS_READONLY}') node.computed_type = ErrorType() elif not expresion_type.conforms_to(var_type): self.errors.append(INCOMPATIBLE_VARIABLE_TYPE.replace('%s', expresion_type.name, 1).replace('%s', node.id.lex).replace('%s', var_type.name, 1)) @@ -318,20 +350,28 @@ def visit(self, node, scope): node.computed_type = IntType() else: if(left_type == right_type): - self.errors.append(OPERATION_NOT_DEFINED.replace('%s', operation, 1).replace('%s', left_type.name, 1)) + e = OPERATION_NOT_DEFINED.replace('%s', operation, 1).replace('%s', left_type.name, 1) + else: + e = INVALID_OPERATION.replace('%s', left_type.name, 1).replace('%s', operation, 1).replace('%s', right_type.name, 1) + if left_type != IntType(): + location = node.left.location else: - self.errors.append(INVALID_OPERATION.replace('%s', left_type.name, 1).replace('%s', operation, 1).replace('%s', right_type.name, 1)) + location = node.left.location + + self.errors.append(f'{location} - {e}') node.computed_type = ErrorType() else: if left_type == right_type: if left_type == StringType() or left_type == IntType() or left_type == BoolType(): node.computed_type = BoolType() else: - self.errors.append(OPERATION_NOT_DEFINED.replace('%s', "equals", 1).replace('%s', left_type.name, 1)) + e = OPERATION_NOT_DEFINED.replace('%s', "equals", 1).replace('%s', left_type.name, 1) + location = node.left.location + self.errors.append(f'{location} - {e}') node.computed_type = ErrorType() else: if is_base_class(left_type.name) or is_base_class(right_type.name): - self.errors.append(INVALID_BASIC_COMPARISON) + self.errors.append(f'{node.symbol_location} - {INVALID_BASIC_COMPARISON}') node.computed_type = ErrorType() else: node.computed_type = BoolType() @@ -344,7 +384,9 @@ def visit(self, node, scope): if type_expr == IntType(): node.computed_type = IntType() else: - self.errors.append(UNARY_OPERATION_NOT_DEFINED.replace('%s', "~", 1).replace('%s', type_expr.name, 1).replace('%s', "Int", 1)) + e = UNARY_OPERATION_NOT_DEFINED.replace('%s', "~", 1).replace('%s', type_expr.name, 1).replace('%s', "Int", 1) + location = node.expr.location + self.errors.append(f'{location} - {e}') node.computed_type = ErrorType() @visitor.when(NotNode) @@ -355,7 +397,9 @@ def visit(self, node, scope): if type_expr == BoolType(): node.computed_type = BoolType() else: - self.errors.append(UNARY_OPERATION_NOT_DEFINED.replace('%s', "not", 1).replace('%s', type_expr.name, 1).replace('%s', "Bool", 1)) + e = UNARY_OPERATION_NOT_DEFINED.replace('%s', "not", 1).replace('%s', type_expr.name, 1).replace('%s', "Bool", 1) + location = node.expr.location + self.errors.append(f'{location} - {e}') node.computed_type = ErrorType() @visitor.when(StringNode) @@ -376,7 +420,8 @@ def visit(self, node, scope): if scope.is_defined(node.lex, self.current_type): var_type = scope.find_variable_or_attribute(node.lex, self.current_type).type else: - self.errors.append(VARIABLE_NOT_DEFINED.replace('%s', node.lex, 1)) + e = VARIABLE_NOT_DEFINED.replace('%s', node.lex, 1) + self.errors.append(f'{node.location} - {e}') var_type = ErrorType() node.computed_type = var_type @@ -393,7 +438,8 @@ def visit(self, node, scope): try: var_type = self.context.get_type(node.lex) except SemanticError as error: - self.errors.append(UNDEFINED_NEW_TYPE.replace('%s', node.lex, 1)) + e = UNDEFINED_NEW_TYPE.replace('%s', node.lex, 1) + self.errors.append(f'{node.location} - {e}') var_type = ErrorType() - node.computed_type = var_type \ No newline at end of file + node.computed_type = var_type diff --git a/src/tours/TypeCollector.py b/src/tours/TypeCollector.py index 2959d1124..0e6bb37ca 100644 --- a/src/tours/TypeCollector.py +++ b/src/tours/TypeCollector.py @@ -40,9 +40,10 @@ def visit(self, node): try: self.context.get_type(node.id) if is_base_class(node.id): - self.errors.append(BASIC_CLASS_REDEFINED.replace('%s', node.id, 1)) + e = BASIC_CLASS_REDEFINED.replace('%s', node.id, 1) + self.errors.append(f"{node.location} - {e}") else: - self.errors.append(CLASS_REDEFINED) + self.errors.append(f'{node.id_location} - {CLASS_REDEFINED}') except SemanticError: self.context.create_type(node.id) @@ -72,4 +73,4 @@ def define_base_classes(context): io_type.define_method('out_string', ['x'], [string_type], self_type) io_type.define_method('out_int', ['x'], [int_type], self_type) io_type.define_method('in_string', [], [], string_type) - io_type.define_method('in_int', [], [], int_type) \ No newline at end of file + io_type.define_method('in_int', [], [], int_type) From abd09fbb3ca65294dc75c6f2d0342ca72b9ce967 Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Tue, 22 Feb 2022 05:11:07 -0500 Subject: [PATCH 11/81] Update the cool.py for the new lexer --- src/cool.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cool.py b/src/cool.py index 643241064..7bc2352d5 100644 --- a/src/cool.py +++ b/src/cool.py @@ -11,8 +11,8 @@ s = f.read() lexer = COOL_Lexer() -lexer.build() -tokens = list(lexer.tokenize(s)) +lexer.input(s) +a = list(lexer.output) if lexer.errors: for e in lexer.errors: print(e) @@ -44,4 +44,4 @@ print(e) exit(1) -exit(0) \ No newline at end of file +exit(0) From 2bc9dd824851e1ee8b0a2d48cd66543c0f68f362 Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Tue, 22 Feb 2022 05:12:53 -0500 Subject: [PATCH 12/81] Better docker setup for development --- Makefile | 7 +++++++ docker-compose.yml | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..91c1211ca --- /dev/null +++ b/Makefile @@ -0,0 +1,7 @@ +pytest: + docker-compose run compiler make test + +compile: + docker-compose run compiler python3 cool.py program.cl + + diff --git a/docker-compose.yml b/docker-compose.yml index 7385c9329..755042489 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.7" services: compiler: build: . - command: make test working_dir: /cool-compiler-2021/src volumes: - - ./:/cool-compiler-2021 + - .//:/cool-compiler-2021 + From a290d977a4dc9c7a33ccb44f32f036ab617e1a6e Mon Sep 17 00:00:00 2001 From: Amy Date: Wed, 23 Feb 2022 03:23:59 -0500 Subject: [PATCH 13/81] Add Ast CIL and implement part of the building Ast CIL tour --- src/code_generator/ast_CIL.py | 277 +++++++++++++++++++++++++++++ src/code_generator/generate_ast.py | 209 ++++++++++++++++++++++ src/code_generator/test.txt | 6 + src/cool.py | 7 +- 4 files changed, 498 insertions(+), 1 deletion(-) create mode 100644 src/code_generator/ast_CIL.py create mode 100644 src/code_generator/generate_ast.py create mode 100644 src/code_generator/test.txt diff --git a/src/code_generator/ast_CIL.py b/src/code_generator/ast_CIL.py new file mode 100644 index 000000000..253748691 --- /dev/null +++ b/src/code_generator/ast_CIL.py @@ -0,0 +1,277 @@ + +from attr import attributes +from matplotlib.pyplot import cla + + +class CILNode: + pass + + +class CILProgramNode(CILNode): + def __init__(self, types, data, functions) : + self.types = types + self.data = data + self.functions = functions + + def __str__(self): + text = "ProgramNode:\n\n" + text += "Types:\n" + for t in self.types: + text += str(t) + "\n" + text += "Data:\n" + for d in self.data: + text += str(d) + '\n' + text += "Functions:\n" + print(str(self.functions) + " gggg") + for f in self.functions: + text += str(f) + '\n' + return text + + +class CILTypeNode(CILNode): + def __init__(self, id, attributes, methods): + self.id = id + self.attributes = attributes + self.methods = methods + + def __str__(self): + text = "TypeNode:\n" + text += f"id: {self.id}\n" + text += "Attributes:\n" + for a in self.attributes: + text += str(a) + '\n' + text += "Methods:\n" + for m in self.methods: + text += str(m) + '\n' + return text + + +class CILDataNode(CILNode): + def __init__(self, id, text): + self.id = id + self.text = text + + def __str__(self): + text = "DataNode:\n" + text += f" id: {self.id}\n" + text += f" text: {self.text}\n" + return text + + +class CILFuncNode(CILNode): + def __init__(self, id, params, locals, instructions): + self.id = id + self.params = params + self.locals = locals + self.instructions = instructions + + def __str__(self): + text = "FuncNode:\n" + text += f"id: {self.id}\n" + text += f"Params:\n" + for p in self.params: + text += str(p) + '\n' + text += f"Locals:\n" + for l in self.locals: + text += str(l) + '\n' + text += f"Instructions:\n" + for i in self.instructions: + text += str(i) + '\n' + return text + + +class CILAttributeNode(CILNode): + def __init__(self, id ,type): + self.id = id + self.type = type + + def __str__(self): + text = "AttributeNode:\n" + text += f"id: {self.id}\n" + text += f"type: {self.type}\n" + return text + +class CILMethodNode(CILNode): + def __init__(self, id, function_id): + self.id = id + self.function_id = function_id + + def __str__(self): + text = "MethodNode:\n" + text += f"id: {self.id}\n" + text += f"function_id: {self.function_id}\n" + return text + +class CILParamNode(CILNode): + def __init__(self, id, type): + self.id = id + self.type = type + + def __str__(self): + text = "ParamNode:\n" + text += f"id: {self.id}\n" + text += f"type: {self.type}\n" + return text + +class CILLocalNode(CILNode): + def __init__(self, id, type): + self.id = id + self.type = type + + def __str__(self): + text = "LocalNode:\n" + text += f"id: {self.id}\n" + text += f"type: {self.type}\n" + return text + +#Instructions +class CILInstructionNode(CILNode): + pass + +class CILAssignNode(CILInstructionNode): + def __init__(self, id, expr): + self.id = id + self.expr = expr + + def __str__(self): + text = "AssignNode:\n" + text += f"id: {self.id}\n" + text += f"expr: {self.expr}\n" + return text + +# id.attr = var +class CILSetAttributeNode(CILInstructionNode): + def __init__(self, type, attr , var): + self.type = type + self.attr = attr + self.var = var + +class CILArgNode (CILInstructionNode): + def __init__(self, var): + self.var = var + +class CILIfGotoNode (CILInstructionNode): + def __init__(self, var, label): + self.var = var + self.label = label + +class CILGotoNode (CILInstructionNode): + def __init__(self, label): + self.label = label + +class CILLabelNode (CILInstructionNode): + def __init__(self, id): + self.id = id + +class CILReturnNode (CILInstructionNode): + def __init__(self, var = None): + self.var = var + +class CILPrint (CILInstructionNode): + def __init__(self, var): + self.var = var + +#Expressions +class CILExpressionNode(CILNode): + pass + +class CILBinaryOperationNode (CILExpressionNode): + def __init__(self, left, right): + self.left = left + self.right = right + + def __str__(self): + text = "BinaryNode:\n" + text += f"left: {self.left}\n" + text += f"right: {self.right}\n" + return text + +class CILGetAttribute(CILExpressionNode): + def __init__(self, var, attr): + self.var = var + self.attr = attr + +class CILAllocateNode (CILExpressionNode): + def __init__(self, type): + self.type = type + +class CILTypeOfNode (CILExpressionNode): + def __init__(self, var): + self.var = var + +class CILCallNode (CILExpressionNode): + def __init__(self, func): + self.func = func + +class CILVCallNode (CILExpressionNode): + def __init__(self, type, func): + self.type = type + self.func = func + +class CILLoadNode (CILExpressionNode): + def __init__(self, var): + self.var = var + +class CILLengthNode (CILExpressionNode): + def __init__(self, var): + self.var = var + +class CILStrNode (CILExpressionNode): + def __init__(self, var): + self.var = var + +class CILReadNode (CILExpressionNode): + pass + +class CILAtomicNode (CILExpressionNode): + def __init__(self, lex): + self.lex = lex + + def __str__(self): + text = "AtomicNode:\n" + text += f"lex: {self.lex}\n" + return text + +class CILVariableNode (CILAtomicNode): + pass + +class CILStringNode (CILAtomicNode): + pass + +class CILNumberNode (CILAtomicNode): + pass + +# Arithmetic Operations +class CILPlusNode(CILBinaryOperationNode): + pass + + +class CILMinusNode(CILBinaryOperationNode): + pass + + +class CILStarNode(CILBinaryOperationNode): + pass + + +class CILDivNode(CILBinaryOperationNode): + pass + + +# Comparison Operations +class CILLessNode(CILBinaryOperationNode): + pass + + +class CILElessNode(CILBinaryOperationNode): + pass + + +class CILEqualsNode(CILBinaryOperationNode): + pass + + + + + + \ No newline at end of file diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py new file mode 100644 index 000000000..bde72a7ff --- /dev/null +++ b/src/code_generator/generate_ast.py @@ -0,0 +1,209 @@ +from ast import Expression +from math import exp +from threading import local +from parsing.ast import * +from cmp.semantic import Scope +from cmp.semantic import ObjectType, IntType, StringType, BoolType, ErrorType, SelfType +import cmp.visitor as visitor +from .ast_CIL import * + + +class CILScope : + def __init__(self): + self.let_count = 0 + self.if_count = 0 + self.variables_count = 0 + self.locals = [] + self.instructions= [] + self.data = [] + self.functions = [] + self.current_class = "" + +#pending +def create_init_class(attributes, expresions): + for attr,expr in zip(attributes,expresions): + assig = CILAssignNode (attr.id,expr) + +class CIL: + def __init__(self): + self.scope = CILScope() + + @visitor.on('node') + def visit(self, node, scope): + pass + + @visitor.when(ProgramNode) + def visit(self, node): + types = [] + self.scope.locals = [] + self.scope.instuctions = [] + for dec in node.declarations:# organizar de modo q quede el main de primero + (type,expressions) = self.visit( dec) + types.append(type) + #init_class = create_init_class (type.attributes,expressions) + #self.scope.functions.append (init_class) + self.scope.locals = [] + self.scope.instuctions = [] + return CILProgramNode(types, self.scope.data, self.scope.functions) + + @visitor.when(ClassDeclarationNode) + def visit(self, node): + self.scope.current_class = node.id + attributes = [] + expressions = [] + methods = [] + for feature in node.features: + if isinstance (feature,AttrDeclarationNode): + attr = self.visit(feature) + attributes.append(attr) + expression = self.visit(feature.expr) + expressions.append(expression) + else: + function = self.visit(feature) + self.scope.functions.append(function) + methods.append(CILMethodNode(feature.id, function.id)) + + methods.append(CILMethodNode('init', f'init_{node.id}')) + return (CILTypeNode (node.id, attributes,methods),expressions) + + @visitor.when(AttrDeclarationNode) + def visit(self, node): + return CILAttributeNode (node.id, node.type) + + @visitor.when(FuncDeclarationNode) + def visit(self, node): + params = [] + self.scope.instructions = [] + self.scope.locals = [] + for param in node.params: + id = param.id + type = param.type + param_node = CILParamNode(id, type) + params.append(param_node) + self.visit(node.expr) + return CILFuncNode(f'{node.id}_{self.scope.current_class}', params, self.scope.locals, self.scope.instructions) + + @visitor.when(BlockNode) + def visit(self, node): + for expr in node.expr_lis: + self.visit(expr) + + + @visitor.when(DispatchNode) + def visit(self, node): + pass + + @visitor.when(ConditionalNode) + def visit(self, node): + pass + + @visitor.when(LetNode) + def visit(self, node): + for variable in node.variables: + self.visit(variable) + temp_name = f't{self.scope.variables_count}' + self.scope.variables_count += 1 + expr = self.visit(node.expr) + self.scope.instructions.append(CILAssignNode( temp_name, expr)) + local = CILLocalNode(temp_name,node.computed_type.name) + self.scope.locals.append(local) + + @visitor.when(VarDeclarationNode) + def visit(self, node): + local = CILLocalNode(node.id,node.type) + self.scope.locals.append(local) + if node.expr is not None: + expr = self.visit(node.expr) + instruction = CILAssignNode (node.id, expr) + self.scope.instructions.append(instruction) + + @visitor.when(LoopNode) + def visit(self, node): + pass + + @visitor.when(CaseNode) + def visit(self, node): + pass + + @visitor.when(CaseAttrNode) + def visit(self, node): + pass + + @visitor.when(AssignNode) + def visit(self, node): + exp = self.visit(node.expr) + return CILAssignNode(node.id.id, exp) + + @visitor.when(BinaryNode) + def visit(self, node): + if not isinstance(node.left, AtomicNode): + name = "t" + str(self.scope.variables_count) + self.scope.variables_count += 1 + type = node.left.computed_type.name + self.scope.locals.append(CILLocalNode(name, type)) + expr = self.visit(node.left) + self.scope.instructions.append(CILAssignNode(name, expr)) + left = CILVariableNode(name) + else: + left = self.visit(node.left) + + if not isinstance(node.right, AtomicNode): + name = "t" + str(self.scope.variables_count) + self.scope.variables_count +=1 + type = node.right.computed_type.name + self.scope.locals.append(CILLocalNode(name, type)) + expr = self.visit(node.right) + self.scope.instructions.append(CILAssignNode(name, expr)) + right = CILVariableNode(name) + else: + right = self.visit(node.right) + + if isinstance(node, PlusNode): + return CILPlusNode(left, right) + elif isinstance(node, MinusNode): + return CILMinusNode(left, right) + elif isinstance(node, DivNode): + return CILDivNode(left, right) + elif isinstance(node, StarNode): + return CILStarNode(left, right) + elif isinstance(node, ElessNode): + return CILElessNode(left, right) + elif isinstance(node, LessNode): + return CILLessNode(left, right) + else: + return CILEqualsNode(left, right) + + @visitor.when(PrimeNode) + def visit(self, node): + pass + + @visitor.when(NotNode) + def visit(self, node): + pass + @visitor.when(StringNode) + def visit(self, node): + pass + + @visitor.when(IsVoidNode) + def visit(self, node): + pass + + @visitor.when(ConstantNumNode) + def visit(self, node): + return CILNumberNode(node.lex) + + @visitor.when(VariableNode) + def visit(self, node): + return CILVariableNode(node.lex) + + @visitor.when(TrueNode) + def visit(self, node): + pass + + @visitor.when(FalseNode) + def visit(self, node): + pass + + @visitor.when(InstantiateNode) + def visit(self, node): + pass diff --git a/src/code_generator/test.txt b/src/code_generator/test.txt new file mode 100644 index 000000000..969605d40 --- /dev/null +++ b/src/code_generator/test.txt @@ -0,0 +1,6 @@ + +class Main { + main(a : Int) : Int { + let y : Int <- 3 in (a + y) + 3 + }; +}; \ No newline at end of file diff --git a/src/cool.py b/src/cool.py index 7bc2352d5..da81bfe63 100644 --- a/src/cool.py +++ b/src/cool.py @@ -4,6 +4,7 @@ from tours.TypeCollector import TypeCollector from tours.TypeBuilder import TypeBuilder from tours.TypeChecker import TypeChecker +from code_generator.generate_ast import CIL input_file = sys.argv[1] @@ -37,11 +38,15 @@ # Checking Types checker = TypeChecker(context, errors) -scope = checker.visit(ast) +checker.visit(ast) if errors: for e in errors: print(e) exit(1) + +cil_generator = CIL() +cil = cil_generator.visit(ast) +print(cil) exit(0) From 2618bf40923e86974be619308dd7897701331d41 Mon Sep 17 00:00:00 2001 From: Amy Date: Thu, 24 Feb 2022 05:41:02 -0500 Subject: [PATCH 14/81] Update CIL ast and update CIL tour --- src/code_generator/ast_CIL.py | 40 ++++- src/code_generator/generate_ast.py | 178 +++++++++++++++------- src/code_generator/temp.py | 237 +++++++++++++++++++++++++++++ src/code_generator/test.txt | 7 +- src/tours/TypeChecker.py | 4 +- 5 files changed, 400 insertions(+), 66 deletions(-) create mode 100644 src/code_generator/temp.py diff --git a/src/code_generator/ast_CIL.py b/src/code_generator/ast_CIL.py index 253748691..93b60416c 100644 --- a/src/code_generator/ast_CIL.py +++ b/src/code_generator/ast_CIL.py @@ -118,7 +118,7 @@ def __init__(self, id, type): self.id = id self.type = type - def __str__(self): + def __repr__(self): text = "LocalNode:\n" text += f"id: {self.id}\n" text += f"type: {self.type}\n" @@ -141,10 +141,19 @@ def __str__(self): # id.attr = var class CILSetAttributeNode(CILInstructionNode): - def __init__(self, type, attr , var): + def __init__(self, id, type, attr , var): + self.id = id self.type = type self.attr = attr self.var = var + + def __str__(self): + text = "SetAttrNode:\n" + text += f"id: {self.id}\n" + text += f"type: {self.type}\n" + text += f"att: {self.attr}\n" + text += f"var: {self.var}\n" + return text class CILArgNode (CILInstructionNode): def __init__(self, var): @@ -165,8 +174,13 @@ def __init__(self, id): class CILReturnNode (CILInstructionNode): def __init__(self, var = None): - self.var = var - + self.var = var + + def __str__(self): + text = "ReturnNode:\n" + if self.var is not None: + text += f"var: {self.var}\n" + return text class CILPrint (CILInstructionNode): def __init__(self, var): self.var = var @@ -187,9 +201,18 @@ def __str__(self): return text class CILGetAttribute(CILExpressionNode): - def __init__(self, var, attr): + def __init__(self, var, type, attr): self.var = var + self.type = type self.attr = attr + + def __str__(self): + text = "GetAttrNode:\n" + text += f"var: {self.var}\n" + text += f"type: {self.type}\n" + text += f"att: {self.attr}\n" + return text + class CILAllocateNode (CILExpressionNode): def __init__(self, type): @@ -233,7 +256,12 @@ def __str__(self): return text class CILVariableNode (CILAtomicNode): - pass + pass + +class CILTypeConstantNode(CILAtomicNode): + pass + + class CILStringNode (CILAtomicNode): pass diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index bde72a7ff..22d1980c1 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -1,29 +1,65 @@ -from ast import Expression -from math import exp -from threading import local from parsing.ast import * -from cmp.semantic import Scope -from cmp.semantic import ObjectType, IntType, StringType, BoolType, ErrorType, SelfType -import cmp.visitor as visitor from .ast_CIL import * +import cmp.visitor as visitor + -class CILScope : +class CILScope: def __init__(self): self.let_count = 0 self.if_count = 0 + self.case_count = 0 self.variables_count = 0 + self.locals = [] - self.instructions= [] + self.all_locals = [] + self.instructions = [] self.data = [] self.functions = [] + self.current_class = "" + def add_local(self, id, type, is_param = False): + local_dict = self.locals[-1] + if id in local_dict.keys(): + nickname = local_dict[id].id + local_dict[id] = CILLocalNode(nickname, CILTypeConstantNode(type)) + else: + nickname = f'{id}_{self.variables_count}' + self.variables_count += 1 + node = CILLocalNode(nickname, CILTypeConstantNode(type)) + local_dict[id] = node + + if not is_param: + self.all_locals.append(node) + + return nickname + + def add_new_local(self, type): + local_dict = self.locals[-1] + name = f't_{self.variables_count}' + self.variables_count += 1 + node = CILLocalNode(name, CILTypeConstantNode(type)) + local_dict[name] = node + self.all_locals.append(node) + return name + + def find_local(self, id): + + for i in range (len(self.locals) - 1 , -1, -1): + d = self.locals[i] + try: + return d[id] + except: + pass + return None + #pending def create_init_class(attributes, expresions): for attr,expr in zip(attributes,expresions): assig = CILAssignNode (attr.id,expr) + class CIL: def __init__(self): self.scope = CILScope() @@ -35,60 +71,71 @@ def visit(self, node, scope): @visitor.when(ProgramNode) def visit(self, node): types = [] - self.scope.locals = [] - self.scope.instuctions = [] - for dec in node.declarations:# organizar de modo q quede el main de primero - (type,expressions) = self.visit( dec) + for d in node.declarations: # TODO organizar de modo q quede el main de primero + type = self.visit(d) types.append(type) - #init_class = create_init_class (type.attributes,expressions) - #self.scope.functions.append (init_class) - self.scope.locals = [] - self.scope.instuctions = [] + return CILProgramNode(types, self.scope.data, self.scope.functions) @visitor.when(ClassDeclarationNode) def visit(self, node): self.scope.current_class = node.id + attributes = [] expressions = [] methods = [] for feature in node.features: - if isinstance (feature,AttrDeclarationNode): + if isinstance (feature, AttrDeclarationNode): attr = self.visit(feature) attributes.append(attr) - expression = self.visit(feature.expr) - expressions.append(expression) + if feature.expr is not None: + expr = self.visit(feature.expr) + expressions.append(expr) else: function = self.visit(feature) self.scope.functions.append(function) methods.append(CILMethodNode(feature.id, function.id)) - methods.append(CILMethodNode('init', f'init_{node.id}')) - return (CILTypeNode (node.id, attributes,methods),expressions) + methods.append(CILMethodNode('init', f'init_{node.id}')) + # use expressions here + #init_class = create_init_class (type.attributes,expressions) + #self.scope.functions.append (init_class) + + # herencia + + return CILTypeNode(node.id, attributes, methods) @visitor.when(AttrDeclarationNode) def visit(self, node): - return CILAttributeNode (node.id, node.type) + return CILAttributeNode(node.id, CILTypeConstantNode(node.type)) @visitor.when(FuncDeclarationNode) def visit(self, node): - params = [] + self.scope.locals = [{}] self.scope.instructions = [] - self.scope.locals = [] + + params = [] + param_node = CILParamNode(CILVariableNode(f'self_{self.scope.current_class}'), CILTypeConstantNode(self.scope.current_class)) + params.append(param_node) + for param in node.params: - id = param.id - type = param.type - param_node = CILParamNode(id, type) + param_node = CILParamNode(param.id, CILTypeConstantNode(param.type)) params.append(param_node) - self.visit(node.expr) - return CILFuncNode(f'{node.id}_{self.scope.current_class}', params, self.scope.locals, self.scope.instructions) + self.scope.add_local(param.id, param.type, True) + + expr = self.visit(node.expr) + new_var = self.scope.add_new_local(node.type) + self.scope.instructions.append(CILAssignNode(CILVariableNode (new_var), expr)) + self.scope.instructions.append(CILReturnNode(CILVariableNode (new_var))) + return CILFuncNode(f'{node.id}_{self.scope.current_class}', params, self.scope.all_locals, self.scope.instructions) @visitor.when(BlockNode) def visit(self, node): - for expr in node.expr_lis: - self.visit(expr) + for i in range(0, len(node.expr_lis) - 1): + self.visit(node.expr_lis[i]) # Necesary instructions are added, but there is not sense to keep the expression + expr = node.expr_lis[len(node.expr_lis) - 1] + return self.visit(expr) - @visitor.when(DispatchNode) def visit(self, node): pass @@ -99,61 +146,72 @@ def visit(self, node): @visitor.when(LetNode) def visit(self, node): + self.scope.locals.append({}) for variable in node.variables: self.visit(variable) - temp_name = f't{self.scope.variables_count}' - self.scope.variables_count += 1 expr = self.visit(node.expr) - self.scope.instructions.append(CILAssignNode( temp_name, expr)) - local = CILLocalNode(temp_name,node.computed_type.name) - self.scope.locals.append(local) + self.scope.locals.pop() + return expr @visitor.when(VarDeclarationNode) def visit(self, node): - local = CILLocalNode(node.id,node.type) - self.scope.locals.append(local) + name = self.scope.add_local(node.id, node.type) if node.expr is not None: expr = self.visit(node.expr) - instruction = CILAssignNode (node.id, expr) + instruction = CILAssignNode(CILVariableNode(name), expr) self.scope.instructions.append(instruction) - + @visitor.when(LoopNode) def visit(self, node): pass @visitor.when(CaseNode) def visit(self, node): - pass + expr = self.visit(node.expr) + var_name = f't{self.scope.variables_count}' + self.scope.variables_count += 1 + + self.scope.locals.append(CILLocalNode(var_name, None)) + self.scope.instructions.append(CILAssignNode(var_name, expr)) + typeof = CILTypeOfNode(var_name) + self.scope.instructions.append(CILAssignNode(var_name, typeof)) + + for case in node.cases: + self.visit(case) @visitor.when(CaseAttrNode) def visit(self, node): - pass - + #local = mself.scope.add_new_local(node.id) + self.scope.instructions.append(CILLabelNode(case_label)) + expresion_branch = self.visit(node.expr) + @visitor.when(AssignNode) def visit(self, node): - exp = self.visit(node.expr) - return CILAssignNode(node.id.id, exp) + var = self.visit(node.expr) + local = self.scope.find_local(node.id.lex) + + if local is not None: + self.scope.instructions.append(CILAssignNode(CILVariableNode(local.id), var)) + return CILVariableNode(local.id) + else: + self.scope.instructions.append(CILSetAttributeNode(CILVariableNode(f'self_{self.scope.current_class}'), CILTypeConstantNode(self.scope.current_class), CILVariableNode(node.id.lex), var)) + return var @visitor.when(BinaryNode) def visit(self, node): if not isinstance(node.left, AtomicNode): - name = "t" + str(self.scope.variables_count) - self.scope.variables_count += 1 - type = node.left.computed_type.name - self.scope.locals.append(CILLocalNode(name, type)) + name = self.scope.add_new_local(node.left.computed_type.name) expr = self.visit(node.left) - self.scope.instructions.append(CILAssignNode(name, expr)) + self.scope.instructions.append(CILAssignNode(CILVariableNode(name), expr)) left = CILVariableNode(name) + else: left = self.visit(node.left) if not isinstance(node.right, AtomicNode): - name = "t" + str(self.scope.variables_count) - self.scope.variables_count +=1 - type = node.right.computed_type.name - self.scope.locals.append(CILLocalNode(name, type)) + name = self.scope.add_new_local(node.right.computed_type.name) expr = self.visit(node.right) - self.scope.instructions.append(CILAssignNode(name, expr)) + self.scope.instructions.append(CILAssignNode(CILVariableNode(name), expr)) right = CILVariableNode(name) else: right = self.visit(node.right) @@ -194,7 +252,13 @@ def visit(self, node): @visitor.when(VariableNode) def visit(self, node): - return CILVariableNode(node.lex) + local = self.scope.find_local(node.lex) + if local is not None: + return CILVariableNode(local.id) + else: + return CILGetAttribute(CILVariableNode(f'self_{self.scope.current_class}'), CILTypeConstantNode(self.scope.current_class), CILVariableNode(node.lex)) + + @visitor.when(TrueNode) def visit(self, node): diff --git a/src/code_generator/temp.py b/src/code_generator/temp.py new file mode 100644 index 000000000..c39e753a7 --- /dev/null +++ b/src/code_generator/temp.py @@ -0,0 +1,237 @@ +from ast import Expression, expr +from math import exp +from threading import local +from parsing.ast import * +from cmp.semantic import Scope +from cmp.semantic import ObjectType, IntType, StringType, BoolType, ErrorType, SelfType +import cmp.visitor as visitor +from .ast_CIL import * + + +class CILScope : + def __init__(self, context,scope): + self.let_count = 0 + self.if_count = 0 + self.case_count = 0 + self.variables_count = 0 + self.locals = [] + self.instructions= [] + self.data = [] + self.functions = [] + self.current_class = "" + self.context = context + self.scope = scope + +#pending +def create_init_class(attributes, expresions): + for attr,expr in zip(attributes,expresions): + assig = CILAssignNode (attr.id,expr) + +class CIL: + def __init__(self): + self.scope = CILScope() + + @visitor.on('node') + def visit(self, node, scope): + pass + + @visitor.when(ProgramNode) + def visit(self, node): + types = [] + self.scope.locals = [] + self.scope.instuctions = [] + for dec in node.declarations:# organizar de modo q quede el main de primero + (type,expressions) = self.visit( dec) + types.append(type) + #init_class = create_init_class (type.attributes,expressions) + #self.scope.functions.append (init_class) + self.scope.locals = [] + self.scope.instuctions = [] + return CILProgramNode(types, self.scope.data, self.scope.functions) + + @visitor.when(ClassDeclarationNode) + def visit(self, node): + self.scope.current_class = node.id + attributes = [] + expressions = [] + methods = [] + for feature in node.features: + if isinstance (feature,AttrDeclarationNode): + attr = self.visit(feature) + attributes.append(attr) + expression = self.visit(feature.expr) + expressions.append(expression) + else: + function = self.visit(feature) + self.scope.functions.append(function) + methods.append(CILMethodNode(feature.id, function.id)) + + methods.append(CILMethodNode('init', f'init_{node.id}')) + return (CILTypeNode (node.id, attributes,methods),expressions) + + @visitor.when(AttrDeclarationNode) + def visit(self, node): + return CILAttributeNode (node.id, node.type) + + @visitor.when(FuncDeclarationNode) + def visit(self, node): + params = [] + self.scope.instructions = [] + self.scope.locals = [] + for param in node.params: + id = param.id + type = param.type + param_node = CILParamNode(id, type) + params.append(param_node) + self.visit(node.expr) + return CILFuncNode(f'{node.id}_{self.scope.current_class}', params, self.scope.locals, self.scope.instructions) + + @visitor.when(BlockNode) + def visit(self, node): + for expr in node.expr_lis: + self.visit(expr) + + + @visitor.when(DispatchNode) + def visit(self, node): + pass + + @visitor.when(ConditionalNode) + def visit(self, node): + pass + + @visitor.when(LetNode) + def visit(self, node): + for variable in node.variables: + self.visit(variable) + temp_name = f't{self.scope.variables_count}' + self.scope.variables_count += 1 + expr = self.visit(node.expr) + self.scope.instructions.append(CILAssignNode( temp_name, expr)) + local = CILLocalNode(temp_name, CILTypeConstantNode(node.computed_type.name)) + self.scope.locals.append(local) + + @visitor.when(VarDeclarationNode) + def visit(self, node): + local = CILLocalNode(node.id,CILTypeConstantNode(node.type)) + self.scope.locals.append(local) + if node.expr is not None: + expr = self.visit(node.expr) + instruction = CILAssignNode (node.id, expr) + self.scope.instructions.append(instruction) + + + @visitor.when(LoopNode) + def visit(self, node): + pass + + @visitor.when(CaseNode) + def visit(self, node): + expr = self.visit(node.expr) + var_name = f't{self.scope.variables_count}' + self.scope.variables_count += 1 + + self.scope.locals.append(CILLocalNode(var_name, None)) + self.scope.instructions.append(CILAssignNode(var_name, expr)) + typeof = CILTypeOfNode(var_name) + self.scope.instructions.append(CILAssignNode(var_name, typeof)) + + for case in node.cases: + self.visit(case) + + @visitor.when(CaseAttrNode) + def visit(self, node): + case_label = f'c{self.scope.case_count}' + self.scope.case_count += 1 + self.scope.instructions.append(CILLabelNode(case_label)) + expresion_branch = self.visit(node.expr) + + + @visitor.when(AssignNode) + def visit(self, node): + exp = self.visit(node.expr) + type_class = self.context.get_type(self.scope.current_class) + try: + type_var = type_class.get_attribute(node.id).type + type_node = CILTypeConstantNode(type_var) + return CILSetAttributeNode(type_node, node.id.id , exp) + except: + return CILAssignNode(node.id.id, exp) + + @visitor.when(BinaryNode) + def visit(self, node): + if not isinstance(node.left, AtomicNode): + name = "t" + str(self.scope.variables_count) + self.scope.variables_count += 1 + type = node.left.computed_type.name + self.scope.locals.append(CILLocalNode(name, CILTypeConstantNode(type))) + expr = self.visit(node.left) + self.scope.instructions.append(CILAssignNode(name, expr)) + left = CILVariableNode(name) + else: + left = self.visit(node.left) + + if not isinstance(node.right, AtomicNode): + name = "t" + str(self.scope.variables_count) + self.scope.variables_count +=1 + type = node.right.computed_type.name + self.scope.locals.append(CILLocalNode(name, CILTypeConstantNode(type))) + expr = self.visit(node.right) + self.scope.instructions.append(CILAssignNode(name, expr)) + right = CILVariableNode(name) + else: + right = self.visit(node.right) + + if isinstance(node, PlusNode): + return CILPlusNode(left, right) + elif isinstance(node, MinusNode): + return CILMinusNode(left, right) + elif isinstance(node, DivNode): + return CILDivNode(left, right) + elif isinstance(node, StarNode): + return CILStarNode(left, right) + elif isinstance(node, ElessNode): + return CILElessNode(left, right) + elif isinstance(node, LessNode): + return CILLessNode(left, right) + else: + return CILEqualsNode(left, right) + + @visitor.when(PrimeNode) + def visit(self, node): + pass + + @visitor.when(NotNode) + def visit(self, node): + pass + @visitor.when(StringNode) + def visit(self, node): + pass + + @visitor.when(IsVoidNode) + def visit(self, node): + pass + + @visitor.when(ConstantNumNode) + def visit(self, node): + return CILNumberNode(node.lex) + + @visitor.when(VariableNode) + def visit(self, node): + locals_variables = [ var for var in self.scope.locals if var.id == node.lex ] + params_ = [var for var in self.scope.pa if var.id == node.lex ] + type_node = CILTypeConstantNode(type_var) + return CILGetAttribute(type_node,node.lex) + CILVariableNode(node.lex) + + @visitor.when(TrueNode) + def visit(self, node): + pass + + @visitor.when(FalseNode) + def visit(self, node): + pass + + @visitor.when(InstantiateNode) + def visit(self, node): + pass diff --git a/src/code_generator/test.txt b/src/code_generator/test.txt index 969605d40..2f6df2287 100644 --- a/src/code_generator/test.txt +++ b/src/code_generator/test.txt @@ -1,6 +1,11 @@ class Main { + w : Int; + main(a : Int) : Int { - let y : Int <- 3 in (a + y) + 3 + { + w <- 3; + let y : Int <- 3 in (a + y) + w; + } }; }; \ No newline at end of file diff --git a/src/tours/TypeChecker.py b/src/tours/TypeChecker.py index c04886647..07968a831 100644 --- a/src/tours/TypeChecker.py +++ b/src/tours/TypeChecker.py @@ -250,8 +250,8 @@ def visit(self, node, scope): if scope.is_local(node.id): scope.remove_variable(node.id) - else: - scope.define_variable(node.id, var_type) + + scope.define_variable(node.id, var_type) node.computed_type = var_type From 512ae304edd8cccb39bf6a3022b7351b07b0bb8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karla=20Olivera=20Hern=C3=A1ndez?= Date: Thu, 24 Feb 2022 13:55:26 -0500 Subject: [PATCH 15/81] Implement DispatchNode logic in CIL ast generator --- src/code_generator/ast_CIL.py | 153 ++++++++++++++++++++++------- src/code_generator/generate_ast.py | 46 +++++++-- src/parsing/lexer.py | 4 - src/parsing/parser.py | 7 +- 4 files changed, 155 insertions(+), 55 deletions(-) diff --git a/src/code_generator/ast_CIL.py b/src/code_generator/ast_CIL.py index 93b60416c..264407143 100644 --- a/src/code_generator/ast_CIL.py +++ b/src/code_generator/ast_CIL.py @@ -1,4 +1,3 @@ - from attr import attributes from matplotlib.pyplot import cla @@ -22,7 +21,6 @@ def __str__(self): for d in self.data: text += str(d) + '\n' text += "Functions:\n" - print(str(self.functions) + " gggg") for f in self.functions: text += str(f) + '\n' return text @@ -91,6 +89,7 @@ def __str__(self): text += f"type: {self.type}\n" return text + class CILMethodNode(CILNode): def __init__(self, id, function_id): self.id = id @@ -102,6 +101,7 @@ def __str__(self): text += f"function_id: {self.function_id}\n" return text + class CILParamNode(CILNode): def __init__(self, id, type): self.id = id @@ -113,6 +113,7 @@ def __str__(self): text += f"type: {self.type}\n" return text + class CILLocalNode(CILNode): def __init__(self, id, type): self.id = id @@ -124,10 +125,12 @@ def __repr__(self): text += f"type: {self.type}\n" return text -#Instructions + +# Instructions class CILInstructionNode(CILNode): pass + class CILAssignNode(CILInstructionNode): def __init__(self, id, expr): self.id = id @@ -139,7 +142,7 @@ def __str__(self): text += f"expr: {self.expr}\n" return text -# id.attr = var + class CILSetAttributeNode(CILInstructionNode): def __init__(self, id, type, attr , var): self.id = id @@ -155,24 +158,50 @@ def __str__(self): text += f"var: {self.var}\n" return text -class CILArgNode (CILInstructionNode): + +class CILArgNode(CILInstructionNode): def __init__(self, var): self.var = var + + def __str__(self): + text = "ArgNode:\n" + text += f"var: {self.var}\n" + return text -class CILIfGotoNode (CILInstructionNode): + +class CILIfGotoNode(CILInstructionNode): def __init__(self, var, label): self.var = var self.label = label -class CILGotoNode (CILInstructionNode): + def __str__(self): + text = "IfGotoNode:\n" + text += f"var: {self.var}\n" + text += f"label: {self.label}\n" + return text + + +class CILGotoNode(CILInstructionNode): def __init__(self, label): self.label = label -class CILLabelNode (CILInstructionNode): + def __str__(self): + text = "GotoNode:\n" + text += f"label: {self.label}\n" + return text + + +class CILLabelNode(CILInstructionNode): def __init__(self, id): self.id = id - -class CILReturnNode (CILInstructionNode): + + def __str__(self): + text = "LabelNode:\n" + text += f"id: {self.id}\n" + return text + + +class CILReturnNode(CILInstructionNode): def __init__(self, var = None): self.var = var @@ -181,15 +210,24 @@ def __str__(self): if self.var is not None: text += f"var: {self.var}\n" return text -class CILPrint (CILInstructionNode): + + +class CILPrint(CILInstructionNode): def __init__(self, var): self.var = var -#Expressions + def __str__(self): + text = "PrintNode:\n" + text += f"var: {self.var}\n" + return text + + +# Expressions class CILExpressionNode(CILNode): pass -class CILBinaryOperationNode (CILExpressionNode): + +class CILBinaryOperationNode(CILExpressionNode): def __init__(self, left, right): self.left = left self.right = right @@ -200,6 +238,7 @@ def __str__(self): text += f"right: {self.right}\n" return text + class CILGetAttribute(CILExpressionNode): def __init__(self, var, type, attr): self.var = var @@ -214,39 +253,85 @@ def __str__(self): return text -class CILAllocateNode (CILExpressionNode): +class CILAllocateNode(CILExpressionNode): def __init__(self, type): self.type = type + + def __str__(self): + text = "AllocateNode:\n" + text += f"var: {self.var}\n" + text += f"type: {self.type}\n" + text += f"att: {self.attr}\n" + return text -class CILTypeOfNode (CILExpressionNode): + +class CILTypeOfNode(CILExpressionNode): def __init__(self, var): - self.var = var + self.var = var + + def __str__(self): + text = "TypeOfNode:\n" + text += f"var: {self.var}\n" + return text + -class CILCallNode (CILExpressionNode): +class CILCallNode(CILExpressionNode): def __init__(self, func): self.func = func + + def __str__(self): + text = "CallNode:\n" + text += f"func: {self.func}\n" + return text + -class CILVCallNode (CILExpressionNode): +class CILVCallNode(CILExpressionNode): def __init__(self, type, func): self.type = type self.func = func + + def __str__(self): + text = "VCallNode:\n" + text += f"type: {self.func}\n" + text += f"func: {self.func}\n" + return text + -class CILLoadNode (CILExpressionNode): +class CILLoadNode(CILExpressionNode): def __init__(self, var): self.var = var -class CILLengthNode (CILExpressionNode): + def __str__(self): + text = "LoadNode:\n" + text += f"var: {self.var}\n" + return text + + +class CILLengthNode(CILExpressionNode): def __init__(self, var): self.var = var -class CILStrNode (CILExpressionNode): + def __str__(self): + text = "LengthNode:\n" + text += f"var: {self.var}\n" + return text + + +class CILStringNode(CILExpressionNode): def __init__(self, var): - self.var = var + self.var = var -class CILReadNode (CILExpressionNode): + def __str__(self): + text = "StringNode:\n" + text += f"var: {self.var}\n" + return text + + +class CILReadNode(CILExpressionNode): pass -class CILAtomicNode (CILExpressionNode): + +class CILAtomicNode(CILExpressionNode): def __init__(self, lex): self.lex = lex @@ -255,20 +340,23 @@ def __str__(self): text += f"lex: {self.lex}\n" return text -class CILVariableNode (CILAtomicNode): + +class CILVariableNode(CILAtomicNode): pass + class CILTypeConstantNode(CILAtomicNode): - pass - + pass -class CILStringNode (CILAtomicNode): +class CILStringNode(CILAtomicNode): pass -class CILNumberNode (CILAtomicNode): + +class CILNumberNode(CILAtomicNode): pass + # Arithmetic Operations class CILPlusNode(CILBinaryOperationNode): pass @@ -297,9 +385,4 @@ class CILElessNode(CILBinaryOperationNode): class CILEqualsNode(CILBinaryOperationNode): pass - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 22d1980c1..245464d40 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -1,9 +1,9 @@ +from math import exp from parsing.ast import * from .ast_CIL import * import cmp.visitor as visitor - class CILScope: def __init__(self): self.let_count = 0 @@ -45,7 +45,6 @@ def add_new_local(self, type): return name def find_local(self, id): - for i in range (len(self.locals) - 1 , -1, -1): d = self.locals[i] try: @@ -111,6 +110,7 @@ def visit(self, node): @visitor.when(FuncDeclarationNode) def visit(self, node): + self.scope.all_locals = [] self.scope.locals = [{}] self.scope.instructions = [] @@ -119,14 +119,14 @@ def visit(self, node): params.append(param_node) for param in node.params: - param_node = CILParamNode(param.id, CILTypeConstantNode(param.type)) + name = self.scope.add_local(param.id, param.type, True) + param_node = CILParamNode(name, CILTypeConstantNode(param.type)) params.append(param_node) - self.scope.add_local(param.id, param.type, True) expr = self.visit(node.expr) new_var = self.scope.add_new_local(node.type) - self.scope.instructions.append(CILAssignNode(CILVariableNode (new_var), expr)) - self.scope.instructions.append(CILReturnNode(CILVariableNode (new_var))) + self.scope.instructions.append(CILAssignNode(CILVariableNode(new_var), expr)) + self.scope.instructions.append(CILReturnNode(CILVariableNode(new_var))) return CILFuncNode(f'{node.id}_{self.scope.current_class}', params, self.scope.all_locals, self.scope.instructions) @visitor.when(BlockNode) @@ -138,7 +138,35 @@ def visit(self, node): @visitor.when(DispatchNode) def visit(self, node): - pass + if not isinstance(node.expr, VariableNode) or node.expr.lex != 'self': + expr = self.visit(node.expr) + name = self.scope.add_new_local(None) # TODO revisar el tipo de retorno (idea, a;adir una instruccio typeof) + instruction = CILAssignNode(CILVariableNode(name), expr) + self.scope.instructions.append(instruction) + else: + name = f'self_{self.scope.current_class}' + + args = [] + args.append(CILArgNode(CILVariableNode(name))) + for arg in node.arg: + expr = self.visit(arg) + name_arg = self.scope.add_new_local(None) # TODO lo mismo de arriba + if not isinstance(expr, VariableNode): + instruction = CILAssignNode(CILVariableNode(name_arg), expr) + self.scope.instructions.append(instruction) + args.append(CILArgNode(CILVariableNode(name_arg))) + else: + args.append(CILArgNode(CILVariableNode(expr.lex))) + self.scope.instructions.extend(args) + + if node.type is not None: + expression = CILVCallNode(CILTypeConstantNode(node.type.name), node.id) + else: + expression = CILCallNode(node.id) + new_var = self.scope.add_new_local(None) # TODO + node_var = CILVariableNode(new_var) + self.scope.instructions.append(CILAssignNode(node_var, expression)) + return node_var @visitor.when(ConditionalNode) def visit(self, node): @@ -182,7 +210,7 @@ def visit(self, node): @visitor.when(CaseAttrNode) def visit(self, node): #local = mself.scope.add_new_local(node.id) - self.scope.instructions.append(CILLabelNode(case_label)) + self.scope.instructions.append(CILLabelNode("")) expresion_branch = self.visit(node.expr) @visitor.when(AssignNode) @@ -258,8 +286,6 @@ def visit(self, node): else: return CILGetAttribute(CILVariableNode(f'self_{self.scope.current_class}'), CILTypeConstantNode(self.scope.current_class), CILVariableNode(node.lex)) - - @visitor.when(TrueNode) def visit(self, node): pass diff --git a/src/parsing/lexer.py b/src/parsing/lexer.py index 8ddca5cbf..be55c8ea5 100644 --- a/src/parsing/lexer.py +++ b/src/parsing/lexer.py @@ -60,7 +60,6 @@ def input(self, string): self.current_last_newline = 0 self.output = self.tokenize(string) - def token(self): return next(self.output, None) @@ -225,7 +224,6 @@ def t_newline(self, t): self.prev_last_newline = t.lexer.lexpos self.current_last_newline = t.lexer.lexpos - t_ignore = ' \t\r' ######################################################################## @@ -238,5 +236,3 @@ def t_error(self, t): # not recognized symbol def register_error(self, line, column, text): self.errors.append(f'{line,column} - {text}') - - diff --git a/src/parsing/parser.py b/src/parsing/parser.py index 530ab495b..4082a6cb1 100644 --- a/src/parsing/parser.py +++ b/src/parsing/parser.py @@ -9,8 +9,6 @@ def __init__(self): self.tokens = COOL_Lexer.tokens def parse(self, input_string): - #l = COOL_Lexer() - #l.build() self.lex = COOL_Lexer() self.errors = [] self.parser = yacc.yacc(module=self) @@ -52,7 +50,6 @@ def p_def_class_parent(p): parent_location = (p.lineno(4), p.lexpos(4)) p[0] = ClassDeclarationNode(location,(p[2], type_location),p[6],p[4], parent_location) - @staticmethod def p_feature_list_empty(p): 'feature_list :' @@ -76,7 +73,6 @@ def p_attr(p): type_location = (p.lineno(3), p.lexpos(3)) p[0] = AttrDeclarationNode(location,p[1],(p[3], type_location)) - @staticmethod def p_attr_exp(p): 'def_attr : OBJECTID COLON TYPEID ASSIGN exp SEMICOLON' @@ -151,8 +147,7 @@ def p_iden_init(p): location = (p.lineno(1), p.lexpos(1)) type_location = (p.lineno(3), p.lexpos(3)) p[0] = VarDeclarationNode(location,p[1],(p[3], type_location),p[5]) - - + @staticmethod def p_case_list_single(p): 'case_list : branch' From ec839dfffb93833ab90638102441377d566fd533 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karla=20Olivera=20Hern=C3=A1ndez?= Date: Thu, 24 Feb 2022 22:23:26 -0500 Subject: [PATCH 16/81] Implement CaseNode, StringNode and InstantiateNode logic, in CIL ast generator --- src/code_generator/ast_CIL.py | 14 ++-- src/code_generator/generate_ast.py | 113 +++++++++++++++++++---------- src/cool.py | 2 +- 3 files changed, 83 insertions(+), 46 deletions(-) diff --git a/src/code_generator/ast_CIL.py b/src/code_generator/ast_CIL.py index 264407143..d611674e8 100644 --- a/src/code_generator/ast_CIL.py +++ b/src/code_generator/ast_CIL.py @@ -1,5 +1,4 @@ from attr import attributes -from matplotlib.pyplot import cla class CILNode: @@ -183,7 +182,7 @@ def __str__(self): class CILGotoNode(CILInstructionNode): def __init__(self, label): - self.label = label + self.label = label def __str__(self): text = "GotoNode:\n" @@ -309,7 +308,7 @@ def __str__(self): class CILLengthNode(CILExpressionNode): def __init__(self, var): - self.var = var + self.var = var def __str__(self): text = "LengthNode:\n" @@ -333,7 +332,7 @@ class CILReadNode(CILExpressionNode): class CILAtomicNode(CILExpressionNode): def __init__(self, lex): - self.lex = lex + self.lex = lex def __str__(self): text = "AtomicNode:\n" @@ -349,10 +348,6 @@ class CILTypeConstantNode(CILAtomicNode): pass -class CILStringNode(CILAtomicNode): - pass - - class CILNumberNode(CILAtomicNode): pass @@ -385,4 +380,7 @@ class CILElessNode(CILBinaryOperationNode): class CILEqualsNode(CILBinaryOperationNode): pass + +class CILNotEqualsNode(CILBinaryOperationNode): + pass \ No newline at end of file diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 245464d40..f4a2a71bc 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -5,29 +5,30 @@ class CILScope: - def __init__(self): + def __init__(self, context): self.let_count = 0 self.if_count = 0 self.case_count = 0 self.variables_count = 0 + self.str_count = 0 self.locals = [] self.all_locals = [] self.instructions = [] self.data = [] self.functions = [] - self.current_class = "" - + self.context = context + def add_local(self, id, type, is_param = False): local_dict = self.locals[-1] if id in local_dict.keys(): nickname = local_dict[id].id - local_dict[id] = CILLocalNode(nickname, CILTypeConstantNode(type)) + local_dict[id] = CILLocalNode(nickname, type) else: nickname = f'{id}_{self.variables_count}' self.variables_count += 1 - node = CILLocalNode(nickname, CILTypeConstantNode(type)) + node = CILLocalNode(nickname, type) local_dict[id] = node if not is_param: @@ -39,7 +40,7 @@ def add_new_local(self, type): local_dict = self.locals[-1] name = f't_{self.variables_count}' self.variables_count += 1 - node = CILLocalNode(name, CILTypeConstantNode(type)) + node = CILLocalNode(name, type) local_dict[name] = node self.all_locals.append(node) return name @@ -53,15 +54,26 @@ def find_local(self, id): pass return None -#pending -def create_init_class(attributes, expresions): - for attr,expr in zip(attributes,expresions): - assig = CILAssignNode (attr.id,expr) + def find_data(self, id): + for d in self.data: + if d.id == id: + return d + return None + + def retur_type_of_method (self, name_meth, name_class): + type_class = self.context.get_type(name_class) + method = type_class.get_method(name_meth) + return method.return_type.name + + #pending + def create_init_class(attributes, expresions): + for attr,expr in zip(attributes,expresions): + assig = CILAssignNode (attr.id,expr) class CIL: - def __init__(self): - self.scope = CILScope() + def __init__(self,context): + self.scope = CILScope(context) @visitor.on('node') def visit(self, node, scope): @@ -106,7 +118,7 @@ def visit(self, node): @visitor.when(AttrDeclarationNode) def visit(self, node): - return CILAttributeNode(node.id, CILTypeConstantNode(node.type)) + return CILAttributeNode(node.id, node.type) @visitor.when(FuncDeclarationNode) def visit(self, node): @@ -115,12 +127,12 @@ def visit(self, node): self.scope.instructions = [] params = [] - param_node = CILParamNode(CILVariableNode(f'self_{self.scope.current_class}'), CILTypeConstantNode(self.scope.current_class)) + param_node = CILParamNode(CILVariableNode(f'self_{self.scope.current_class}'), self.scope.current_class) params.append(param_node) for param in node.params: name = self.scope.add_local(param.id, param.type, True) - param_node = CILParamNode(name, CILTypeConstantNode(param.type)) + param_node = CILParamNode(name, param.type) params.append(param_node) expr = self.visit(node.expr) @@ -140,7 +152,7 @@ def visit(self, node): def visit(self, node): if not isinstance(node.expr, VariableNode) or node.expr.lex != 'self': expr = self.visit(node.expr) - name = self.scope.add_new_local(None) # TODO revisar el tipo de retorno (idea, a;adir una instruccio typeof) + name = self.scope.add_new_local(node.expr.computed_type.name) # TODO revisar el tipo de retorno (idea, a;adir una instruccio typeof) instruction = CILAssignNode(CILVariableNode(name), expr) self.scope.instructions.append(instruction) else: @@ -150,7 +162,7 @@ def visit(self, node): args.append(CILArgNode(CILVariableNode(name))) for arg in node.arg: expr = self.visit(arg) - name_arg = self.scope.add_new_local(None) # TODO lo mismo de arriba + name_arg = self.scope.add_new_local(arg.computed_type.name) # TODO lo mismo de arriba if not isinstance(expr, VariableNode): instruction = CILAssignNode(CILVariableNode(name_arg), expr) self.scope.instructions.append(instruction) @@ -160,10 +172,11 @@ def visit(self, node): self.scope.instructions.extend(args) if node.type is not None: - expression = CILVCallNode(CILTypeConstantNode(node.type.name), node.id) + expression = CILVCallNode(node.type.name, node.id) else: expression = CILCallNode(node.id) - new_var = self.scope.add_new_local(None) # TODO + type = self.scope.retur_type_of_method(node.id, self.scope.current_class) + new_var = self.scope.add_new_local(type) # TODO node_var = CILVariableNode(new_var) self.scope.instructions.append(CILAssignNode(node_var, expression)) return node_var @@ -196,22 +209,45 @@ def visit(self, node): @visitor.when(CaseNode) def visit(self, node): expr = self.visit(node.expr) - var_name = f't{self.scope.variables_count}' - self.scope.variables_count += 1 + self.expression_var_case = expr + name = self.scope.add_new_local(node.expr.computed_type.name) + var = CILVariableNode(name) + self.scope.instructions.append(CILAssignNode(var, expr)) - self.scope.locals.append(CILLocalNode(var_name, None)) - self.scope.instructions.append(CILAssignNode(var_name, expr)) - typeof = CILTypeOfNode(var_name) - self.scope.instructions.append(CILAssignNode(var_name, typeof)) + expr_type_of = CILTypeOfNode(var) + name_type_expr = self.scope.add_new_local(node.expr.computed_type.name) + self.scope.instructions.append(CILAssignNode(CILVariableNode(name_type_expr), expr_type_of)) + name_return = self.scope.add_new_local(node.computed_type.name) + return_ = CILVariableNode(name_return) - for case in node.cases: - self.visit(case) - + for case, index in zip(node.cases,range(0,len(node.cases))): + if index != 0: + self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index-1}')) + + case_expr_type_of = CILTypeConstantNode(case.type) + name_var_condition = self.scope.add_new_local(None) + var_condition = CILVariableNode(name_var_condition) + self.scope.instructions.append(CILAssignNode(var_condition, CILNotEqualsNode(CILVariableNode(name_type_expr),case_expr_type_of))) + self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'branch_{self.scope.case_count}_{index}'))) + + expr_attr = self.visit(case) + + self.scope.instructions.append(CILAssignNode(return_, expr_attr)) + + self.scope.instructions.append(CILGotoNode(CILLabelNode(f'case_end{self.scope.case_count}'))) + self.scope.instructions.append(CILLabelNode(f'case_end{ self.scope.case_count}')) + self.scope.case_count += 1 + return return_ + @visitor.when(CaseAttrNode) def visit(self, node): - #local = mself.scope.add_new_local(node.id) - self.scope.instructions.append(CILLabelNode("")) - expresion_branch = self.visit(node.expr) + self.scope.locals.append({}) + local = self.scope.add_local(node.id, node.type) + self.scope.instructions.append(CILAssignNode( CILVariableNode(local), self.expression_var_case)) + + expression_branch = self.visit(node.expr) + self.scope.locals.pop() + return expression_branch @visitor.when(AssignNode) def visit(self, node): @@ -222,7 +258,7 @@ def visit(self, node): self.scope.instructions.append(CILAssignNode(CILVariableNode(local.id), var)) return CILVariableNode(local.id) else: - self.scope.instructions.append(CILSetAttributeNode(CILVariableNode(f'self_{self.scope.current_class}'), CILTypeConstantNode(self.scope.current_class), CILVariableNode(node.id.lex), var)) + self.scope.instructions.append(CILSetAttributeNode(CILVariableNode(f'self_{self.scope.current_class}'), self.scope.current_class, CILVariableNode(node.id.lex), var)) return var @visitor.when(BinaryNode) @@ -266,9 +302,12 @@ def visit(self, node): @visitor.when(NotNode) def visit(self, node): pass + @visitor.when(StringNode) def visit(self, node): - pass + data = CILDataNode(f'str_{self.scope.str_count}', node.lex) + self.scope.data.append(data) + return CILLoadNode(data.id) @visitor.when(IsVoidNode) def visit(self, node): @@ -284,16 +323,16 @@ def visit(self, node): if local is not None: return CILVariableNode(local.id) else: - return CILGetAttribute(CILVariableNode(f'self_{self.scope.current_class}'), CILTypeConstantNode(self.scope.current_class), CILVariableNode(node.lex)) + return CILGetAttribute(CILVariableNode(f'self_{self.scope.current_class}'), self.scope.current_class, CILVariableNode(node.lex)) @visitor.when(TrueNode) def visit(self, node): - pass + return CILNumberNode(1) @visitor.when(FalseNode) def visit(self, node): - pass + return CILNumberNode(0) @visitor.when(InstantiateNode) def visit(self, node): - pass + return CILAllocateNode(CILTypeConstantNode(node.lex)) diff --git a/src/cool.py b/src/cool.py index da81bfe63..be69052b7 100644 --- a/src/cool.py +++ b/src/cool.py @@ -45,7 +45,7 @@ print(e) exit(1) -cil_generator = CIL() +cil_generator = CIL(context) cil = cil_generator.visit(ast) print(cil) From 67da8c512d17f2e9809a1a6ac988698f2bb17842 Mon Sep 17 00:00:00 2001 From: Amy Date: Thu, 24 Feb 2022 22:56:34 -0500 Subject: [PATCH 17/81] Implementation ConditionalNode in CIL Ast generator --- src/code_generator/generate_ast.py | 17 ++- src/code_generator/temp.py | 237 ----------------------------- src/code_generator/test.txt | 11 -- src/test.txt | 15 +- 4 files changed, 23 insertions(+), 257 deletions(-) delete mode 100644 src/code_generator/temp.py delete mode 100644 src/code_generator/test.txt diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index f4a2a71bc..86a2f21af 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -183,7 +183,22 @@ def visit(self, node): @visitor.when(ConditionalNode) def visit(self, node): - pass + exp = self.visit(node.predicate) + name_expr = self.scope.add_new_local("Int") + name_return = self.scope.add_new_local(node.computed_type.name) + var_condition = CILVariableNode(name_expr) + var_return = CILVariableNode(name_return) + self.scope.instructions.append(CILAssignNode(var_condition, exp)) + self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'then_{self.scope.if_count}'))) + count = self.scope.if_count + self.scope.if_count += 1 + exp_else = self.visit(node.elsex) + self.scope.instructions.append(CILAssignNode(var_return, exp_else)) + self.scope.instructions.append(CILGotoNode(CILLabelNode(f'ifend{count}'))) + exp_then = self.visit(node.then) + self.scope.instructions.append(CILAssignNode(var_return, exp_then)) + self.scope.instructions.append(CILLabelNode(f'ifend{count}')) + return var_return @visitor.when(LetNode) def visit(self, node): diff --git a/src/code_generator/temp.py b/src/code_generator/temp.py deleted file mode 100644 index c39e753a7..000000000 --- a/src/code_generator/temp.py +++ /dev/null @@ -1,237 +0,0 @@ -from ast import Expression, expr -from math import exp -from threading import local -from parsing.ast import * -from cmp.semantic import Scope -from cmp.semantic import ObjectType, IntType, StringType, BoolType, ErrorType, SelfType -import cmp.visitor as visitor -from .ast_CIL import * - - -class CILScope : - def __init__(self, context,scope): - self.let_count = 0 - self.if_count = 0 - self.case_count = 0 - self.variables_count = 0 - self.locals = [] - self.instructions= [] - self.data = [] - self.functions = [] - self.current_class = "" - self.context = context - self.scope = scope - -#pending -def create_init_class(attributes, expresions): - for attr,expr in zip(attributes,expresions): - assig = CILAssignNode (attr.id,expr) - -class CIL: - def __init__(self): - self.scope = CILScope() - - @visitor.on('node') - def visit(self, node, scope): - pass - - @visitor.when(ProgramNode) - def visit(self, node): - types = [] - self.scope.locals = [] - self.scope.instuctions = [] - for dec in node.declarations:# organizar de modo q quede el main de primero - (type,expressions) = self.visit( dec) - types.append(type) - #init_class = create_init_class (type.attributes,expressions) - #self.scope.functions.append (init_class) - self.scope.locals = [] - self.scope.instuctions = [] - return CILProgramNode(types, self.scope.data, self.scope.functions) - - @visitor.when(ClassDeclarationNode) - def visit(self, node): - self.scope.current_class = node.id - attributes = [] - expressions = [] - methods = [] - for feature in node.features: - if isinstance (feature,AttrDeclarationNode): - attr = self.visit(feature) - attributes.append(attr) - expression = self.visit(feature.expr) - expressions.append(expression) - else: - function = self.visit(feature) - self.scope.functions.append(function) - methods.append(CILMethodNode(feature.id, function.id)) - - methods.append(CILMethodNode('init', f'init_{node.id}')) - return (CILTypeNode (node.id, attributes,methods),expressions) - - @visitor.when(AttrDeclarationNode) - def visit(self, node): - return CILAttributeNode (node.id, node.type) - - @visitor.when(FuncDeclarationNode) - def visit(self, node): - params = [] - self.scope.instructions = [] - self.scope.locals = [] - for param in node.params: - id = param.id - type = param.type - param_node = CILParamNode(id, type) - params.append(param_node) - self.visit(node.expr) - return CILFuncNode(f'{node.id}_{self.scope.current_class}', params, self.scope.locals, self.scope.instructions) - - @visitor.when(BlockNode) - def visit(self, node): - for expr in node.expr_lis: - self.visit(expr) - - - @visitor.when(DispatchNode) - def visit(self, node): - pass - - @visitor.when(ConditionalNode) - def visit(self, node): - pass - - @visitor.when(LetNode) - def visit(self, node): - for variable in node.variables: - self.visit(variable) - temp_name = f't{self.scope.variables_count}' - self.scope.variables_count += 1 - expr = self.visit(node.expr) - self.scope.instructions.append(CILAssignNode( temp_name, expr)) - local = CILLocalNode(temp_name, CILTypeConstantNode(node.computed_type.name)) - self.scope.locals.append(local) - - @visitor.when(VarDeclarationNode) - def visit(self, node): - local = CILLocalNode(node.id,CILTypeConstantNode(node.type)) - self.scope.locals.append(local) - if node.expr is not None: - expr = self.visit(node.expr) - instruction = CILAssignNode (node.id, expr) - self.scope.instructions.append(instruction) - - - @visitor.when(LoopNode) - def visit(self, node): - pass - - @visitor.when(CaseNode) - def visit(self, node): - expr = self.visit(node.expr) - var_name = f't{self.scope.variables_count}' - self.scope.variables_count += 1 - - self.scope.locals.append(CILLocalNode(var_name, None)) - self.scope.instructions.append(CILAssignNode(var_name, expr)) - typeof = CILTypeOfNode(var_name) - self.scope.instructions.append(CILAssignNode(var_name, typeof)) - - for case in node.cases: - self.visit(case) - - @visitor.when(CaseAttrNode) - def visit(self, node): - case_label = f'c{self.scope.case_count}' - self.scope.case_count += 1 - self.scope.instructions.append(CILLabelNode(case_label)) - expresion_branch = self.visit(node.expr) - - - @visitor.when(AssignNode) - def visit(self, node): - exp = self.visit(node.expr) - type_class = self.context.get_type(self.scope.current_class) - try: - type_var = type_class.get_attribute(node.id).type - type_node = CILTypeConstantNode(type_var) - return CILSetAttributeNode(type_node, node.id.id , exp) - except: - return CILAssignNode(node.id.id, exp) - - @visitor.when(BinaryNode) - def visit(self, node): - if not isinstance(node.left, AtomicNode): - name = "t" + str(self.scope.variables_count) - self.scope.variables_count += 1 - type = node.left.computed_type.name - self.scope.locals.append(CILLocalNode(name, CILTypeConstantNode(type))) - expr = self.visit(node.left) - self.scope.instructions.append(CILAssignNode(name, expr)) - left = CILVariableNode(name) - else: - left = self.visit(node.left) - - if not isinstance(node.right, AtomicNode): - name = "t" + str(self.scope.variables_count) - self.scope.variables_count +=1 - type = node.right.computed_type.name - self.scope.locals.append(CILLocalNode(name, CILTypeConstantNode(type))) - expr = self.visit(node.right) - self.scope.instructions.append(CILAssignNode(name, expr)) - right = CILVariableNode(name) - else: - right = self.visit(node.right) - - if isinstance(node, PlusNode): - return CILPlusNode(left, right) - elif isinstance(node, MinusNode): - return CILMinusNode(left, right) - elif isinstance(node, DivNode): - return CILDivNode(left, right) - elif isinstance(node, StarNode): - return CILStarNode(left, right) - elif isinstance(node, ElessNode): - return CILElessNode(left, right) - elif isinstance(node, LessNode): - return CILLessNode(left, right) - else: - return CILEqualsNode(left, right) - - @visitor.when(PrimeNode) - def visit(self, node): - pass - - @visitor.when(NotNode) - def visit(self, node): - pass - @visitor.when(StringNode) - def visit(self, node): - pass - - @visitor.when(IsVoidNode) - def visit(self, node): - pass - - @visitor.when(ConstantNumNode) - def visit(self, node): - return CILNumberNode(node.lex) - - @visitor.when(VariableNode) - def visit(self, node): - locals_variables = [ var for var in self.scope.locals if var.id == node.lex ] - params_ = [var for var in self.scope.pa if var.id == node.lex ] - type_node = CILTypeConstantNode(type_var) - return CILGetAttribute(type_node,node.lex) - CILVariableNode(node.lex) - - @visitor.when(TrueNode) - def visit(self, node): - pass - - @visitor.when(FalseNode) - def visit(self, node): - pass - - @visitor.when(InstantiateNode) - def visit(self, node): - pass diff --git a/src/code_generator/test.txt b/src/code_generator/test.txt deleted file mode 100644 index 2f6df2287..000000000 --- a/src/code_generator/test.txt +++ /dev/null @@ -1,11 +0,0 @@ - -class Main { - w : Int; - - main(a : Int) : Int { - { - w <- 3; - let y : Int <- 3 in (a + y) + w; - } - }; -}; \ No newline at end of file diff --git a/src/test.txt b/src/test.txt index 26c184426..f5255b3fa 100644 --- a/src/test.txt +++ b/src/test.txt @@ -1,9 +1,8 @@ -class Point { -x : AUTO_TYPE; -y : AUTO_TYPE; -init(n : Int, m : Int) : SELF_TYPE { -{ -x <- n; -y <- m; -}}; + +class Main { + + main() : Int { + let x : Int <- 3 , y : Int <- 2 in if x = y then 2 else 3 fi + }; }; + From 2a31a7d6d80058da3848b17a6d3b58edea35bad6 Mon Sep 17 00:00:00 2001 From: Amy Date: Thu, 24 Feb 2022 23:23:59 -0500 Subject: [PATCH 18/81] updtate BinaryNode in CIL AST generator --- src/code_generator/generate_ast.py | 8 +++++--- src/test1.txt | 10 ++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 src/test1.txt diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 86a2f21af..304e6ed90 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -278,16 +278,18 @@ def visit(self, node): @visitor.when(BinaryNode) def visit(self, node): - if not isinstance(node.left, AtomicNode): + expr_left = self.visit(node.left) + expr_right = self.visit(node.right) + if not isinstance(expr_left, CILAtomicNode): name = self.scope.add_new_local(node.left.computed_type.name) expr = self.visit(node.left) self.scope.instructions.append(CILAssignNode(CILVariableNode(name), expr)) left = CILVariableNode(name) else: - left = self.visit(node.left) + left = expr_left - if not isinstance(node.right, AtomicNode): + if not isinstance(expr_right, CILAtomicNode): name = self.scope.add_new_local(node.right.computed_type.name) expr = self.visit(node.right) self.scope.instructions.append(CILAssignNode(CILVariableNode(name), expr)) diff --git a/src/test1.txt b/src/test1.txt new file mode 100644 index 000000000..f87ad790b --- /dev/null +++ b/src/test1.txt @@ -0,0 +1,10 @@ +class Main { + w : Int; + + main(a : Int) : Int { + { + w <- 3; + let y : Int <- 3 in (a + y) + w; + } + }; +}; From 3b6eb029b16f79aa7bdfaaf8d01b6721ca0a7388 Mon Sep 17 00:00:00 2001 From: Amy Date: Fri, 25 Feb 2022 00:14:15 -0500 Subject: [PATCH 19/81] fix errors in CIL ast generator --- src/code_generator/generate_ast.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 304e6ed90..8801bb460 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -12,6 +12,7 @@ def __init__(self, context): self.variables_count = 0 self.str_count = 0 + self.locals = [] self.all_locals = [] self.instructions = [] @@ -127,7 +128,7 @@ def visit(self, node): self.scope.instructions = [] params = [] - param_node = CILParamNode(CILVariableNode(f'self_{self.scope.current_class}'), self.scope.current_class) + param_node = CILParamNode(f'self_{self.scope.current_class}', self.scope.current_class) params.append(param_node) for param in node.params: @@ -195,6 +196,7 @@ def visit(self, node): exp_else = self.visit(node.elsex) self.scope.instructions.append(CILAssignNode(var_return, exp_else)) self.scope.instructions.append(CILGotoNode(CILLabelNode(f'ifend{count}'))) + self.scope.instructions.append(CILLabelNode( f'then{count}')) exp_then = self.visit(node.then) self.scope.instructions.append(CILAssignNode(var_return, exp_then)) self.scope.instructions.append(CILLabelNode(f'ifend{count}')) From af795d1e8d22d16da7e3a4bd9c430327669ab562 Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Fri, 25 Feb 2022 00:17:41 -0500 Subject: [PATCH 20/81] Add CIL code generation for debug tasks --- src/code_generator/cil_codegen.py | 219 ++++++++++++++++++++++++++++++ src/cool.py | 9 +- 2 files changed, 226 insertions(+), 2 deletions(-) create mode 100644 src/code_generator/cil_codegen.py diff --git a/src/code_generator/cil_codegen.py b/src/code_generator/cil_codegen.py new file mode 100644 index 000000000..d371523bf --- /dev/null +++ b/src/code_generator/cil_codegen.py @@ -0,0 +1,219 @@ +import cmp.visitor as visitor +from .ast_CIL import * + +eol = '\n' +tab = '\t' + +class CILCodegen: + @visitor.on('node') + def visit(self, node, frame): + pass + + @visitor.when(CILProgramNode) + def visit(self, node: CILProgramNode): + code = '.TYPES\n\n' + for t in node.types: + code += self.visit(t) + code += '\n' + code += '.DATA\n\n' + for d in node.data: + code += self.visit(d) + '\n\n' + code += '\n' + code += '.CODE\n\n' + for f in node.functions: + code += self.visit(f) + '\n\n' + return code + + @visitor.when(CILTypeNode) + def visit(self, node: CILTypeNode): + code = f'type {node.id} ' + '{\n' + + for c in node.attributes: + code += self.visit(c) + code += '\n' + + for m in node.methods: + code += self.visit(m) + code += '}\n' + + return code + + @visitor.when(CILDataNode) + def visit(self, node: CILDataNode): + code = f'{node.id.lex} = \"{text}\";' + + @visitor.when(CILFuncNode) + def visit(self, node: CILFuncNode): + code = f'function {node.id} ' + '{\n' + for p in node.params: + code += self.visit(p) + code += eol + for l in node.locals: + code += self.visit(l) + code += eol + for i in node.instructions: + try: + code += self.visit(i) + except: + print(code) + print('--------------------------') + print(i) + code += eol + code += '}\n\n' + return code + + @visitor.when(CILAttributeNode) + def visit(self, node: CILAttributeNode): + return f'\tattribute {node.id};\n' + + @visitor.when(CILMethodNode) + def visit(self, node: CILMethodNode): + return f'\tmethod {node.id} : {node.function_id};\n' + + @visitor.when(CILParamNode) + def visit(self, node: CILParamNode): + return f'\tPARAM {node.id};\n' + + @visitor.when(CILLocalNode) + def visit(self, node: CILLocalNode): + return f'\tLOCAL {node.id};\n' + + @visitor.when(CILInstructionNode) + def visit(self, node): + pass + + @visitor.when(CILAssignNode) + def visit(self, node: CILAssignNode): + code = f'\t{node.id.lex} = ' + try: + code += self.visit(node.expr) + except: + print(node.expr) + code += ';\n' + return code + + @visitor.when(CILSetAttributeNode) + def visit(self, node: CILSetAttributeNode): + return f'\tSETATTR {node.id.lex} {node.attr.lex} {node.var.lex};\n' + + @visitor.when(CILArgNode) + def visit(self, node:CILArgNode): + return f'\tARG {node.id};\n' + + @visitor.when(CILGotoNode) + def visit(self, node: CILGotoNode): + return f'\tGOTO {node.label.id};\n' + + @visitor.when(CILIfGotoNode) + def visit(self, node:CILIfGotoNode): + return f'\tIF {node.var.lex} GOTO {node.label.id};\n' + + @visitor.when(CILLabelNode) + def visit(self, node: CILLabelNode): + return f'{node.id}:\n' + + @visitor.when(CILReturnNode) + def visit(self, node: CILReturnNode): + return f'\tRETURN {node.var.lex};\n' + + @visitor.when(CILPrint) + def visit(self, node: CILPrint): + return f'\tPRINT {node.var.lex};\n' + + @visitor.when(CILExpressionNode) + def visit(self, node: CILExpressionNode): + pass + + @visitor.when(CILBinaryOperationNode) + def visit(self, node: CILBinaryOperationNode): + pass + + @visitor.when(CILGetAttribute) + def visit(self, node: CILGetAttribute): + return f'GETATTR {node.var.lex} {node.attr.lex}' + + @visitor.when(CILAllocateNode) + def visit(self, node: CILAllocateNode): + return f'ALLOCATE {node.type}' + + @visitor.when(CILTypeOfNode) + def visit(self, node: CILTypeOfNode): + return f'TYPEOF {node.var.lex}' + + @visitor.when(CILVCallNode) + def visit(self, node: CILVCallNode): + return f'VCALL {node.type} {node.func}' + + @visitor.when(CILLoadNode) + def visit(self, node: CILLoadNode): + return f'LOAD {node.var.lex}' + + @visitor.when(CILLengthNode) + def visit(self, node: CILLengthNode): + return f'LENGTH {node.var.lex}' + + @visitor.when(CILStringNode) + def visit(self, node: CILStringNode): + return f'STRING {node.var.id}' + + @visitor.when(CILReadNode) + def visit(self, node: CILReadNode): + return 'READ' + + @visitor.when(CILAtomicNode) + def visit(self, node: CILAtomicNode): + return f'{node.lex}' + + @visitor.when(CILNumberNode) + def visit(self, node): + return f'{node.lex}' + @visitor.when(CILTypeConstantNode) + def visit(self, node): + return f'{node.lex}' + @visitor.when(CILVariableNode) + def visit(self, node): + return f'{node.lex}' + @visitor.when(CILStringNode) + def visit(self, node): + return f'{node.lex}' + @visitor.when(CILPlusNode) + def visit(self, node: CILPlusNode): + l = self.visit(node.left) + r = self.visit(node.right) + return f'{l} + {r}' + + @visitor.when(CILMinusNode) + def visit(self, node: CILMinusNode): + l = self.visit(node.left) + r = self.visit(node.right) + return f'{l} - {r}' + + @visitor.when(CILStarNode) + def visit(self, node: CILStarNode): + l = self.visit(node.left) + r = self.visit(node.right) + return f'{l} * {r}' + + @visitor.when(CILDivNode) + def visit(self, node: CILPlusNode): + l = self.visit(node.left) + r = self.visit(node.right) + return f'{l} / {r}' + + @visitor.when(CILLessNode) + def visit(self, node: CILLessNode): + l = self.visit(node.left) + r = self.visit(node.right) + return f'{l} < {r}' + + @visitor.when(CILElessNode) + def visit(self, node: CILElessNode): + l = self.visit(node.left) + r = self.visit(node.right) + return f'{l} <= {r}' + + @visitor.when(CILEqualsNode) + def visit(self, node: CILEqualsNode): + l = self.visit(node.left) + r = self.visit(node.right) + return f'{l} == {r}' diff --git a/src/cool.py b/src/cool.py index be69052b7..9e72b9789 100644 --- a/src/cool.py +++ b/src/cool.py @@ -5,7 +5,7 @@ from tours.TypeBuilder import TypeBuilder from tours.TypeChecker import TypeChecker from code_generator.generate_ast import CIL - +from code_generator.cil_codegen import CILCodegen input_file = sys.argv[1] with open(input_file, 'r') as f: @@ -47,6 +47,11 @@ cil_generator = CIL(context) cil = cil_generator.visit(ast) +cil_codegen = CILCodegen() +code = cil_codegen.visit(cil) +print('-----------------CIL AST----------------------') print(cil) - +print('---------------- CIL Code------------------') +print(code) +print('-------------------Done--------------------') exit(0) From 55ee1d923c86de552e33aed2c75988d37c6afd0c Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Fri, 25 Feb 2022 01:57:37 -0500 Subject: [PATCH 21/81] Update Dockerfile --- Dockerfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Dockerfile b/Dockerfile index 25fabcff5..c5a614015 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,6 +4,10 @@ COPY ./requirements.txt ./requirements.txt RUN pip3 install -r requirements.txt +RUN apt update + +RUN apt install spim -y + RUN mkdir cool-compiler-2021 WORKDIR /cool-compiler-2021 From 5c4b8bece55432d9f6d01082bd7d27ac6c1f762c Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Fri, 25 Feb 2022 01:58:33 -0500 Subject: [PATCH 22/81] Fix bug with strings in CIL code generator --- src/code_generator/cil_codegen.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/code_generator/cil_codegen.py b/src/code_generator/cil_codegen.py index d371523bf..5a2d88972 100644 --- a/src/code_generator/cil_codegen.py +++ b/src/code_generator/cil_codegen.py @@ -40,7 +40,7 @@ def visit(self, node: CILTypeNode): @visitor.when(CILDataNode) def visit(self, node: CILDataNode): - code = f'{node.id.lex} = \"{text}\";' + return f'{node.id} = {node.text};' @visitor.when(CILFuncNode) def visit(self, node: CILFuncNode): From 376052c586b6d470e0bdefc1ea6077c38b30df70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karla=20Olivera=20Hern=C3=A1ndez?= Date: Fri, 25 Feb 2022 04:17:13 -0500 Subject: [PATCH 23/81] Implement LoopNode logic in CIL ast generator and add builtin types --- src/code_generator/ast_CIL.py | 3 +- src/code_generator/generate_ast.py | 136 ++++++++++++----------------- src/code_generator/scope_CIL.py | 125 ++++++++++++++++++++++++++ 3 files changed, 184 insertions(+), 80 deletions(-) create mode 100644 src/code_generator/scope_CIL.py diff --git a/src/code_generator/ast_CIL.py b/src/code_generator/ast_CIL.py index d611674e8..a3e49205f 100644 --- a/src/code_generator/ast_CIL.py +++ b/src/code_generator/ast_CIL.py @@ -291,7 +291,7 @@ def __init__(self, type, func): def __str__(self): text = "VCallNode:\n" - text += f"type: {self.func}\n" + text += f"type: {self.type}\n" text += f"func: {self.func}\n" return text @@ -381,6 +381,7 @@ class CILElessNode(CILBinaryOperationNode): class CILEqualsNode(CILBinaryOperationNode): pass + class CILNotEqualsNode(CILBinaryOperationNode): pass \ No newline at end of file diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 8801bb460..11738b9c7 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -1,79 +1,13 @@ from math import exp from parsing.ast import * from .ast_CIL import * +from .scope_CIL import * +from cmp.semantic import IntType, StringType, BoolType import cmp.visitor as visitor -class CILScope: - def __init__(self, context): - self.let_count = 0 - self.if_count = 0 - self.case_count = 0 - self.variables_count = 0 - self.str_count = 0 - - - self.locals = [] - self.all_locals = [] - self.instructions = [] - self.data = [] - self.functions = [] - self.current_class = "" - self.context = context - - def add_local(self, id, type, is_param = False): - local_dict = self.locals[-1] - if id in local_dict.keys(): - nickname = local_dict[id].id - local_dict[id] = CILLocalNode(nickname, type) - else: - nickname = f'{id}_{self.variables_count}' - self.variables_count += 1 - node = CILLocalNode(nickname, type) - local_dict[id] = node - - if not is_param: - self.all_locals.append(node) - - return nickname - - def add_new_local(self, type): - local_dict = self.locals[-1] - name = f't_{self.variables_count}' - self.variables_count += 1 - node = CILLocalNode(name, type) - local_dict[name] = node - self.all_locals.append(node) - return name - - def find_local(self, id): - for i in range (len(self.locals) - 1 , -1, -1): - d = self.locals[i] - try: - return d[id] - except: - pass - return None - - def find_data(self, id): - for d in self.data: - if d.id == id: - return d - return None - - def retur_type_of_method (self, name_meth, name_class): - type_class = self.context.get_type(name_class) - method = type_class.get_method(name_meth) - return method.return_type.name - - #pending - def create_init_class(attributes, expresions): - for attr,expr in zip(attributes,expresions): - assig = CILAssignNode (attr.id,expr) - - class CIL: - def __init__(self,context): + def __init__(self, context): self.scope = CILScope(context) @visitor.on('node') @@ -83,10 +17,19 @@ def visit(self, node, scope): @visitor.when(ProgramNode) def visit(self, node): types = [] - for d in node.declarations: # TODO organizar de modo q quede el main de primero + for d in node.declarations: type = self.visit(d) types.append(type) - + + # Add built-in types and functions + types.extend(self.scope.create_builtin_types()) + + # Brings main function to the first position + main_idx = [idx for idx, element in enumerate(self.scope.functions) if element.id == 'main_Main'][0] + main = self.scope.functions[main_idx] + self.scope.functions.pop(main_idx) + self.scope.functions.insert(0, main) + return CILProgramNode(types, self.scope.data, self.scope.functions) @visitor.when(ClassDeclarationNode) @@ -113,8 +56,8 @@ def visit(self, node): #init_class = create_init_class (type.attributes,expressions) #self.scope.functions.append (init_class) - # herencia - + # herencia + return CILTypeNode(node.id, attributes, methods) @visitor.when(AttrDeclarationNode) @@ -176,7 +119,7 @@ def visit(self, node): expression = CILVCallNode(node.type.name, node.id) else: expression = CILCallNode(node.id) - type = self.scope.retur_type_of_method(node.id, self.scope.current_class) + type = self.scope.ret_type_of_method(node.id, self.scope.current_class) new_var = self.scope.add_new_local(type) # TODO node_var = CILVariableNode(new_var) self.scope.instructions.append(CILAssignNode(node_var, expression)) @@ -218,10 +161,37 @@ def visit(self, node): expr = self.visit(node.expr) instruction = CILAssignNode(CILVariableNode(name), expr) self.scope.instructions.append(instruction) + elif isinstance(node.computed_type, IntType): + self.scope.instructions.append(CILArgNode(CILNumberNode(0))) + self.scope.instructions.append(CILVCallNode('Int', 'init')) + elif isinstance(node.computed_type, BoolType): + self.scope.instructions.append(CILArgNode(CILNumberNode(0))) + self.scope.instructions.append(CILVCallNode('Bool', 'init')) + elif isinstance(node.computed_type, StringType): + self.scope.instructions.append(CILArgNode(CILNumberNode(0))) + self.scope.instructions.append(CILVCallNode('String', 'init')) @visitor.when(LoopNode) def visit(self, node): - pass + count = self.scope.loop_count + self.scope.loop_count += 1 + self.scope.instructions.append(CILLabelNode(f'while_{count}')) + pred = self.visit(node.predicate) + name_pred = self.scope.add_new_local("Bool") + name_return = self.scope.add_new_local(node.computed_type.name) + + var_condition = CILVariableNode(name_pred) + var_return = CILVariableNode(name_return) + self.scope.instructions.append(CILAssignNode(var_condition, pred)) + self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'body_{count}'))) + self.scope.instructions.append(CILGotoNode(CILLabelNode(f'pool_{count}'))) + self.scope.instructions.append(CILLabelNode(f'body_{count}')) + body = self.visit(node.body) + self.scope.instructions.append(CILAssignNode(var_return, body)) + self.scope.instructions.append(CILGotoNode(CILLabelNode(f'while_{count}'))) + self.scope.instructions.append(CILLabelNode(f'pool_{count}')) + + return var_return @visitor.when(CaseNode) def visit(self, node): @@ -316,12 +286,14 @@ def visit(self, node): @visitor.when(PrimeNode) def visit(self, node): - pass + expr = self.visit(node.expr) + return CILStarNode(expr , CILNumberNode(-1)) @visitor.when(NotNode) def visit(self, node): - pass - + expr = self.visit(node.expr) + return CILNotEqualsNode( expr, CILNumberNode(0)) + @visitor.when(StringNode) def visit(self, node): data = CILDataNode(f'str_{self.scope.str_count}', node.lex) @@ -330,7 +302,13 @@ def visit(self, node): @visitor.when(IsVoidNode) def visit(self, node): - pass + expr = self.visit(node.expr) + if isinstance(node.expr.computed_type, IntType) or isinstance(node.expr.computed_type, StringType) or isinstance(node.expr.computed_type, BoolType): + return CILNumberNode(0) + else: + name = self.scope.add_new_local(node.computed_type) + self.scope.instructions.append(CILAssignNode(CILVariableNode(name), expr)) + return CILEqualsNode(CILVariableNode(name), CILNumberNode(0)) @visitor.when(ConstantNumNode) def visit(self, node): diff --git a/src/code_generator/scope_CIL.py b/src/code_generator/scope_CIL.py new file mode 100644 index 000000000..9c64f9380 --- /dev/null +++ b/src/code_generator/scope_CIL.py @@ -0,0 +1,125 @@ +from .ast_CIL import * + + +class CILScope: + def __init__(self, context): + self.context = context + + self.if_count = 0 + self.case_count = 0 + self.variables_count = 0 + self.str_count = 0 + self.loop_count = 0 + + self.locals = [] + self.all_locals = [] + self.instructions = [] + self.data = [] + self.functions = [] + self.current_class = "" + + def add_local(self, id, type, is_param = False): + local_dict = self.locals[-1] + if id in local_dict.keys(): + nickname = local_dict[id].id + local_dict[id] = CILLocalNode(nickname, type) + else: + nickname = f'{id}_{self.variables_count}' + self.variables_count += 1 + node = CILLocalNode(nickname, type) + local_dict[id] = node + + if not is_param: + self.all_locals.append(node) + + return nickname + + def add_new_local(self, type): + local_dict = self.locals[-1] + name = f't_{self.variables_count}' + self.variables_count += 1 + node = CILLocalNode(name, type) + local_dict[name] = node + self.all_locals.append(node) + return name + + def find_local(self, id): + for i in range (len(self.locals) - 1 , -1, -1): + d = self.locals[i] + try: + return d[id] + except: + pass + return None + + def find_data(self, id): + for d in self.data: + if d.id == id: + return d + return None + + def ret_type_of_method(self, name_meth, name_class): + type_class = self.context.get_type(name_class) + method = type_class.get_method(name_meth) + return method.return_type.name + + def create_builtin_types(self): + types = [] + + int_methods = [ + CILMethodNode('init', 'init_Int'), + ] + types.append(CILTypeNode('Int', [CILAttributeNode('value', None)], int_methods)) + init_int = CILFuncNode( + 'init_Int', + [CILParamNode('v', None)], + [], + [CILSetAttributeNode(CILVariableNode('self'), 'Int', CILVariableNode('value'), CILVariableNode('v'))]) + self.functions.append(init_int) + + str_methods = [ + CILMethodNode('init', 'init_String'), + CILMethodNode('length', 'length'), + CILMethodNode('concat', 'concat'), + CILMethodNode('substr', 'substr'), + ] + types.append(CILTypeNode('String', [CILAttributeNode('value', None)], str_methods)) + init_string = CILFuncNode( + 'init_String', + [CILParamNode('v', None)], + [], + [CILSetAttributeNode(CILVariableNode('self'), 'String', CILVariableNode('value'), CILVariableNode('v'))]) + self.functions.append(init_string) + + bool_methods = [ + CILMethodNode('init', 'init_Bool'), + ] + types.append(CILTypeNode('Bool', [CILAttributeNode('value', None)], bool_methods)) + bool_string = CILFuncNode( + 'init_Bool', + [CILParamNode('v', None)], + [], + [CILSetAttributeNode(CILVariableNode('self'), 'Bool', CILVariableNode('value'), CILVariableNode('v'))]) + self.functions.append(bool_string) + + obj_methods = [ + CILMethodNode('abort', 'abort'), + CILMethodNode('type_name', 'type_name'), + CILMethodNode('copy', 'copy'), + ] + types.append(CILTypeNode('Object', [], obj_methods)) + + io_methods = [ + CILMethodNode('out_string', 'out_string'), + CILMethodNode('out_int', 'out_int'), + CILMethodNode('in_string', 'in_string'), + CILMethodNode('in_int', 'in_int'), + ] + types.append(CILTypeNode('IO', [], io_methods)) + + return types + + #pending + def create_init_class(attributes, expresions): + for attr,expr in zip(attributes,expresions): + assig = CILAssignNode (attr.id,expr) \ No newline at end of file From 861ced52db30ae99b44f2a8f5ad68003c993cadb Mon Sep 17 00:00:00 2001 From: Amy Date: Fri, 25 Feb 2022 11:06:04 -0500 Subject: [PATCH 24/81] add implementation init method of class and inheriths logic --- src/code_generator/generate_ast.py | 58 +++++++++++------ src/code_generator/{scope_CIL.py => utils.py} | 64 ++++++++++++++++--- src/cool.py | 2 +- src/test2.txt | 8 +++ src/test3.txt | 7 ++ src/test4.txt | 25 ++++++++ src/test5.txt | 18 ++++++ 7 files changed, 150 insertions(+), 32 deletions(-) rename src/code_generator/{scope_CIL.py => utils.py} (74%) create mode 100755 src/test2.txt create mode 100644 src/test3.txt create mode 100644 src/test4.txt create mode 100644 src/test5.txt diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 11738b9c7..3854c47dd 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -1,11 +1,10 @@ -from math import exp from parsing.ast import * from .ast_CIL import * -from .scope_CIL import * -from cmp.semantic import IntType, StringType, BoolType +from .utils import * +from cmp.semantic import IntType, StringType, BoolType, ObjectType import cmp.visitor as visitor - - + + class CIL: def __init__(self, context): self.scope = CILScope(context) @@ -16,6 +15,20 @@ def visit(self, node, scope): @visitor.when(ProgramNode) def visit(self, node): + types_ts = get_ts(self.scope.context) + infos = self.scope.infos = {} + for type in types_ts: + t = TypeInfo() + infos[type.name] = t + if type.parent is not None: + p = type.parent.name + t.attrs = infos[p].attrs.copy() + t.methods = infos[p].methods.copy() + + t.attrs.extend(type.attributes) + for m in type.methods: + t.methods[m.name] = f'{m.name}_{type.name}' + types = [] for d in node.declarations: type = self.visit(d) @@ -35,34 +48,37 @@ def visit(self, node): @visitor.when(ClassDeclarationNode) def visit(self, node): self.scope.current_class = node.id - + att_aux = [] attributes = [] expressions = [] methods = [] + + type_info = self.scope.infos[node.id] + for a in type_info.attrs: + attributes.append(CILAttributeNode(a.name, a.type)) + for m in type_info.methods.keys(): + methods.append(CILMethodNode(m, type_info.methods[m])) + methods.append(CILMethodNode('init', f'init_{node.id}')) + for feature in node.features: - if isinstance (feature, AttrDeclarationNode): - attr = self.visit(feature) - attributes.append(attr) + if isinstance(feature, AttrDeclarationNode): if feature.expr is not None: expr = self.visit(feature.expr) expressions.append(expr) + att_aux.append(feature.id) + else: function = self.visit(feature) self.scope.functions.append(function) - methods.append(CILMethodNode(feature.id, function.id)) - - methods.append(CILMethodNode('init', f'init_{node.id}')) - # use expressions here - #init_class = create_init_class (type.attributes,expressions) - #self.scope.functions.append (init_class) + + init_class = self.scope.create_init_class(att_aux , expressions) + self.scope.functions.append(init_class) - # herencia - return CILTypeNode(node.id, attributes, methods) @visitor.when(AttrDeclarationNode) def visit(self, node): - return CILAttributeNode(node.id, node.type) + pass @visitor.when(FuncDeclarationNode) def visit(self, node): @@ -96,7 +112,7 @@ def visit(self, node): def visit(self, node): if not isinstance(node.expr, VariableNode) or node.expr.lex != 'self': expr = self.visit(node.expr) - name = self.scope.add_new_local(node.expr.computed_type.name) # TODO revisar el tipo de retorno (idea, a;adir una instruccio typeof) + name = self.scope.add_new_local(node.expr.computed_type.name) instruction = CILAssignNode(CILVariableNode(name), expr) self.scope.instructions.append(instruction) else: @@ -106,7 +122,7 @@ def visit(self, node): args.append(CILArgNode(CILVariableNode(name))) for arg in node.arg: expr = self.visit(arg) - name_arg = self.scope.add_new_local(arg.computed_type.name) # TODO lo mismo de arriba + name_arg = self.scope.add_new_local(arg.computed_type.name) if not isinstance(expr, VariableNode): instruction = CILAssignNode(CILVariableNode(name_arg), expr) self.scope.instructions.append(instruction) @@ -120,7 +136,7 @@ def visit(self, node): else: expression = CILCallNode(node.id) type = self.scope.ret_type_of_method(node.id, self.scope.current_class) - new_var = self.scope.add_new_local(type) # TODO + new_var = self.scope.add_new_local(type) node_var = CILVariableNode(new_var) self.scope.instructions.append(CILAssignNode(node_var, expression)) return node_var diff --git a/src/code_generator/scope_CIL.py b/src/code_generator/utils.py similarity index 74% rename from src/code_generator/scope_CIL.py rename to src/code_generator/utils.py index 9c64f9380..85fa76e1b 100644 --- a/src/code_generator/scope_CIL.py +++ b/src/code_generator/utils.py @@ -1,3 +1,6 @@ +from git import Object + +from cmp.semantic import ObjectType from .ast_CIL import * @@ -66,9 +69,17 @@ def ret_type_of_method(self, name_meth, name_class): def create_builtin_types(self): types = [] + obj_methods = [ + CILMethodNode('abort', 'abort'), + CILMethodNode('type_name', 'type_name'), + CILMethodNode('copy', 'copy'), + ] + types.append(CILTypeNode('Object', [], obj_methods)) + int_methods = [ CILMethodNode('init', 'init_Int'), ] + int_methods.extend(obj_methods) types.append(CILTypeNode('Int', [CILAttributeNode('value', None)], int_methods)) init_int = CILFuncNode( 'init_Int', @@ -83,6 +94,7 @@ def create_builtin_types(self): CILMethodNode('concat', 'concat'), CILMethodNode('substr', 'substr'), ] + str_methods.extend(obj_methods) types.append(CILTypeNode('String', [CILAttributeNode('value', None)], str_methods)) init_string = CILFuncNode( 'init_String', @@ -94,6 +106,7 @@ def create_builtin_types(self): bool_methods = [ CILMethodNode('init', 'init_Bool'), ] + bool_methods.extend(obj_methods) types.append(CILTypeNode('Bool', [CILAttributeNode('value', None)], bool_methods)) bool_string = CILFuncNode( 'init_Bool', @@ -101,13 +114,6 @@ def create_builtin_types(self): [], [CILSetAttributeNode(CILVariableNode('self'), 'Bool', CILVariableNode('value'), CILVariableNode('v'))]) self.functions.append(bool_string) - - obj_methods = [ - CILMethodNode('abort', 'abort'), - CILMethodNode('type_name', 'type_name'), - CILMethodNode('copy', 'copy'), - ] - types.append(CILTypeNode('Object', [], obj_methods)) io_methods = [ CILMethodNode('out_string', 'out_string'), @@ -115,11 +121,49 @@ def create_builtin_types(self): CILMethodNode('in_string', 'in_string'), CILMethodNode('in_int', 'in_int'), ] + io_methods.extend(obj_methods) types.append(CILTypeNode('IO', [], io_methods)) return types - #pending - def create_init_class(attributes, expresions): + def create_init_class(self, attributes, expresions): + type = self.context.get_type(self.current_class) + instructions = [] + + if not isinstance(type.parent,ObjectType): + instructions.append(CILArgNode(CILVariableNode(f'self_{self.current_class}'))) + instructions.append(CILCallNode(f'init_{type.parent.name}')) + for attr,expr in zip(attributes,expresions): - assig = CILAssignNode (attr.id,expr) \ No newline at end of file + instructions.append(CILAssignNode (CILVariableNode(attr), expr)) + + return CILFuncNode(f'init_{self.current_class}',[], [], instructions) + + + +class TypeInfo: + def __init__(self): + self.attrs = [] + self.methods = {} + + def __repr__(self): + text = str(self.attrs) + '\n' + text += str(self.methods) + '\n' + return text + + +def get_ts(context): + list = [] + visited = [] + for c in context.types.values(): + if c not in visited: + dfs_visit_ts(context, c, list, visited) + return list + + +def dfs_visit_ts(context, u, list, visited): + visited.append(u) + if u.parent is not None and u.parent not in visited: + dfs_visit_ts(context, u.parent, list, visited) + + list.append(u) \ No newline at end of file diff --git a/src/cool.py b/src/cool.py index 9e72b9789..92f6b613c 100644 --- a/src/cool.py +++ b/src/cool.py @@ -4,7 +4,7 @@ from tours.TypeCollector import TypeCollector from tours.TypeBuilder import TypeBuilder from tours.TypeChecker import TypeChecker -from code_generator.generate_ast import CIL +from code_generator.generate_ast import * from code_generator.cil_codegen import CILCodegen input_file = sys.argv[1] diff --git a/src/test2.txt b/src/test2.txt new file mode 100755 index 000000000..92d54783f --- /dev/null +++ b/src/test2.txt @@ -0,0 +1,8 @@ + +class Main { + + main() : String { + let x : String <- "hola" in x + }; +}; + diff --git a/src/test3.txt b/src/test3.txt new file mode 100644 index 000000000..0aade2ce4 --- /dev/null +++ b/src/test3.txt @@ -0,0 +1,7 @@ +class Main { + w : Int <- 2; + s : Int <- 3; + main() : Object { + while w < s loop 7 pool + }; +}; \ No newline at end of file diff --git a/src/test4.txt b/src/test4.txt new file mode 100644 index 000000000..a0f161d01 --- /dev/null +++ b/src/test4.txt @@ -0,0 +1,25 @@ +class Main { + main() : Int { + 2 + }; +}; + +class A { + a : Int <- 3; + + main() : Int { + 3 + }; +}; + +class B inherits A { + +}; + +class C inherits B { + b : Int <- 2; + + main() : Int { + 4 + }; +}; \ No newline at end of file diff --git a/src/test5.txt b/src/test5.txt new file mode 100644 index 000000000..da65ab057 --- /dev/null +++ b/src/test5.txt @@ -0,0 +1,18 @@ +class Main { + + main(a : Int) : Int { + 2 + }; +}; + +class A { } ; +class B inherits C { } ; +class D inherits A { } ; +class M { } ; +class L inherits C { } ; +class C { } ; +class H inherits M { } ; + + + + From c4f6a9159bf4e1a8ea4cf5dc43daead9dd5288ab Mon Sep 17 00:00:00 2001 From: Amy Date: Fri, 25 Feb 2022 11:50:38 -0500 Subject: [PATCH 25/81] Fix errors in init classes functions --- src/code_generator/utils.py | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/code_generator/utils.py b/src/code_generator/utils.py index 85fa76e1b..afb814d53 100644 --- a/src/code_generator/utils.py +++ b/src/code_generator/utils.py @@ -1,5 +1,3 @@ -from git import Object - from cmp.semantic import ObjectType from .ast_CIL import * @@ -70,9 +68,9 @@ def create_builtin_types(self): types = [] obj_methods = [ - CILMethodNode('abort', 'abort'), - CILMethodNode('type_name', 'type_name'), - CILMethodNode('copy', 'copy'), + CILMethodNode('abort', 'abort_Object'), + CILMethodNode('type_name', 'type_name_Object'), + CILMethodNode('copy', 'copy_Object'), ] types.append(CILTypeNode('Object', [], obj_methods)) @@ -83,22 +81,22 @@ def create_builtin_types(self): types.append(CILTypeNode('Int', [CILAttributeNode('value', None)], int_methods)) init_int = CILFuncNode( 'init_Int', - [CILParamNode('v', None)], + [CILParamNode('self', None), CILParamNode('v', None)], [], [CILSetAttributeNode(CILVariableNode('self'), 'Int', CILVariableNode('value'), CILVariableNode('v'))]) self.functions.append(init_int) str_methods = [ CILMethodNode('init', 'init_String'), - CILMethodNode('length', 'length'), - CILMethodNode('concat', 'concat'), - CILMethodNode('substr', 'substr'), + CILMethodNode('length', 'length_String'), + CILMethodNode('concat', 'concat_String'), + CILMethodNode('substr', 'substr_String'), ] str_methods.extend(obj_methods) types.append(CILTypeNode('String', [CILAttributeNode('value', None)], str_methods)) init_string = CILFuncNode( 'init_String', - [CILParamNode('v', None)], + [CILParamNode('self', None), CILParamNode('v', None)], [], [CILSetAttributeNode(CILVariableNode('self'), 'String', CILVariableNode('value'), CILVariableNode('v'))]) self.functions.append(init_string) @@ -110,16 +108,16 @@ def create_builtin_types(self): types.append(CILTypeNode('Bool', [CILAttributeNode('value', None)], bool_methods)) bool_string = CILFuncNode( 'init_Bool', - [CILParamNode('v', None)], + [CILParamNode('self', None), CILParamNode('v', None)], [], [CILSetAttributeNode(CILVariableNode('self'), 'Bool', CILVariableNode('value'), CILVariableNode('v'))]) self.functions.append(bool_string) io_methods = [ - CILMethodNode('out_string', 'out_string'), - CILMethodNode('out_int', 'out_int'), - CILMethodNode('in_string', 'in_string'), - CILMethodNode('in_int', 'in_int'), + CILMethodNode('out_string', 'out_string_IO'), + CILMethodNode('out_int', 'out_int_IO'), + CILMethodNode('in_string', 'in_string_IO'), + CILMethodNode('in_int', 'in_int_IO'), ] io_methods.extend(obj_methods) types.append(CILTypeNode('IO', [], io_methods)) @@ -130,17 +128,18 @@ def create_init_class(self, attributes, expresions): type = self.context.get_type(self.current_class) instructions = [] + instructions.append(CILParamNode('self', None)) + if not isinstance(type.parent,ObjectType): - instructions.append(CILArgNode(CILVariableNode(f'self_{self.current_class}'))) - instructions.append(CILCallNode(f'init_{type.parent.name}')) + instructions.append(CILArgNode(CILVariableNode(f'self'))) + instructions.append(CILVCallNode(type.parent.name, f'init_{type.parent.name}')) for attr,expr in zip(attributes,expresions): - instructions.append(CILAssignNode (CILVariableNode(attr), expr)) + instructions.append(CILSetAttributeNode(CILVariableNode('self'), self.current_class, CILVariableNode(attr), expr)) return CILFuncNode(f'init_{self.current_class}',[], [], instructions) - class TypeInfo: def __init__(self): self.attrs = [] From 1c6b5b558b31dbb3e107c899432b216e44a569e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karla=20Olivera=20Hern=C3=A1ndez?= Date: Fri, 25 Feb 2022 12:15:36 -0500 Subject: [PATCH 26/81] Fix error in create_init_class and remove unused nodes of CIL ast --- src/code_generator/ast_CIL.py | 37 ------------------------------- src/code_generator/cil_codegen.py | 22 +++--------------- src/code_generator/utils.py | 6 ++++- 3 files changed, 8 insertions(+), 57 deletions(-) diff --git a/src/code_generator/ast_CIL.py b/src/code_generator/ast_CIL.py index a3e49205f..a2140f700 100644 --- a/src/code_generator/ast_CIL.py +++ b/src/code_generator/ast_CIL.py @@ -1,6 +1,3 @@ -from attr import attributes - - class CILNode: pass @@ -211,16 +208,6 @@ def __str__(self): return text -class CILPrint(CILInstructionNode): - def __init__(self, var): - self.var = var - - def __str__(self): - text = "PrintNode:\n" - text += f"var: {self.var}\n" - return text - - # Expressions class CILExpressionNode(CILNode): pass @@ -306,30 +293,6 @@ def __str__(self): return text -class CILLengthNode(CILExpressionNode): - def __init__(self, var): - self.var = var - - def __str__(self): - text = "LengthNode:\n" - text += f"var: {self.var}\n" - return text - - -class CILStringNode(CILExpressionNode): - def __init__(self, var): - self.var = var - - def __str__(self): - text = "StringNode:\n" - text += f"var: {self.var}\n" - return text - - -class CILReadNode(CILExpressionNode): - pass - - class CILAtomicNode(CILExpressionNode): def __init__(self, lex): self.lex = lex diff --git a/src/code_generator/cil_codegen.py b/src/code_generator/cil_codegen.py index 5a2d88972..d2efcb353 100644 --- a/src/code_generator/cil_codegen.py +++ b/src/code_generator/cil_codegen.py @@ -116,10 +116,6 @@ def visit(self, node: CILLabelNode): def visit(self, node: CILReturnNode): return f'\tRETURN {node.var.lex};\n' - @visitor.when(CILPrint) - def visit(self, node: CILPrint): - return f'\tPRINT {node.var.lex};\n' - @visitor.when(CILExpressionNode) def visit(self, node: CILExpressionNode): pass @@ -148,18 +144,6 @@ def visit(self, node: CILVCallNode): def visit(self, node: CILLoadNode): return f'LOAD {node.var.lex}' - @visitor.when(CILLengthNode) - def visit(self, node: CILLengthNode): - return f'LENGTH {node.var.lex}' - - @visitor.when(CILStringNode) - def visit(self, node: CILStringNode): - return f'STRING {node.var.id}' - - @visitor.when(CILReadNode) - def visit(self, node: CILReadNode): - return 'READ' - @visitor.when(CILAtomicNode) def visit(self, node: CILAtomicNode): return f'{node.lex}' @@ -167,15 +151,15 @@ def visit(self, node: CILAtomicNode): @visitor.when(CILNumberNode) def visit(self, node): return f'{node.lex}' + @visitor.when(CILTypeConstantNode) def visit(self, node): return f'{node.lex}' + @visitor.when(CILVariableNode) def visit(self, node): return f'{node.lex}' - @visitor.when(CILStringNode) - def visit(self, node): - return f'{node.lex}' + @visitor.when(CILPlusNode) def visit(self, node: CILPlusNode): l = self.visit(node.left) diff --git a/src/code_generator/utils.py b/src/code_generator/utils.py index afb814d53..00cc92258 100644 --- a/src/code_generator/utils.py +++ b/src/code_generator/utils.py @@ -132,11 +132,15 @@ def create_init_class(self, attributes, expresions): if not isinstance(type.parent,ObjectType): instructions.append(CILArgNode(CILVariableNode(f'self'))) - instructions.append(CILVCallNode(type.parent.name, f'init_{type.parent.name}')) + call = CILVCallNode(type.parent.name, f'init_{type.parent.name}') + instructions.append(CILAssignNode(CILVariableNode('self'), call)) + for attr,expr in zip(attributes,expresions): instructions.append(CILSetAttributeNode(CILVariableNode('self'), self.current_class, CILVariableNode(attr), expr)) + instructions.append(CILReturnNode(CILVariableNode('self'))) + return CILFuncNode(f'init_{self.current_class}',[], [], instructions) From 7470a61790ac80f9c21ba8188ef5de9b22ccb1a7 Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Fri, 25 Feb 2022 12:19:00 -0500 Subject: [PATCH 27/81] Fix bug with ARG instructions in CIL code generator --- src/code_generator/cil_codegen.py | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/code_generator/cil_codegen.py b/src/code_generator/cil_codegen.py index d2efcb353..ba48c622f 100644 --- a/src/code_generator/cil_codegen.py +++ b/src/code_generator/cil_codegen.py @@ -13,15 +13,15 @@ def visit(self, node, frame): def visit(self, node: CILProgramNode): code = '.TYPES\n\n' for t in node.types: - code += self.visit(t) + code += self.visit(t) + '\n' code += '\n' code += '.DATA\n\n' for d in node.data: - code += self.visit(d) + '\n\n' + code += self.visit(d) + '\n' code += '\n' code += '.CODE\n\n' for f in node.functions: - code += self.visit(f) + '\n\n' + code += self.visit(f) + '\n' return code @visitor.when(CILTypeNode) @@ -52,12 +52,7 @@ def visit(self, node: CILFuncNode): code += self.visit(l) code += eol for i in node.instructions: - try: - code += self.visit(i) - except: - print(code) - print('--------------------------') - print(i) + code += self.visit(i) code += eol code += '}\n\n' return code @@ -98,7 +93,7 @@ def visit(self, node: CILSetAttributeNode): @visitor.when(CILArgNode) def visit(self, node:CILArgNode): - return f'\tARG {node.id};\n' + return f'\tARG {node.var.lex};\n' @visitor.when(CILGotoNode) def visit(self, node: CILGotoNode): @@ -142,7 +137,7 @@ def visit(self, node: CILVCallNode): @visitor.when(CILLoadNode) def visit(self, node: CILLoadNode): - return f'LOAD {node.var.lex}' + return f'LOAD {node.var}' @visitor.when(CILAtomicNode) def visit(self, node: CILAtomicNode): From 447d8fbd925d0ff4fd520e7a2298f3c7fa213e9e Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Fri, 25 Feb 2022 12:25:14 -0500 Subject: [PATCH 28/81] Add basic MIPS code generator --- src/code_generator/formatter.py | 75 ++++++ src/code_generator/mips_built_in.py | 65 +++++ src/code_generator/spim_scope.py | 120 +++++++++ src/code_generator/spim_visitor.py | 395 ++++++++++++++++++++++++++++ 4 files changed, 655 insertions(+) create mode 100644 src/code_generator/formatter.py create mode 100644 src/code_generator/mips_built_in.py create mode 100644 src/code_generator/spim_scope.py create mode 100644 src/code_generator/spim_visitor.py diff --git a/src/code_generator/formatter.py b/src/code_generator/formatter.py new file mode 100644 index 000000000..cc59252f5 --- /dev/null +++ b/src/code_generator/formatter.py @@ -0,0 +1,75 @@ +FP = "$fp" +SP = "$sp" +RA = "$ra" +A0 = "$a0" +A1 = "$a1" +A2 = "$a2" +A3 = "$a3" +A4 = "$a4" +A5 = "$a5" +A6 = "$a6" +V0 = "$v0" +V1 = "$v1" +V2 = "$v2" +V3 = "$v3" +V4 = "$v4" +V5 = "$v5" +V6 = "$v6" +V7 = "$v7" + +class MIPSFormatter: + def __init__(self): + self.code = "" + + def reset(self): + self.code = "" + + def new_line(self): + self.code += '\n' + + def move(self, reg1, reg2): + self.code += f"\tmove {reg1}, {reg2}\n" + + def load_int(self, reg, val): + self.code += f"\tli {reg}, {val}\n" + + def syscall(self): + self.code += f"\tsyscall\n" + + def push(self, val): + self.code += f"\tsw {val}, 0($sp)\n" + self.code += f"\taddu $sp, $sp, -4\n" + + def pop(self, reg): + self.code += f"\tlw {reg}, 0($sp)\n" + self.code += f"\taddu $sp, $sp, 4\n" + + def label(self, label): + self.code += f"{label}:\n" + + def load_byte(self, reg, val): + self.code += f"\tlb {reg}, {val}\n" + + def jump(self, label): + self.code += f"\tj {label}\n" + + def jump_return(self): + self.code += f"\tjr $ra\n" + + def jal(self, proc): + self.code += f"\tjal proc\n" + + def load_word(self, reg, addr): + self.code += f"\tlw {reg}, {addr}\n" + + def save_word(self, reg, addr): + self.code += f"\tsw {reg}, {addr}\n" + + def addu(self, dst, op1, op2): + self.code += f"\taddu {dst}, {op1}, {op2}\n" + + def bgtz(self, reg, label): + self.code += f"\tbgtz {reg}, {label}\t" + + def addr(self, offset, reg): + return f'{offset}({reg})' diff --git a/src/code_generator/mips_built_in.py b/src/code_generator/mips_built_in.py new file mode 100644 index 000000000..66c6f6594 --- /dev/null +++ b/src/code_generator/mips_built_in.py @@ -0,0 +1,65 @@ +from .formatter import * + +coder = MIPSFormatter() +coder.label("Object_abort") +coder.load_int(V0, 55) +coder.move(A0, "ObjectErrorMessage") +coder.load_int(A1, 0) +coder.syscall() +coder.new_line() +coder.load_int(V0, 17) +coder.load_int(A0, 1) +coder.syscall() + +OBJECT_ABORT = coder.code + +coder.reset() + +coder.label("Object_type_name") +coder.push(RA) +coder.push(FP) +coder.move(FP, SP) + +coder.new_line() +coder.load_word(V7, '12($fp})') +coder.load_word(V6, '0($v7)') + +coder.new_line() +coder.load_word(A0, '4($v6)') +coder.load_int(V0, 4) +coder.syscall() + +coder.new_line() +coder.move(SP, FP) +coder.pop(FP) +coder.pop(RA) +coder.jump_return() + +OBJECT_TYPE_NAME = coder.code + +coder.reset() + +coder.label("copy_Object") +coder.load_word(V7, '12($fp)') +coder.load_word(V6, '0($v7)') +coder.laod_word(V5, '0($v6)') + +coder.new_line() +coder.move(A0, V7) +coder.load_int(V0, 9) +coder.syscall() + +coder.move(V6, V0) +coder.label("copy_Object_loop") +coder.load_word(V4, '0($v7)') +coder.save_word(V4, '0($v6)') +coder.addu(V7, V7, 4) +coder.addu(V6, V6, 4) +coder.addu(V5, V5, -4) +coder.bgtz(V5, "copy_Object_loop") +coder.jump_return() + + + + + diff --git a/src/code_generator/spim_scope.py b/src/code_generator/spim_scope.py new file mode 100644 index 000000000..9a3cb445f --- /dev/null +++ b/src/code_generator/spim_scope.py @@ -0,0 +1,120 @@ +import cmp.visitor as visitor +from .ast_CIL import * + +WSIZE = 4 + +class MIPSScope: + def __init__(self): + self.types = {} + self.functions = {} + + def __str__(self): + r = '' + for f, cf in self.functions.items(): + r += f'{f}\n' + r += f'{cf}\n\n' + return r + + + +class TypeInfo: + def __init__(self, typex: CILTypeNode): + # This is obvious + self.id = typex.id + + # Memory to allocate for an instance of the type + self.size = (len(typex.attributes) + 1) * WSIZE + + # Use this offset to calculate the attribute address, given the address of the instance will be attr_addr = inst_addr + WORD_SIZE * offset + self.attrs_offset = {attr.id : i for i, attr in enumerate(typex.attributes)} + + # Associates every method of the type to the label to call + self.methods_offset = { m.id : i for i, m in enumerate(typex.methods) } + + def get_attr_addr(self, attr, register): + offset = self.attrs_offset[attr] + return f'{(offset + 1) * WSIZE}({register})' + + def get_method_addr(self, method, register): + offset = self.methods_offset[method] + return f'{(offset + 1) * WSIZE}({register})' + + +class ProcCallFrame: + def __init__(self, nargs, nvars): + self.nargs = nargs + self.size = WSIZE * nvars + self.args = {} # Associates each argument with the offset to be accessed in the stack + self.vars = {} # Associates each parameter with the offset to be accessed in the stack + self.arg_queue = [] + + def push_arg(self, arg): + self.arg_queue.append(arg) + + def clear_args(self): + self.arg_queue = [] + + + def add_argument(self, idx): + self.args[idx] = self.nargs - len(self.args) + + def add_variable(self, idx): + self.vars[idx] = len(self.vars) + + def arg_addr(self, id): + offset = self.args[id] + return f'{(3 + offset) * WSIZE}($fp)' + + def var_addr(self, id): + offset = self.vars[id] + return f'{offset * WSIZE}($fp)' + + def get_addr(self, id): + try: + return self.arg_addr(id) + except KeyError: + return self.var_addr(id) + + def __str__(self): + r = '-------------- Frame -----------------\n' + r += f'Size: {self.size}\n' + r += f'Args: {self.args}\n' + r += f'Vars: {self.vars}\n' + r += '-----------------------------------------\n' + return r + +class MIPSScopeBuilder: + def __init__(self): + self.scope = MIPSScope() + + @visitor.on('node') + def visit(self, node): + pass + + @visitor.when(CILProgramNode) + def visit(self, node: CILProgramNode): + for t in node.types: + self.visit(t) + + for f in node.functions: + self.visit(f) + + return self.scope + + @visitor.when(CILTypeNode) + def visit(self, node: CILTypeNode): + info = TypeInfo(node) + self.scope.types[node.id] = info + + @visitor.when(CILFuncNode) + def visit(self, node: CILFuncNode): + frame = ProcCallFrame(len(node.params), len(node.locals)) + for p in node.params: + frame.add_argument(p.id) + for l in node.locals: + frame.add_variable(l.id) + self.scope.functions[node.id] = frame + + + + diff --git a/src/code_generator/spim_visitor.py b/src/code_generator/spim_visitor.py new file mode 100644 index 000000000..88c7592e4 --- /dev/null +++ b/src/code_generator/spim_visitor.py @@ -0,0 +1,395 @@ +import cmp.visitor as visitor +from .spim_scope import * +from .ast_CIL import * + +WSIZE = 4 # word size in bytes + +class MIPSCodegen: + def __init__(self, scope): + self.scope = scope + self.code = "" + self.tabs = '' + + # =================== Utils ======================== + def add_line(self,line): + self.code += self.tabs + line + '\n' + + def set_tabs(self,n): + self.tabs = '\t' * n + + def gen_push(self,src): + self.add_line(f'# push {src} to the stack') + self.add_line(f'sw {src}, 0($sp)') + self.add_line(f'subu $sp $sp {WSIZE}') + self.add_line('') + + def gen_pop(self,dst): + self.add_line(f'# pop the top of the stack to {dst}') + self.add_line(f'sw 0($sp), {dst}') + self.add_line(f'addu $sp $sp {WSIZE}') + self.add_line('') + + @visitor.on('node') + def visit(self, node, frame): + pass + + @visitor.when(CILProgramNode) + def visit(self, node: CILProgramNode, frame): + for t in node.types: + self.visit(t, frame) + + for d in node.data: + self.visit(d, frame) + + for f in node.functions: + self.visit(f, frame) + + @visitor.when(CILTypeNode) + def visit(self, node: CILTypeNode, frame): + # place the type name as a string in static data + self.set_tabs(1) + self.add_line(".data") + self.set_tabs(0) + methods_str = ' '.join(m.function_id for m in node.methods) + self.add_line(f"{node.id}: .word {node.id} {methods_str}") + self.add_line('') + + @visitor.when(CILDataNode) + def visit(self, node: CILDataNode, frame): + self.set_tabs(1) + self.add_line(".data") + self.set_tabs(0) + self.add_line(f"_{node.id}: .asciiz \"{node.text}\"") + self.add_line('') + + @visitor.when(CILFuncNode) + def visit(self, node: CILFuncNode, frame): + frame = self.scope.functions[node.id] + + self.set_tabs(0) + self.add_line(f'{node.id}:') # Place the label + + self.set_tabs(1) + self.add_line('# save the return address and frame pointer') + self.gen_push('$ra') # Save the return address + self.gen_push('$fp') # Save the frame pointer + + self.add_line('# update the frame pointer and allocate the frame in the stack') + self.add_line(f'move $fp $sp') # Update the frame pointer to the top of the stack + + # Allocate frame size in memory + self.add_line(f'subu $sp $sp {frame.size}') + self.add_line('') + + for i in node.instructions: + self.visit(i, frame) + + self.add_line(f'# restore the stack pointer, frame pointer y return address') + self.add_line(f'move $sp $fp') + self.gen_pop('$fp') + self.gen_pop('$ra') + + @visitor.when(CILAttributeNode) + def visit(self, node: CILAttributeNode, frame): + pass + + @visitor.when(CILMethodNode) + def visit(self, node: CILMethodNode, frame): + pass + + @visitor.when(CILParamNode) + def visit(self, node: CILParamNode, frame): + pass + + @visitor.when(CILLocalNode) + def visit(self, node: CILParamNode, frame): + pass + + # ==================== Instructions ======================== + @visitor.when(CILInstructionNode) + def visit(self, node, frame): + pass + + @visitor.when(CILAssignNode) + def visit(self, node: CILAssignNode, frame: ProcCallFrame): + # Adds the code for calculating the expresion and stores the address for the value in register + self.add_line(f'# assign (add here the expr.to_string) to {node.id.lex}') + register = self.visit(node.expr, frame) + id_addr = frame.get_addr(node.id.lex) + self.add_line(f'sw {register}, {id_addr}') + self.add_line(f'') + + @visitor.when(CILSetAttributeNode) + def visit(self, node: CILSetAttributeNode, frame): + self.add_line(f'# Setting value of the attribute {node.attr.lex} in the instance {node.id.lex} to {node.var.lex}') + inst_addr = frame.get_addr(node.id.lex) + t = self.scope.types[node.type] # Change this for dynamic type? Not needed because the attributes are always declared in the same order in inhereted classes + register1 = '$v1' + register2 = '$v2' + attr_addr = t.get_attr_addr(node.attr.lex, register1) # + value_addr = self.visit(node.var, frame) + self.add_line(f'move {register2}, {value_addr}') + self.add_line(f'lw {register1}, {inst_addr}') + self.add_line(f'sw {register2}, {attr_addr}') + self.add_line('') + + @visitor.when(CILArgNode) + def visit(self, node: CILArgNode, frame): + frame.push_arg(node.var) # keep track of the args to be pass to the funcion to get the instance to bind the dynamic type + value_addr = frame.get_addr(node.var.id) + self.gen_push(value_addr) + + @visitor.when(CILIfGotoNode) + def visit(self, node: CILIfGotoNode, frame): + register = '$v1' + value_addr = frame.get_addr(node.var.id) + self.add_line(f'lw {register}, {value_addr}') + self.add_line(f'bne {register}, $zero, {node.label.id}') + + @visitor.when(CILGotoNode) + def visit(self, node: CILGotoNode, frame): + self.add_line(f'j {node.label.id}') + + @visitor.when(CILLabelNode) + def visit(self, node: CILLabelNode, frame): + self.add_line(f'{node.id}:') + + @visitor.when(CILReturnNode) + def visit(self, node: CILReturnNode,frame): + register0 = '$v0' + self.add_line(f'# return the value of the function in the register {register0}') + register1 = self.visit(node.var, frame) + self.add_line(f'move {register0}, {register1}') + self.add_line('') + + @visitor.when(CILPrint) + def visit(self, node: CILPrint,frame): + value_addr = frame.get_addr(node.var.id) + self.add_line(f'lw $a0, {value_addr}') + self.add_line(f'li $v0, 1') + self.add_line(f'syscall') + + @visitor.when(CILExpressionNode) + def visit(self, node: CILExpressionNode,frame): + pass + + @visitor.when(CILBinaryOperationNode) + def visit(self, node: CILBinaryOperationNode, frame): + pass + + @visitor.when(CILGetAttribute) + def visit(self, node: CILGetAttribute, frame): + var_addr = frame.get_addr(node.var.lex) + register0 = '$v0' + register1 = '$v1' + t = self.scope.types[node.type] + attr_addr = t.get_attr_addr(node.attr.lex, register1) + + # the memory of at var_addr contains the address to the instance of T + # move the instance address to the register + self.add_line(f'lw {register1}, {var_addr}') + self.add_line(f'lw {register0}, {attr_addr}') + return register0 + + @visitor.when(CILAllocateNode) + def visit(self, node: CILAllocateNode, frame): + register0 = '$v0' + register1 = '$a0' + t = self.scope.types[node.type] + + self.add_line(f'li {register1}, {t.size}') + self.add_line(f'li {register0}, 9') + self.add_line(f'syscall') + self.add_line(f'sw {node.type}, {register0}') # Place the dynamic type of the instance in memory + return register0 + + @visitor.when(CILTypeOfNode) # Get the dynamic type of an instance + def visit(self, node: CILTypeOfNode, frame): + register0 = '$v0' + register1 = '$v1' + var_addr = frame.get_addr(node.var.lex) + # register0 points to the heap + self.add_line = ('lw {register1}, {var_addr}') + self.add_line = ('lw {register0}, {register1}') + return register0 + + @visitor.when(CILCallNode) # I don't think this is necessary + def visit(self, node: CILCallNode, frame): + register0 = '$v0' + self.add_line(f'jal {node.func}') + return register0 + + @visitor.when(CILVCallNode) + def visit(self, node: CILVCallNode, frame): + # the instance of type T is always the first argument to be passed to the function + instance = frame.arg_queue[0] + instance_addr = self.visit(instance) # load into a register the address of the instance in the heap + + register0 = '$v0' + # register0 has the dynamic type address of the instance + # since every instance stores its type in the first word of the allocated memory + self.add_line('lw {register0}, {instance_addr}') + + # use the information of the static type to get the location of the method in memory + t = scope.types[node.type] + method_addr = t.get_method_addr(node.func, register0) + + self.add_line(f'jal {method_addr}') # calls the method and by convention methods return in $v0 + frame.clear_args() # clear arguments for the new function + + return '$v0' + + @visitor.when(CILLoadNode) + def visit(self, node: CILLoadNode, frame): + self.add_line(f'#load the string {node.var.id}') + register = '$v0' + self.add_line(f'lw {register}, {node.var.id}') + return register + + @visitor.when(CILLengthNode) + def visit(self, node: CILLengthNode, frame): + register = '$v0' + str_addr = frame.get_addr(node.var.id) + self.gen_push(str_addr) + self.add_line(f'jal strlen') + return register + + @visitor.when(CILStringNode) + def visit(self, node: CILStringNode, frame): + register = '$v0' + int_addr = frame.get_addr(node.var.id) + self.gen_push(int_addr) + self.add_line(f'jal str') + return register + + @visitor.when(CILNumberNode) + def visit(self, node: CILNumberNode, frame): + register = '$v0' + self.add_line(f'li {register}, {node.lex}') + return register + + @visitor.when(CILVariableNode) + def visit(self, node: CILVariableNode, frame): + self.add_line(f'#load the variable {node.lex}') + register = '$v0' + var_addr = frame.get_addr(node.lex) + self.add_line(f'lw {register}, {var_addr}') + return register + + @visitor.when(CILPlusNode) + def visit(self, node: CILPlusNode, frame): + register0 = '$v0' + register1 = '$v1' + self.add_line(f'# computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at {register0}') + self.visit(node.left, frame) + self.add_line(f'move {register1}, {register0}') + self.visit(node.right, frame) + self.add_line(f'addu {register0}, {register0}, {register1}') + return register0 + + @visitor.when(CILMinusNode) + def visit(self, node: CILMinusNode, frame): + register0 = '$v0' + register1 = '$v1' + self.add_line(f'# computes the substraction of (node.left.to_string) and (node.right.to_string) and stores it at {register0}') + self.visit(node.left, frame) + self.add_line(f'move {register1}, {register0}') + self.visit(node.right, frame) + self.add_line(f'subu {register0}, {register1}, {register0}') + return register0 + + + @visitor.when(CILStarNode) + def visit(self, node: CILStarNode, frame): + register0 = '$v0' + register1 = '$v1' + self.add_line(f'# computes the multiplication of (node.left.to_string) and (node.right.to_string) and stores it at {register0}') + self.visit(node.left, frame) + self.add_line(f'move {register1}, {register0}') + self.visit(node.right, frame) + self.add_line(f'mult {register0}, {register0}') + self.add_line(f'mflo {register0}') + return register0 + + @visitor.when(CILDivNode) + def visit(self, node: CILDivNode, frame): + register0 = '$v0' + register1 = '$v1' + self.add_line(f'# computes the quotient of (node.left.to_string) and (node.right.to_string) and stores it at {register0}') + self.visit(node.left, frame) + self.add_line(f'move {register1}, {register0}') + self.visit(node.right, frame) + self.add_line(f'div {register1}, {register0}') + self.add_line(f'mflo {register0}') + return register0 + + @visitor.when(CILLessNode) + def visit(self, node: CILLessNode, frame): + register0 = '$v0' + register1 = '$v1' + self.visit(node.left, frame) + self.add_line(f'move {register1}, {register0}') + self.visit(node.right, frame) + self.add_line(f'slt {register0}, {register1}, {register0}') + return register0 + + @visitor.when(CILElessNode) + def visit(self, node: CILElessNode, frame): + register0 = '$v0' + register1 = '$v1' + register2 = '$v2' + register3 = '$v3' + register4 = '$v4' + self.visit(node.left, frame) + self.add_line(f'move {register1}, {register0}') + self.add_line(f'move {register3}, {register0}') + self.visit(node.right, frame) + self.add_line(f'move {register2}, {register0}') + self.add_line(f'slt {register0}, {register1}, {register0}') + self.add_line(f'slt {register2}, {register2}, {register3}') + self.add_line(f'nor {register2}, {register2}, $zero') + self.add_line(f'and {register0}, {register0}, {register2}') + return register0 + + @visitor.when(CILEqualsNode) + def visit(self, node: CILEqualsNode, frame): + register0 = '$v0' + register1 = '$v1' + register2 = '$v2' + register3 = '$v3' + register4 = '$v4' + self.visit(node.left, frame) + self.add_line(f'move {register1}, {register0}') + self.add_line(f'move {register3}, {register0}') + self.visit(node.right, frame) + self.add_line(f'move {register2}, {register0}') + self.add_line(f'slt {register0}, {register1}, {register0}') + self.add_line(f'nor {register0}, {register0}, $zero') + self.add_line(f'slt {register2}, {register2}, {register3}') + self.add_line(f'nor {register2}, {register2}, $zero') + self.add_line(f'and {register0}, {register0}, {register2}') + return register0 + + + + + + + + + + + + + + + + + + + + + + + + From cb868f73b9c7788ef37181422ee4927827c4c92a Mon Sep 17 00:00:00 2001 From: Amy Date: Fri, 25 Feb 2022 14:47:03 -0500 Subject: [PATCH 29/81] Fix some errores found --- src/code_generator/ast_CIL.py | 2 -- src/code_generator/cil_codegen.py | 8 ++++++- src/code_generator/generate_ast.py | 37 +++++++++++++++++++++--------- src/code_generator/utils.py | 15 ++++++++---- src/tours/TypeChecker.py | 9 ++------ 5 files changed, 45 insertions(+), 26 deletions(-) diff --git a/src/code_generator/ast_CIL.py b/src/code_generator/ast_CIL.py index a2140f700..ab74d0868 100644 --- a/src/code_generator/ast_CIL.py +++ b/src/code_generator/ast_CIL.py @@ -245,9 +245,7 @@ def __init__(self, type): def __str__(self): text = "AllocateNode:\n" - text += f"var: {self.var}\n" text += f"type: {self.type}\n" - text += f"att: {self.attr}\n" return text diff --git a/src/code_generator/cil_codegen.py b/src/code_generator/cil_codegen.py index ba48c622f..e0e6d0a49 100644 --- a/src/code_generator/cil_codegen.py +++ b/src/code_generator/cil_codegen.py @@ -125,7 +125,7 @@ def visit(self, node: CILGetAttribute): @visitor.when(CILAllocateNode) def visit(self, node: CILAllocateNode): - return f'ALLOCATE {node.type}' + return f'ALLOCATE {node.type.lex}' @visitor.when(CILTypeOfNode) def visit(self, node: CILTypeOfNode): @@ -196,3 +196,9 @@ def visit(self, node: CILEqualsNode): l = self.visit(node.left) r = self.visit(node.right) return f'{l} == {r}' + + @visitor.when(CILNotEqualsNode) + def visit(self, node: CILNotEqualsNode): + l = self.visit(node.left) + r = self.visit(node.right) + return f'{l} != {r}' diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 3854c47dd..55baaa023 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -64,14 +64,14 @@ def visit(self, node): if isinstance(feature, AttrDeclarationNode): if feature.expr is not None: expr = self.visit(feature.expr) - expressions.append(expr) + expressions.append((expr, feature.expr.computed_type)) att_aux.append(feature.id) else: function = self.visit(feature) self.scope.functions.append(function) - init_class = self.scope.create_init_class(att_aux , expressions) + init_class = self.scope.create_init_class(att_aux, expressions) self.scope.functions.append(init_class) return CILTypeNode(node.id, attributes, methods) @@ -115,9 +115,13 @@ def visit(self, node): name = self.scope.add_new_local(node.expr.computed_type.name) instruction = CILAssignNode(CILVariableNode(name), expr) self.scope.instructions.append(instruction) - else: + type = node.expr.computed_type.name + elif node.expr.lex == 'self': name = f'self_{self.scope.current_class}' - + type = self.scope.current_class + else: + name = self.scope.find_local(node.expr.lex) + type = node.expr.computed_type.name args = [] args.append(CILArgNode(CILVariableNode(name))) for arg in node.arg: @@ -132,10 +136,10 @@ def visit(self, node): self.scope.instructions.extend(args) if node.type is not None: - expression = CILVCallNode(node.type.name, node.id) + expression = CILVCallNode(node.type, node.id) else: - expression = CILCallNode(node.id) - type = self.scope.ret_type_of_method(node.id, self.scope.current_class) + expression = CILVCallNode(self.scope.current_class, node.id) + type = self.scope.ret_type_of_method(node.id, type) new_var = self.scope.add_new_local(type) node_var = CILVariableNode(new_var) self.scope.instructions.append(CILAssignNode(node_var, expression)) @@ -246,7 +250,7 @@ def visit(self, node): def visit(self, node): self.scope.locals.append({}) local = self.scope.add_local(node.id, node.type) - self.scope.instructions.append(CILAssignNode( CILVariableNode(local), self.expression_var_case)) + self.scope.instructions.append(CILAssignNode(CILVariableNode(local), self.expression_var_case)) expression_branch = self.visit(node.expr) self.scope.locals.pop() @@ -255,13 +259,20 @@ def visit(self, node): @visitor.when(AssignNode) def visit(self, node): var = self.visit(node.expr) + + if not isinstance(var, CILAtomicNode): + variable = CILVariableNode(self.scope.add_new_local(node.expr.computed_type.name)) + self.scope.instructions.append(CILAssignNode(variable, var)) + else: + variable = CILVariableNode(var.lex) + local = self.scope.find_local(node.id.lex) if local is not None: self.scope.instructions.append(CILAssignNode(CILVariableNode(local.id), var)) return CILVariableNode(local.id) else: - self.scope.instructions.append(CILSetAttributeNode(CILVariableNode(f'self_{self.scope.current_class}'), self.scope.current_class, CILVariableNode(node.id.lex), var)) + self.scope.instructions.append(CILSetAttributeNode(CILVariableNode(f'self_{self.scope.current_class}'), self.scope.current_class, CILVariableNode(node.id.lex), variable)) return var @visitor.when(BinaryNode) @@ -314,7 +325,9 @@ def visit(self, node): def visit(self, node): data = CILDataNode(f'str_{self.scope.str_count}', node.lex) self.scope.data.append(data) - return CILLoadNode(data.id) + name = self.scope.add_new_local('String') + self.scope.instructions.append(CILAssignNode(CILVariableNode(name), CILLoadNode(data.id))) + return CILVariableNode(name) @visitor.when(IsVoidNode) def visit(self, node): @@ -348,4 +361,6 @@ def visit(self, node): @visitor.when(InstantiateNode) def visit(self, node): - return CILAllocateNode(CILTypeConstantNode(node.lex)) + name = self.scope.add_new_local(node.lex) + self.scope.instructions.append(CILAssignNode(CILVariableNode(name),CILAllocateNode(CILTypeConstantNode(node.lex)))) + return CILVariableNode(name) diff --git a/src/code_generator/utils.py b/src/code_generator/utils.py index 00cc92258..49a8ef6a1 100644 --- a/src/code_generator/utils.py +++ b/src/code_generator/utils.py @@ -12,7 +12,7 @@ def __init__(self, context): self.str_count = 0 self.loop_count = 0 - self.locals = [] + self.locals = [{}] self.all_locals = [] self.instructions = [] self.data = [] @@ -134,10 +134,15 @@ def create_init_class(self, attributes, expresions): instructions.append(CILArgNode(CILVariableNode(f'self'))) call = CILVCallNode(type.parent.name, f'init_{type.parent.name}') instructions.append(CILAssignNode(CILVariableNode('self'), call)) - - - for attr,expr in zip(attributes,expresions): - instructions.append(CILSetAttributeNode(CILVariableNode('self'), self.current_class, CILVariableNode(attr), expr)) + + for attr, (expr, type) in zip(attributes, expresions): + if not isinstance(expr, CILAtomicNode): + variable = CILVariableNode(self.add_new_local(type)) + self.instructions.append(CILAssignNode(variable, expr)) + else: + variable = CILVariableNode(expr.lex) + + instructions.append(CILSetAttributeNode(CILVariableNode('self'), self.current_class, CILVariableNode(attr), variable)) instructions.append(CILReturnNode(CILVariableNode('self'))) diff --git a/src/tours/TypeChecker.py b/src/tours/TypeChecker.py index 07968a831..2abc5635a 100644 --- a/src/tours/TypeChecker.py +++ b/src/tours/TypeChecker.py @@ -174,6 +174,7 @@ def visit(self, node, scope): obj_type = scope.find_variable('self').type try: + obj_type = self.context.get_type(obj_type.name) method = obj_type.get_method(node.id) if (node.arg is None and method.arg is None) or (len(node.arg) == len(method.param_types)): if node.arg is not None: @@ -362,13 +363,7 @@ def visit(self, node, scope): node.computed_type = ErrorType() else: if left_type == right_type: - if left_type == StringType() or left_type == IntType() or left_type == BoolType(): - node.computed_type = BoolType() - else: - e = OPERATION_NOT_DEFINED.replace('%s', "equals", 1).replace('%s', left_type.name, 1) - location = node.left.location - self.errors.append(f'{location} - {e}') - node.computed_type = ErrorType() + node.computed_type = BoolType() else: if is_base_class(left_type.name) or is_base_class(right_type.name): self.errors.append(f'{node.symbol_location} - {INVALID_BASIC_COMPARISON}') From 9ce420dd780970008c2d1bf61ee91d2295ccf4e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karla=20Olivera=20Hern=C3=A1ndez?= Date: Fri, 25 Feb 2022 14:56:56 -0500 Subject: [PATCH 30/81] Fix error found --- src/code_generator/utils.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/code_generator/utils.py b/src/code_generator/utils.py index 49a8ef6a1..bb07d0a89 100644 --- a/src/code_generator/utils.py +++ b/src/code_generator/utils.py @@ -128,8 +128,6 @@ def create_init_class(self, attributes, expresions): type = self.context.get_type(self.current_class) instructions = [] - instructions.append(CILParamNode('self', None)) - if not isinstance(type.parent,ObjectType): instructions.append(CILArgNode(CILVariableNode(f'self'))) call = CILVCallNode(type.parent.name, f'init_{type.parent.name}') @@ -146,7 +144,7 @@ def create_init_class(self, attributes, expresions): instructions.append(CILReturnNode(CILVariableNode('self'))) - return CILFuncNode(f'init_{self.current_class}',[], [], instructions) + return CILFuncNode(f'init_{self.current_class}', [CILParamNode('self', None)], [], instructions) class TypeInfo: From 2ba73f8d503dcfeacb24821729fb73ec51626750 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karla=20Olivera=20Hern=C3=A1ndez?= Date: Fri, 25 Feb 2022 15:25:09 -0500 Subject: [PATCH 31/81] Fix other errors --- src/code_generator/generate_ast.py | 6 +++++- src/code_generator/utils.py | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 55baaa023..2124b15d5 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -324,6 +324,7 @@ def visit(self, node): @visitor.when(StringNode) def visit(self, node): data = CILDataNode(f'str_{self.scope.str_count}', node.lex) + self.scope.str_count += 1 self.scope.data.append(data) name = self.scope.add_new_local('String') self.scope.instructions.append(CILAssignNode(CILVariableNode(name), CILLoadNode(data.id))) @@ -349,7 +350,10 @@ def visit(self, node): if local is not None: return CILVariableNode(local.id) else: - return CILGetAttribute(CILVariableNode(f'self_{self.scope.current_class}'), self.scope.current_class, CILVariableNode(node.lex)) + if node.lex == 'self': + return CILVariableNode(f'self_{self.scope.current_class}') + else: + return CILGetAttribute(CILVariableNode(f'self_{self.scope.current_class}'), self.scope.current_class, CILVariableNode(node.lex)) @visitor.when(TrueNode) def visit(self, node): diff --git a/src/code_generator/utils.py b/src/code_generator/utils.py index bb07d0a89..6b0779570 100644 --- a/src/code_generator/utils.py +++ b/src/code_generator/utils.py @@ -130,7 +130,7 @@ def create_init_class(self, attributes, expresions): if not isinstance(type.parent,ObjectType): instructions.append(CILArgNode(CILVariableNode(f'self'))) - call = CILVCallNode(type.parent.name, f'init_{type.parent.name}') + call = CILVCallNode(type.parent.name, f'init') instructions.append(CILAssignNode(CILVariableNode('self'), call)) for attr, (expr, type) in zip(attributes, expresions): From cff9910dffc41133d5d0244d33366e5abcb5b91a Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Fri, 25 Feb 2022 15:26:30 -0500 Subject: [PATCH 32/81] Fix bugs with CIL AST node properties --- src/code_generator/mips_built_in.py | 40 +++++- src/code_generator/mips_built_in.txt | 192 +++++++++++++++++++++++++++ src/code_generator/spim_visitor.py | 36 ++--- src/cool.py | 13 +- src/program.cl | 5 + 5 files changed, 254 insertions(+), 32 deletions(-) create mode 100644 src/code_generator/mips_built_in.txt create mode 100644 src/program.cl diff --git a/src/code_generator/mips_built_in.py b/src/code_generator/mips_built_in.py index 66c6f6594..3cd13b10b 100644 --- a/src/code_generator/mips_built_in.py +++ b/src/code_generator/mips_built_in.py @@ -42,7 +42,7 @@ coder.label("copy_Object") coder.load_word(V7, '12($fp)') coder.load_word(V6, '0($v7)') -coder.laod_word(V5, '0($v6)') +coder.load_word(V5, '0($v6)') coder.new_line() coder.move(A0, V7) @@ -59,6 +59,44 @@ coder.bgtz(V5, "copy_Object_loop") coder.jump_return() +OBJECT_COPY = coder.code + +coder.reset() +coder.label("out_string_IO") +coder.load_word(A0, '12($fp)') +coder.move(V0, 4) +coder.syscall() +coder.jump_return() + +IO_OUT_STRING = coder.code + +coder.reset() +coder.label("out_int_IO") +coder.load_word(V1, '12($fp)') +coder.load_word(A0, '4($v1)') +coder.load_int(V0, 1) +coder.syscall() +coder.jump_return() + +IO_OUT_INT = coder.code + +coder.reset() +coder.label("strlen_String") +coder.load_word(A0, '12($fp)') + + + +coder.label("in_string_IO") +coder.move(A0, "IO_Buffer") +coder.load_int(A1, 300) +coder.syscall() + + + + + + + diff --git a/src/code_generator/mips_built_in.txt b/src/code_generator/mips_built_in.txt new file mode 100644 index 000000000..b7174ee83 --- /dev/null +++ b/src/code_generator/mips_built_in.txt @@ -0,0 +1,192 @@ +abort_Object: + sw $ra, 0($sp) + addu $sp, $sp, -4 + sw $fp, 0($sp) + addu $sp, $sp, -4 + move $fp, $sp + + li $v0, 55 + move $a0, ObjectErrorMessage + li $a1, 0 + syscall + + li $v0, 17 + li $a0, 1 + syscall + + move $sp, $fp + lw $fp, 0($sp) + addu $sp, $sp, 4 + lw $ra, 0($sp) + addu $sp, $sp, 4 + jr $ra + +typename_Object: + sw $ra, 0($sp) + addu $sp, $sp, -4 + sw $fp, 0($sp) + addu $sp, $sp, -4 + move $fp, $sp + + lw $v7, 12($fp}) + lw $v6, 0($v7) + + lw $a0, 4($v6) + li $v0, 4 + syscall + + move $sp, $fp + lw $fp, 0($sp) + addu $sp, $sp, 4 + lw $ra, 0($sp) + addu $sp, $sp, 4 + jr $ra + +copy_Object: + sw $ra, 0($sp) + addu $sp, $sp, -4 + sw $fp, 0($sp) + addu $sp, $sp, -4 + move $fp, $sp + + + lw $v7, 12($fp) + lw $v6, 0($v7) + lw $v5, 0($v6) + + move $a0, $v7 + li $v0, 9 + syscall + move $v6, $v0 +copy_Object_loop: + lw $v4, 0($v7) + sw $v4, 0($v6) + addu $v7, $v7, 4 + addu $v6, $v6, 4 + addu $v5, $v5, -4 + bgtz $v5, copy_Object_loop + + move $sp, $fp + lw $fp, 0($sp) + addu $sp, $sp, 4 + lw $ra, 0($sp) + addu $sp, $sp, 4 + jr $ra + +out_int_IO: + sw $ra, 0($sp) + addu $sp, $sp, -4 + sw $fp, 0($sp) + addu $sp, $sp, -4 + move $fp, $sp + + + lw $v1, 12($fp) + lw $a0, 4($v1) + li $v0, 1 + syscall + + move $sp, $fp + lw $fp, 0($sp) + addu $sp, $sp, 4 + lw $ra, 0($sp) + addu $sp, $sp, 4 + jr $ra + +out_string_IO: + sw $ra, 0($sp) + addu $sp, $sp, -4 + sw $fp, 0($sp) + addu $sp, $sp, -4 + move $fp, $sp + + + lw $a1, 12($fp) # reference to string object + lw $a0, 4($a1) # get the address of the value of the string + move $v0, 4 + syscall + + move $sp, $fp + lw $fp, 0($sp) + addu $sp, $sp, 4 + lw $ra, 0($sp) + addu $sp, $sp, 4 + jr $ra + +strlen_String: + sw $ra, 0($sp) + addu $sp, $sp, -4 + sw $fp, 0($sp) + addu $sp, $sp, -4 + move $fp, $sp + + + lw $a0, 12$fp + li $t0, 0 +srtlen_String_loop: + lb $t1, 0($a0) + beqz $t1, strlen_String_exit + addu $a0, $a0, 1 + addu $t0, $t0, 1 + j strlen_String_loop: + strlen_String_exit: + move $v0, $t0 + + move $sp, $fp + lw $fp, 0($sp) + addu $sp, $sp, 4 + lw $ra, 0($sp) + addu $sp, $sp, 4 + jr $ra + +strcopy_String: + sw $ra, 0($sp) + addu $sp, $sp, -4 + sw $fp, 0($sp) + addu $sp, $sp, -4 + move $fp, $sp + + + lw $a0, 12$fp + + sw $a0, 0($sp) # pass the string address as a parameter + addu $sp, $sp, -4 + jal strlen_String # len of the string at v0 + + # push v0 to stack and save the len + sw $v0, 0($sp) + addu $sp, $sp, -4 + + move $a0, $v0 # pass as argument the size to alloc + li $v0, 9 + syscall # v0 location of the dst string + + lw $v1, 12$fp # load the source string address + move $v2, $v0 # copy the dst string address + + lw $v3, 0($sp) # pop the len of the string + addu $sp, $sp, 4 +strcopy_String_loop: + lb $t0, 0($v1) # load the next char + sb $t0, 0($v2) # copy the char + addu $v1, $v1, 1 + addu $v2, $v2, 1 + addu $v3, $v3, -1 # decrease the size + bgtz $v3, strcopy_String_loop + + move $sp, $fp + lw $fp, 0($sp) + addu $sp, $sp, 4 + lw $ra, 0($sp) + addu $sp, $sp, 4 + jr $ra + + + + + + + + + + diff --git a/src/code_generator/spim_visitor.py b/src/code_generator/spim_visitor.py index 88c7592e4..3ee31c56d 100644 --- a/src/code_generator/spim_visitor.py +++ b/src/code_generator/spim_visitor.py @@ -50,8 +50,10 @@ def visit(self, node: CILTypeNode, frame): self.set_tabs(1) self.add_line(".data") self.set_tabs(0) + type_info = self.scope.types[node.id] methods_str = ' '.join(m.function_id for m in node.methods) - self.add_line(f"{node.id}: .word {node.id} {methods_str}") + self.add_line(f"_{node.id}: .asciiz \"{node.id}\"") + self.add_line(f"{node.id}: .word {type_info.size} _{node.id} {methods_str}") self.add_line('') @visitor.when(CILDataNode) @@ -136,13 +138,13 @@ def visit(self, node: CILSetAttributeNode, frame): @visitor.when(CILArgNode) def visit(self, node: CILArgNode, frame): frame.push_arg(node.var) # keep track of the args to be pass to the funcion to get the instance to bind the dynamic type - value_addr = frame.get_addr(node.var.id) + value_addr = frame.get_addr(node.var.lex) self.gen_push(value_addr) @visitor.when(CILIfGotoNode) def visit(self, node: CILIfGotoNode, frame): register = '$v1' - value_addr = frame.get_addr(node.var.id) + value_addr = frame.get_addr(node.var.lex) self.add_line(f'lw {register}, {value_addr}') self.add_line(f'bne {register}, $zero, {node.label.id}') @@ -162,12 +164,6 @@ def visit(self, node: CILReturnNode,frame): self.add_line(f'move {register0}, {register1}') self.add_line('') - @visitor.when(CILPrint) - def visit(self, node: CILPrint,frame): - value_addr = frame.get_addr(node.var.id) - self.add_line(f'lw $a0, {value_addr}') - self.add_line(f'li $v0, 1') - self.add_line(f'syscall') @visitor.when(CILExpressionNode) def visit(self, node: CILExpressionNode,frame): @@ -223,7 +219,7 @@ def visit(self, node: CILCallNode, frame): def visit(self, node: CILVCallNode, frame): # the instance of type T is always the first argument to be passed to the function instance = frame.arg_queue[0] - instance_addr = self.visit(instance) # load into a register the address of the instance in the heap + instance_addr = self.visit(instance, frame) # load into a register the address of the instance in the heap register0 = '$v0' # register0 has the dynamic type address of the instance @@ -231,7 +227,7 @@ def visit(self, node: CILVCallNode, frame): self.add_line('lw {register0}, {instance_addr}') # use the information of the static type to get the location of the method in memory - t = scope.types[node.type] + t = self.scope.types[node.type] method_addr = t.get_method_addr(node.func, register0) self.add_line(f'jal {method_addr}') # calls the method and by convention methods return in $v0 @@ -241,26 +237,12 @@ def visit(self, node: CILVCallNode, frame): @visitor.when(CILLoadNode) def visit(self, node: CILLoadNode, frame): - self.add_line(f'#load the string {node.var.id}') + self.add_line(f'#load the string {node.var}') register = '$v0' - self.add_line(f'lw {register}, {node.var.id}') + self.add_line(f'lw {register}, {node.var}') return register - @visitor.when(CILLengthNode) - def visit(self, node: CILLengthNode, frame): - register = '$v0' - str_addr = frame.get_addr(node.var.id) - self.gen_push(str_addr) - self.add_line(f'jal strlen') - return register - @visitor.when(CILStringNode) - def visit(self, node: CILStringNode, frame): - register = '$v0' - int_addr = frame.get_addr(node.var.id) - self.gen_push(int_addr) - self.add_line(f'jal str') - return register @visitor.when(CILNumberNode) def visit(self, node: CILNumberNode, frame): diff --git a/src/cool.py b/src/cool.py index 92f6b613c..be0551c4b 100644 --- a/src/cool.py +++ b/src/cool.py @@ -4,9 +4,10 @@ from tours.TypeCollector import TypeCollector from tours.TypeBuilder import TypeBuilder from tours.TypeChecker import TypeChecker -from code_generator.generate_ast import * +from code_generator.generate_ast import CIL from code_generator.cil_codegen import CILCodegen - +from code_generator.spim_scope import MIPSScopeBuilder +from code_generator.spim_visitor import MIPSCodegen input_file = sys.argv[1] with open(input_file, 'r') as f: s = f.read() @@ -49,9 +50,13 @@ cil = cil_generator.visit(ast) cil_codegen = CILCodegen() code = cil_codegen.visit(cil) -print('-----------------CIL AST----------------------') +mips_scope_builder = MIPSScopeBuilder() print(cil) print('---------------- CIL Code------------------') print(code) -print('-------------------Done--------------------') +print('-----------------MIPS----------------------') +scope = mips_scope_builder.visit(cil) +mips_codegen = MIPSCodegen(scope) +mips_codegen.visit(cil, None) +print(mips_codegen.code) exit(0) diff --git a/src/program.cl b/src/program.cl new file mode 100644 index 000000000..0c818f908 --- /dev/null +++ b/src/program.cl @@ -0,0 +1,5 @@ +class Main inherits IO { + main(): IO { + out_string("Hello, World.\n") + }; +}; From 6cf0809e32853b0ad5cc650574bf3c6cc8fa01fa Mon Sep 17 00:00:00 2001 From: Amy Date: Fri, 25 Feb 2022 16:32:35 -0500 Subject: [PATCH 33/81] fix errors --- src/code_generator/generate_ast.py | 24 ++++++++-------- src/code_generator/utils.py | 46 ++++++++++++++++++------------ 2 files changed, 39 insertions(+), 31 deletions(-) diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 2124b15d5..05a73be8e 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -1,7 +1,7 @@ from parsing.ast import * from .ast_CIL import * from .utils import * -from cmp.semantic import IntType, StringType, BoolType, ObjectType +from cmp.semantic import IOType, IntType, StringType, BoolType, ObjectType import cmp.visitor as visitor @@ -183,13 +183,16 @@ def visit(self, node): self.scope.instructions.append(instruction) elif isinstance(node.computed_type, IntType): self.scope.instructions.append(CILArgNode(CILNumberNode(0))) - self.scope.instructions.append(CILVCallNode('Int', 'init')) + var = CILVariableNode(name) + self.scope.instructions.append(CILAssignNode(var, CILVCallNode('Int', 'init'))) elif isinstance(node.computed_type, BoolType): self.scope.instructions.append(CILArgNode(CILNumberNode(0))) - self.scope.instructions.append(CILVCallNode('Bool', 'init')) + var = CILVariableNode(name) + self.scope.instructions.append(CILAssignNode(var, CILVCallNode('Bool', 'init'))) elif isinstance(node.computed_type, StringType): self.scope.instructions.append(CILArgNode(CILNumberNode(0))) - self.scope.instructions.append(CILVCallNode('String', 'init')) + var = CILVariableNode(name) + self.scope.instructions.append(CILAssignNode(var, CILVCallNode('String', 'init'))) @visitor.when(LoopNode) def visit(self, node): @@ -269,7 +272,7 @@ def visit(self, node): local = self.scope.find_local(node.id.lex) if local is not None: - self.scope.instructions.append(CILAssignNode(CILVariableNode(local.id), var)) + self.scope.instructions.append(CILAssignNode(CILVariableNode(local.id), variable)) return CILVariableNode(local.id) else: self.scope.instructions.append(CILSetAttributeNode(CILVariableNode(f'self_{self.scope.current_class}'), self.scope.current_class, CILVariableNode(node.id.lex), variable)) @@ -281,20 +284,17 @@ def visit(self, node): expr_right = self.visit(node.right) if not isinstance(expr_left, CILAtomicNode): name = self.scope.add_new_local(node.left.computed_type.name) - expr = self.visit(node.left) - self.scope.instructions.append(CILAssignNode(CILVariableNode(name), expr)) + self.scope.instructions.append(CILAssignNode(CILVariableNode(name), expr_left)) left = CILVariableNode(name) - else: left = expr_left if not isinstance(expr_right, CILAtomicNode): name = self.scope.add_new_local(node.right.computed_type.name) - expr = self.visit(node.right) - self.scope.instructions.append(CILAssignNode(CILVariableNode(name), expr)) + self.scope.instructions.append(CILAssignNode(CILVariableNode(name), expr_right)) right = CILVariableNode(name) else: - right = self.visit(node.right) + right = expr_right if isinstance(node, PlusNode): return CILPlusNode(left, right) @@ -367,4 +367,4 @@ def visit(self, node): def visit(self, node): name = self.scope.add_new_local(node.lex) self.scope.instructions.append(CILAssignNode(CILVariableNode(name),CILAllocateNode(CILTypeConstantNode(node.lex)))) - return CILVariableNode(name) + return CILVariableNode(name) \ No newline at end of file diff --git a/src/code_generator/utils.py b/src/code_generator/utils.py index 6b0779570..424b58052 100644 --- a/src/code_generator/utils.py +++ b/src/code_generator/utils.py @@ -73,54 +73,62 @@ def create_builtin_types(self): CILMethodNode('copy', 'copy_Object'), ] types.append(CILTypeNode('Object', [], obj_methods)) + init_Object = CILFuncNode( + 'init_Object', + [CILParamNode('self', None)], + [], + [CILReturnNode(CILVariableNode('self'))]) + self.functions.append(init_Object) - int_methods = [ - CILMethodNode('init', 'init_Int'), - ] - int_methods.extend(obj_methods) + int_methods = obj_methods.copy() + int_methods.extend([CILMethodNode('init', 'init_Int')]) types.append(CILTypeNode('Int', [CILAttributeNode('value', None)], int_methods)) init_int = CILFuncNode( 'init_Int', [CILParamNode('self', None), CILParamNode('v', None)], [], - [CILSetAttributeNode(CILVariableNode('self'), 'Int', CILVariableNode('value'), CILVariableNode('v'))]) + [CILSetAttributeNode(CILVariableNode('self'), 'Int', CILVariableNode('value'), CILVariableNode('v')), CILReturnNode(CILVariableNode('self'))]) self.functions.append(init_int) - str_methods = [ + str_methods = obj_methods.copy() + str_methods.extend([ CILMethodNode('init', 'init_String'), CILMethodNode('length', 'length_String'), CILMethodNode('concat', 'concat_String'), CILMethodNode('substr', 'substr_String'), - ] - str_methods.extend(obj_methods) + ]) types.append(CILTypeNode('String', [CILAttributeNode('value', None)], str_methods)) init_string = CILFuncNode( 'init_String', [CILParamNode('self', None), CILParamNode('v', None)], [], - [CILSetAttributeNode(CILVariableNode('self'), 'String', CILVariableNode('value'), CILVariableNode('v'))]) + [CILSetAttributeNode(CILVariableNode('self'), 'String', CILVariableNode('value'), CILVariableNode('v')), CILReturnNode(CILVariableNode('self'))]) self.functions.append(init_string) - bool_methods = [ - CILMethodNode('init', 'init_Bool'), - ] - bool_methods.extend(obj_methods) + bool_methods = obj_methods.copy() + bool_methods.extend([CILMethodNode('init', 'init_Bool')]) types.append(CILTypeNode('Bool', [CILAttributeNode('value', None)], bool_methods)) - bool_string = CILFuncNode( + init_bool = CILFuncNode( 'init_Bool', [CILParamNode('self', None), CILParamNode('v', None)], [], - [CILSetAttributeNode(CILVariableNode('self'), 'Bool', CILVariableNode('value'), CILVariableNode('v'))]) - self.functions.append(bool_string) + [CILSetAttributeNode(CILVariableNode('self'), 'Bool', CILVariableNode('value'), CILVariableNode('v')), CILReturnNode(CILVariableNode('self'))]) + self.functions.append(init_bool) - io_methods = [ + io_methods = obj_methods.copy() + io_methods.extend([ CILMethodNode('out_string', 'out_string_IO'), CILMethodNode('out_int', 'out_int_IO'), CILMethodNode('in_string', 'in_string_IO'), CILMethodNode('in_int', 'in_int_IO'), - ] - io_methods.extend(obj_methods) + ]) types.append(CILTypeNode('IO', [], io_methods)) + init_IO = CILFuncNode( + 'init_IO', + [CILParamNode('self', None)], + [], + [CILReturnNode(CILVariableNode('self'))]) + self.functions.append(init_IO) return types From 2ad30966120dfd5edb6640d49b9b17df02981e2d Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Fri, 25 Feb 2022 16:35:35 -0500 Subject: [PATCH 34/81] Add length built in function --- src/code_generator/mips_built_in.txt | 29 ++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/code_generator/mips_built_in.txt b/src/code_generator/mips_built_in.txt index b7174ee83..a98635db2 100644 --- a/src/code_generator/mips_built_in.txt +++ b/src/code_generator/mips_built_in.txt @@ -181,6 +181,35 @@ strcopy_String_loop: addu $sp, $sp, 4 jr $ra +length_String: + sw $ra, 0($sp) + addu $sp, $sp, -4 + sw $fp, 0($sp) + addu $sp, $sp, -4 + move $fp, $sp + + lw $v0, 12($fp) # get the string instance address + lw $v1, 4($fp) # get the string value address + + sw $v1, 0($sp) + addu $sp, $sp, -4 + jal strlen_String # length at v0 + + move $sp, $fp + lw $fp, 0($sp) + addu $sp, $sp, 4 + lw $ra, 0($sp) + addu $sp, $sp, 4 + jr $ra + +concat_String: + sw $ra, 0($sp) + addu $sp, $sp, -4 + sw $fp, 0($sp) + addu $sp, $sp, -4 + move $fp, $sp + + lw $v0, 16($fp) # first str instance address From 32507c8a2b858062e78f239ef3f178cf8e26a5e4 Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Fri, 25 Feb 2022 16:35:50 -0500 Subject: [PATCH 35/81] Fix bugs related to Class method linking --- src/code_generator/spim_visitor.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/code_generator/spim_visitor.py b/src/code_generator/spim_visitor.py index 3ee31c56d..bfb972133 100644 --- a/src/code_generator/spim_visitor.py +++ b/src/code_generator/spim_visitor.py @@ -228,7 +228,11 @@ def visit(self, node: CILVCallNode, frame): # use the information of the static type to get the location of the method in memory t = self.scope.types[node.type] - method_addr = t.get_method_addr(node.func, register0) + try: + method_addr = t.get_method_addr(node.func, register0) + except: + print('shdglsdglsjdg0000000000000') + print(t.methods_offset) self.add_line(f'jal {method_addr}') # calls the method and by convention methods return in $v0 frame.clear_args() # clear arguments for the new function From c544f9aed69a8c82050f2acbcecde8c805ea6eb1 Mon Sep 17 00:00:00 2001 From: Amy Date: Fri, 25 Feb 2022 16:43:13 -0500 Subject: [PATCH 36/81] defined init method Object --- src/code_generator/utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/code_generator/utils.py b/src/code_generator/utils.py index 424b58052..493c906da 100644 --- a/src/code_generator/utils.py +++ b/src/code_generator/utils.py @@ -71,6 +71,7 @@ def create_builtin_types(self): CILMethodNode('abort', 'abort_Object'), CILMethodNode('type_name', 'type_name_Object'), CILMethodNode('copy', 'copy_Object'), + CILMethodNode('init', 'init_Object'), ] types.append(CILTypeNode('Object', [], obj_methods)) init_Object = CILFuncNode( From 81ac63a785107e8d3d139279bb015d2e48b49f93 Mon Sep 17 00:00:00 2001 From: Amy Date: Fri, 25 Feb 2022 16:44:34 -0500 Subject: [PATCH 37/81] defined init method IO --- src/code_generator/utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/code_generator/utils.py b/src/code_generator/utils.py index 493c906da..346a9acd0 100644 --- a/src/code_generator/utils.py +++ b/src/code_generator/utils.py @@ -122,6 +122,7 @@ def create_builtin_types(self): CILMethodNode('out_int', 'out_int_IO'), CILMethodNode('in_string', 'in_string_IO'), CILMethodNode('in_int', 'in_int_IO'), + CILMethodNode('init', 'init_IO'), ]) types.append(CILTypeNode('IO', [], io_methods)) init_IO = CILFuncNode( From 31a217aee2345d08ff5a579e438ed64b3076f6b9 Mon Sep 17 00:00:00 2001 From: Amy Date: Fri, 25 Feb 2022 17:25:34 -0500 Subject: [PATCH 38/81] Change the position of init method to first --- src/code_generator/generate_ast.py | 2 +- src/code_generator/utils.py | 38 ++++++++++++++++++++---------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 05a73be8e..c43237b22 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -56,9 +56,9 @@ def visit(self, node): type_info = self.scope.infos[node.id] for a in type_info.attrs: attributes.append(CILAttributeNode(a.name, a.type)) + methods.append(CILMethodNode('init', f'init_{node.id}')) for m in type_info.methods.keys(): methods.append(CILMethodNode(m, type_info.methods[m])) - methods.append(CILMethodNode('init', f'init_{node.id}')) for feature in node.features: if isinstance(feature, AttrDeclarationNode): diff --git a/src/code_generator/utils.py b/src/code_generator/utils.py index 346a9acd0..81427dad6 100644 --- a/src/code_generator/utils.py +++ b/src/code_generator/utils.py @@ -68,10 +68,10 @@ def create_builtin_types(self): types = [] obj_methods = [ + CILMethodNode('init', 'init_Object'), CILMethodNode('abort', 'abort_Object'), CILMethodNode('type_name', 'type_name_Object'), CILMethodNode('copy', 'copy_Object'), - CILMethodNode('init', 'init_Object'), ] types.append(CILTypeNode('Object', [], obj_methods)) init_Object = CILFuncNode( @@ -81,8 +81,12 @@ def create_builtin_types(self): [CILReturnNode(CILVariableNode('self'))]) self.functions.append(init_Object) - int_methods = obj_methods.copy() - int_methods.extend([CILMethodNode('init', 'init_Int')]) + int_methods = [ + CILMethodNode('init', 'init_Int'), + CILMethodNode('abort', 'abort_Object'), + CILMethodNode('type_name', 'type_name_Object'), + CILMethodNode('copy', 'copy_Object'), + ] types.append(CILTypeNode('Int', [CILAttributeNode('value', None)], int_methods)) init_int = CILFuncNode( 'init_Int', @@ -91,13 +95,15 @@ def create_builtin_types(self): [CILSetAttributeNode(CILVariableNode('self'), 'Int', CILVariableNode('value'), CILVariableNode('v')), CILReturnNode(CILVariableNode('self'))]) self.functions.append(init_int) - str_methods = obj_methods.copy() - str_methods.extend([ + str_methods = [ CILMethodNode('init', 'init_String'), + CILMethodNode('abort', 'abort_Object'), + CILMethodNode('type_name', 'type_name_Object'), + CILMethodNode('copy', 'copy_Object'), CILMethodNode('length', 'length_String'), CILMethodNode('concat', 'concat_String'), CILMethodNode('substr', 'substr_String'), - ]) + ] types.append(CILTypeNode('String', [CILAttributeNode('value', None)], str_methods)) init_string = CILFuncNode( 'init_String', @@ -106,8 +112,12 @@ def create_builtin_types(self): [CILSetAttributeNode(CILVariableNode('self'), 'String', CILVariableNode('value'), CILVariableNode('v')), CILReturnNode(CILVariableNode('self'))]) self.functions.append(init_string) - bool_methods = obj_methods.copy() - bool_methods.extend([CILMethodNode('init', 'init_Bool')]) + bool_methods = [ + CILMethodNode('init', 'init_Bool'), + CILMethodNode('abort', 'abort_Object'), + CILMethodNode('type_name', 'type_name_Object'), + CILMethodNode('copy', 'copy_Object'), + ] types.append(CILTypeNode('Bool', [CILAttributeNode('value', None)], bool_methods)) init_bool = CILFuncNode( 'init_Bool', @@ -116,14 +126,16 @@ def create_builtin_types(self): [CILSetAttributeNode(CILVariableNode('self'), 'Bool', CILVariableNode('value'), CILVariableNode('v')), CILReturnNode(CILVariableNode('self'))]) self.functions.append(init_bool) - io_methods = obj_methods.copy() - io_methods.extend([ + io_methods = [ + CILMethodNode('init', 'init_IO'), + CILMethodNode('abort', 'abort_Object'), + CILMethodNode('type_name', 'type_name_Object'), + CILMethodNode('copy', 'copy_Object'), CILMethodNode('out_string', 'out_string_IO'), CILMethodNode('out_int', 'out_int_IO'), CILMethodNode('in_string', 'in_string_IO'), CILMethodNode('in_int', 'in_int_IO'), - CILMethodNode('init', 'init_IO'), - ]) + ] types.append(CILTypeNode('IO', [], io_methods)) init_IO = CILFuncNode( 'init_IO', @@ -138,7 +150,7 @@ def create_init_class(self, attributes, expresions): type = self.context.get_type(self.current_class) instructions = [] - if not isinstance(type.parent,ObjectType): + if not isinstance(type.parent, ObjectType): instructions.append(CILArgNode(CILVariableNode(f'self'))) call = CILVCallNode(type.parent.name, f'init') instructions.append(CILAssignNode(CILVariableNode('self'), call)) From 1b2aec0b4321ab417eb39448e654f705219d10cd Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Fri, 25 Feb 2022 20:57:54 -0500 Subject: [PATCH 39/81] Fix bad registers in code generation --- Makefile | 4 + src/code_generator/mips_built_in.txt | 431 +++++++++++++++------------ src/code_generator/spim_scope.py | 11 +- src/code_generator/spim_visitor.py | 64 ++-- src/cool.py | 13 +- src/result.s | 0 6 files changed, 308 insertions(+), 215 deletions(-) create mode 100644 src/result.s diff --git a/Makefile b/Makefile index 91c1211ca..746ec098a 100644 --- a/Makefile +++ b/Makefile @@ -3,5 +3,9 @@ pytest: compile: docker-compose run compiler python3 cool.py program.cl +exec: + docker-compose run compiler bash -c "python3 cool.py program.cl && spim output.out result.s && cat result.s" +spim: + docker-compose run compiler spim diff --git a/src/code_generator/mips_built_in.txt b/src/code_generator/mips_built_in.txt index a98635db2..e6ec5881e 100644 --- a/src/code_generator/mips_built_in.txt +++ b/src/code_generator/mips_built_in.txt @@ -1,221 +1,274 @@ abort_Object: - sw $ra, 0($sp) - addu $sp, $sp, -4 - sw $fp, 0($sp) - addu $sp, $sp, -4 - move $fp, $sp - - li $v0, 55 - move $a0, ObjectErrorMessage - li $a1, 0 - syscall - - li $v0, 17 - li $a0, 1 - syscall - - move $sp, $fp - lw $fp, 0($sp) - addu $sp, $sp, 4 - lw $ra, 0($sp) - addu $sp, $sp, 4 - jr $ra + sw $ra, 0($sp) + addu $sp, $sp, -4 + sw $fp, 0($sp) + addu $sp, $sp, -4 + move $fp, $sp + + li $v0, 55 + la $a0, ObjectErrorMessage + li $a1, 0 + syscall + + li $v0, 17 + li $a0, 1 + syscall + + move $sp, $fp + lw $fp, 0($sp) + addu $sp, $sp, 4 + lw $ra, 0($sp) + addu $sp, $sp, 4 + jr $ra typename_Object: - sw $ra, 0($sp) - addu $sp, $sp, -4 - sw $fp, 0($sp) - addu $sp, $sp, -4 - move $fp, $sp - - lw $v7, 12($fp}) - lw $v6, 0($v7) - - lw $a0, 4($v6) - li $v0, 4 - syscall - - move $sp, $fp - lw $fp, 0($sp) - addu $sp, $sp, 4 - lw $ra, 0($sp) - addu $sp, $sp, 4 - jr $ra + sw $ra, 0($sp) + addu $sp, $sp, -4 + sw $fp, 0($sp) + addu $sp, $sp, -4 + move $fp, $sp + + lw $t7, 12($fp) + lw $t6, 0($t7) + + lw $a0, 4($t6) + li $v0, 4 + syscall + + move $sp, $fp + lw $fp, 0($sp) + addu $sp, $sp, 4 + jr $ra copy_Object: - sw $ra, 0($sp) - addu $sp, $sp, -4 - sw $fp, 0($sp) - addu $sp, $sp, -4 - move $fp, $sp + sw $ra, 0($sp) + addu $sp, $sp, -4 + sw $fp, 0($sp) + addu $sp, $sp, -4 + move $fp, $sp - lw $v7, 12($fp) - lw $v6, 0($v7) - lw $v5, 0($v6) + lw $t7, 12($fp) # load the object address + lw $t6, 0($t7) # get the type info address + lw $t5, 0($t6) # get the size of the type - move $a0, $v7 - li $v0, 9 - syscall - move $v6, $v0 + move $a0, $t5 + li $v0, 9 + syscall + move $t6, $v0 copy_Object_loop: - lw $v4, 0($v7) - sw $v4, 0($v6) - addu $v7, $v7, 4 - addu $v6, $v6, 4 - addu $v5, $v5, -4 - bgtz $v5, copy_Object_loop - - move $sp, $fp - lw $fp, 0($sp) - addu $sp, $sp, 4 - lw $ra, 0($sp) - addu $sp, $sp, 4 - jr $ra + lw $t4, 0($t7) + sw $t4, 0($t6) + addu $t7, $t7, 4 + addu $t6, $t6, 4 + addu $t5, $t5, -4 + bgtz $t5, copy_Object_loop + + move $sp, $fp + lw $fp, 0($sp) + addu $sp, $sp, 4 + lw $ra, 0($sp) + addu $sp, $sp, 4 + jr $ra out_int_IO: - sw $ra, 0($sp) - addu $sp, $sp, -4 - sw $fp, 0($sp) - addu $sp, $sp, -4 - move $fp, $sp - - - lw $v1, 12($fp) - lw $a0, 4($v1) - li $v0, 1 - syscall - - move $sp, $fp - lw $fp, 0($sp) - addu $sp, $sp, 4 - lw $ra, 0($sp) - addu $sp, $sp, 4 - jr $ra + sw $ra, 0($sp) + addu $sp, $sp, -4 + sw $fp, 0($sp) + addu $sp, $sp, -4 + move $fp, $sp + + + lw $v1, 12($fp) + lw $a0, 4($v1) + li $v0, 1 + syscall + + move $sp, $fp + lw $fp, 0($sp) + addu $sp, $sp, 4 + lw $ra, 0($sp) + addu $sp, $sp, 4 + jr $ra out_string_IO: - sw $ra, 0($sp) - addu $sp, $sp, -4 - sw $fp, 0($sp) - addu $sp, $sp, -4 - move $fp, $sp - - - lw $a1, 12($fp) # reference to string object - lw $a0, 4($a1) # get the address of the value of the string - move $v0, 4 - syscall - - move $sp, $fp - lw $fp, 0($sp) - addu $sp, $sp, 4 - lw $ra, 0($sp) - addu $sp, $sp, 4 - jr $ra + sw $ra, 0($sp) + addu $sp, $sp, -4 + sw $fp, 0($sp) + addu $sp, $sp, -4 + move $fp, $sp + + + lw $a1, 12($fp) # reference to string object + lw $a0, 4($a1) # get the address of the value of the string + li $v0, 4 + syscall + + move $sp, $fp + lw $fp, 0($sp) + addu $sp, $sp, 4 + lw $ra, 0($sp) + addu $sp, $sp, 4 + jr $ra strlen_String: - sw $ra, 0($sp) - addu $sp, $sp, -4 - sw $fp, 0($sp) - addu $sp, $sp, -4 - move $fp, $sp + sw $ra, 0($sp) + addu $sp, $sp, -4 + sw $fp, 0($sp) + addu $sp, $sp, -4 + move $fp, $sp - lw $a0, 12$fp - li $t0, 0 + lw $a0, 12($fp) + li $t0, 0 srtlen_String_loop: - lb $t1, 0($a0) - beqz $t1, strlen_String_exit - addu $a0, $a0, 1 - addu $t0, $t0, 1 - j strlen_String_loop: - strlen_String_exit: - move $v0, $t0 - - move $sp, $fp - lw $fp, 0($sp) - addu $sp, $sp, 4 - lw $ra, 0($sp) - addu $sp, $sp, 4 - jr $ra + lb $t1, 0($a0) + beqz $t1, strlen_String_exit + addu $a0, $a0, 1 + addu $t0, $t0, 1 + j strlen_String_loop + strlen_String_exit: + move $v0, $t0 + + move $sp, $fp + lw $fp, 0($sp) + addu $sp, $sp, 4 + lw $ra, 0($sp) + addu $sp, $sp, 4 + jr $ra strcopy_String: - sw $ra, 0($sp) - addu $sp, $sp, -4 - sw $fp, 0($sp) - addu $sp, $sp, -4 - move $fp, $sp + sw $ra, 0($sp) + addu $sp, $sp, -4 + sw $fp, 0($sp) + addu $sp, $sp, -4 + move $fp, $sp - lw $a0, 12$fp + lw $a0, 12($fp) - sw $a0, 0($sp) # pass the string address as a parameter - addu $sp, $sp, -4 - jal strlen_String # len of the string at v0 + sw $a0, 0($sp) # pass the string address as a parameter + addu $sp, $sp, -4 + jal strlen_String # len of the string at v0 - # push v0 to stack and save the len - sw $v0, 0($sp) - addu $sp, $sp, -4 + # push v0 to stack and save the len + sw $v0, 0($sp) + addu $sp, $sp, -4 - move $a0, $v0 # pass as argument the size to alloc - li $v0, 9 - syscall # v0 location of the dst string + move $a0, $v0 # pass as argument the size to alloc + li $v0, 9 + syscall # v0 location of the dst string - lw $v1, 12$fp # load the source string address - move $v2, $v0 # copy the dst string address + lw $v1, 12($fp) # load the source string address + move $t2, $v0 # copy the dst string address - lw $v3, 0($sp) # pop the len of the string - addu $sp, $sp, 4 strcopy_String_loop: - lb $t0, 0($v1) # load the next char - sb $t0, 0($v2) # copy the char - addu $v1, $v1, 1 - addu $v2, $v2, 1 - addu $v3, $v3, -1 # decrease the size - bgtz $v3, strcopy_String_loop - - move $sp, $fp - lw $fp, 0($sp) - addu $sp, $sp, 4 - lw $ra, 0($sp) - addu $sp, $sp, 4 - jr $ra + lb $t0, 0($v1) # load the next char + sb $t0, 0($t2) # copy the char + addu $v1, $v1, 1 + addu $t2, $t2, 1 + bgtz $t0, strcopy_String_loop + + move $sp, $fp + lw $fp, 0($sp) + addu $sp, $sp, 4 + lw $ra, 0($sp) + addu $sp, $sp, 4 + jr $ra length_String: - sw $ra, 0($sp) - addu $sp, $sp, -4 - sw $fp, 0($sp) - addu $sp, $sp, -4 - move $fp, $sp - - lw $v0, 12($fp) # get the string instance address - lw $v1, 4($fp) # get the string value address - - sw $v1, 0($sp) - addu $sp, $sp, -4 - jal strlen_String # length at v0 - - move $sp, $fp - lw $fp, 0($sp) - addu $sp, $sp, 4 - lw $ra, 0($sp) - addu $sp, $sp, 4 - jr $ra + sw $ra, 0($sp) + addu $sp, $sp, -4 + sw $fp, 0($sp) + addu $sp, $sp, -4 + move $fp, $sp + + lw $v0, 12($fp) # get the string instance address + lw $v1, 4($fp) # get the string value address + + sw $v1, 0($sp) + addu $sp, $sp, -4 + jal strlen_String # length at v0 + + move $sp, $fp + lw $fp, 0($sp) + addu $sp, $sp, 4 + lw $ra, 0($sp) + addu $sp, $sp, 4 + + jr $ra concat_String: - sw $ra, 0($sp) - addu $sp, $sp, -4 - sw $fp, 0($sp) - addu $sp, $sp, -4 - move $fp, $sp - - lw $v0, 16($fp) # first str instance address - - - - - - - - - + sw $ra, 0($sp) + addu $sp, $sp, -4 + sw $fp, 0($sp) + addu $sp, $sp, -4 + move $fp, $sp + + lw $v0, 16($fp) # first str instance address + sw $v0, 0($sp) # pass the instance + addu $sp, $sp, -4 + jal length_String + + sw $v0, 0($sp) # save the length of the first string + addu $sp, $sp, -4 + + lw $v0, 12($fp) # second str instance address + sw $v0, 0($sp) # pass the instance + addu $sp, $sp, -4 + jal length_String # second str lenght in $v0 + + lw $v1, 0($sp) # load the length of the first string + addu $sp, $sp, 4 + + addu $a0, $v1, $v0 + addu $a0, $a0, 1 + li $v0, 9 + syscall # allocate memory for the new string + + # the new string is at $v0 + lw $v1, 16($fp) + move $t2, $v0 + +concat_String_loop1: # copy the first string + lb $t0, 0($v1) # load the next char + beq $t0, $zero, concat_String_eloop1 + sb $t0, 0($t2) # copy the char + addu $v1, $v1, 1 + addu $t2, $t2, 1 + j concat_String_loop1 + +concat_String_eloop1: + lw $v1, 12($fp) + +concat_String_loop2: # copy the second string + lb $t0, 0($v1) # load the next char + sb $t0, 0($t2) # copy the char + addu $v1, $v1, 1 + addu $t2, $t2, 1 + bgtz $t0, concat_String_loop2 + + sw $v0, 0($sp) # save the address of the result string + addu $sp, $sp, -4 + + # allocate space for an String intance + li $v0, 9 + li $a0, 8 + syscall # v0 is the address for the instance + + la $v1, String + sw $v1, 0($v0) # copy type info + + lw $v1, 0($sp) # load the address of the result string + addu $sp, $sp, 4 + + sw $v1, 4($v0) # copy value + + move $sp, $fp + lw $fp, 0($sp) + addu $sp, $sp, 4 + lw $ra, 0($sp) + addu $sp, $sp, 4 + jr $ra + +substr_String: diff --git a/src/code_generator/spim_scope.py b/src/code_generator/spim_scope.py index 9a3cb445f..640da01b7 100644 --- a/src/code_generator/spim_scope.py +++ b/src/code_generator/spim_scope.py @@ -10,6 +10,9 @@ def __init__(self): def __str__(self): r = '' + for t, ti in self.types.items(): + r += f'{t}\n' + r += f'{ti}\n\n' for f, cf in self.functions.items(): r += f'{f}\n' r += f'{cf}\n\n' @@ -38,7 +41,13 @@ def get_attr_addr(self, attr, register): def get_method_addr(self, method, register): offset = self.methods_offset[method] return f'{(offset + 1) * WSIZE}({register})' - + + def __str__(self): + r = '--------------------Type----------------\n' + r += f'Attrs : {self.attrs_offset}\n' + r += f'Methods : {self.methods_offset}\n' + r += '-------------------------------------------' + return r class ProcCallFrame: def __init__(self, nargs, nvars): diff --git a/src/code_generator/spim_visitor.py b/src/code_generator/spim_visitor.py index bfb972133..c7abb38de 100644 --- a/src/code_generator/spim_visitor.py +++ b/src/code_generator/spim_visitor.py @@ -9,6 +9,7 @@ def __init__(self, scope): self.scope = scope self.code = "" self.tabs = '' + self.main = True # =================== Utils ======================== def add_line(self,line): @@ -25,7 +26,7 @@ def gen_push(self,src): def gen_pop(self,dst): self.add_line(f'# pop the top of the stack to {dst}') - self.add_line(f'sw 0($sp), {dst}') + self.add_line(f'lw {dst}, 0($sp)') self.add_line(f'addu $sp $sp {WSIZE}') self.add_line('') @@ -37,6 +38,11 @@ def visit(self, node, frame): def visit(self, node: CILProgramNode, frame): for t in node.types: self.visit(t, frame) + + self.set_tabs(1) + self.add_line(".data") + self.set_tabs(0) + self.add_line("ObjectErrorMessage : .asciiz \"Program was halted\n\"") for d in node.data: self.visit(d, frame) @@ -44,16 +50,20 @@ def visit(self, node: CILProgramNode, frame): for f in node.functions: self.visit(f, frame) + with open('./code_generator/mips_built_in.txt') as file: + self.code += file.read() + @visitor.when(CILTypeNode) def visit(self, node: CILTypeNode, frame): # place the type name as a string in static data self.set_tabs(1) self.add_line(".data") self.set_tabs(0) - type_info = self.scope.types[node.id] + t = self.scope.types[node.id] methods_str = ' '.join(m.function_id for m in node.methods) + assert len(node.methods) == len(t.methods_offset) self.add_line(f"_{node.id}: .asciiz \"{node.id}\"") - self.add_line(f"{node.id}: .word {type_info.size} _{node.id} {methods_str}") + self.add_line(f"{node.id}: .word {t.size} _{node.id} {methods_str}") self.add_line('') @visitor.when(CILDataNode) @@ -61,15 +71,20 @@ def visit(self, node: CILDataNode, frame): self.set_tabs(1) self.add_line(".data") self.set_tabs(0) - self.add_line(f"_{node.id}: .asciiz \"{node.text}\"") + self.add_line(f"{node.id}: .asciiz {node.text}") self.add_line('') @visitor.when(CILFuncNode) def visit(self, node: CILFuncNode, frame): frame = self.scope.functions[node.id] - + self.set_tabs(1) + self.add_line('.text') self.set_tabs(0) - self.add_line(f'{node.id}:') # Place the label + if self.main: + self.add_line(f'main:') + else: + self.add_line(f'{node.id}:') # Place the label + self.set_tabs(1) self.add_line('# save the return address and frame pointer') @@ -91,6 +106,13 @@ def visit(self, node: CILFuncNode, frame): self.gen_pop('$fp') self.gen_pop('$ra') + if self.main: + self.add_line('li $v0, 10') + self.add_line('syscall') + self.main = False + else: + self.add_line('jr $ra') + @visitor.when(CILAttributeNode) def visit(self, node: CILAttributeNode, frame): pass @@ -127,7 +149,7 @@ def visit(self, node: CILSetAttributeNode, frame): inst_addr = frame.get_addr(node.id.lex) t = self.scope.types[node.type] # Change this for dynamic type? Not needed because the attributes are always declared in the same order in inhereted classes register1 = '$v1' - register2 = '$v2' + register2 = '$s2' attr_addr = t.get_attr_addr(node.attr.lex, register1) # value_addr = self.visit(node.var, frame) self.add_line(f'move {register2}, {value_addr}') @@ -139,7 +161,8 @@ def visit(self, node: CILSetAttributeNode, frame): def visit(self, node: CILArgNode, frame): frame.push_arg(node.var) # keep track of the args to be pass to the funcion to get the instance to bind the dynamic type value_addr = frame.get_addr(node.var.lex) - self.gen_push(value_addr) + self.add_line(f'lw $v0, {value_addr}') + self.gen_push('$v0') @visitor.when(CILIfGotoNode) def visit(self, node: CILIfGotoNode, frame): @@ -224,7 +247,7 @@ def visit(self, node: CILVCallNode, frame): register0 = '$v0' # register0 has the dynamic type address of the instance # since every instance stores its type in the first word of the allocated memory - self.add_line('lw {register0}, {instance_addr}') + self.add_line(f'lw {register0}, 0({instance_addr})') # use the information of the static type to get the location of the method in memory t = self.scope.types[node.type] @@ -233,8 +256,9 @@ def visit(self, node: CILVCallNode, frame): except: print('shdglsdglsjdg0000000000000') print(t.methods_offset) - - self.add_line(f'jal {method_addr}') # calls the method and by convention methods return in $v0 + + self.add_line(f'lw $v1, {method_addr}') + self.add_line(f'jal $v1') # calls the method and by convention methods return in $v0 frame.clear_args() # clear arguments for the new function return '$v0' @@ -322,10 +346,10 @@ def visit(self, node: CILLessNode, frame): @visitor.when(CILElessNode) def visit(self, node: CILElessNode, frame): register0 = '$v0' - register1 = '$v1' - register2 = '$v2' - register3 = '$v3' - register4 = '$v4' + register1 = '$s1' + register2 = '$s2' + register3 = '$s3' + register4 = '$s4' self.visit(node.left, frame) self.add_line(f'move {register1}, {register0}') self.add_line(f'move {register3}, {register0}') @@ -339,11 +363,11 @@ def visit(self, node: CILElessNode, frame): @visitor.when(CILEqualsNode) def visit(self, node: CILEqualsNode, frame): - register0 = '$v0' - register1 = '$v1' - register2 = '$v2' - register3 = '$v3' - register4 = '$v4' + register0 = '$s0' + register1 = '$s1' + register2 = '$s2' + register3 = '$s3' + register4 = '$s4' self.visit(node.left, frame) self.add_line(f'move {register1}, {register0}') self.add_line(f'move {register3}, {register0}') diff --git a/src/cool.py b/src/cool.py index be0551c4b..65715e1ed 100644 --- a/src/cool.py +++ b/src/cool.py @@ -51,12 +51,15 @@ cil_codegen = CILCodegen() code = cil_codegen.visit(cil) mips_scope_builder = MIPSScopeBuilder() -print(cil) -print('---------------- CIL Code------------------') -print(code) -print('-----------------MIPS----------------------') +#print(cil) +#print('---------------- CIL Code------------------') +#print(code) +#print('-----------------MIPS----------------------') scope = mips_scope_builder.visit(cil) +#print(scope) mips_codegen = MIPSCodegen(scope) mips_codegen.visit(cil, None) -print(mips_codegen.code) +#print(mips_codegen.code) +with open(f'output.out', 'w') as f: + f.write(mips_codegen.code) exit(0) diff --git a/src/result.s b/src/result.s new file mode 100644 index 000000000..e69de29bb From e6cf5c9047380f3b6dcb10c111947ddad95c1ecf Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Sat, 26 Feb 2022 18:49:33 -0500 Subject: [PATCH 40/81] Fixes in memory management in code generation -fixes the stack operations, argument and parameters address location -fixes init methods to initialize the attributes -fixes built in functions as out_string, type_name and substr --- src/code_generator/cil_codegen.py | 4 + src/code_generator/generate_ast.py | 44 ++-- src/code_generator/mips_built_in.txt | 289 +++++++-------------------- src/code_generator/saved.txt | 259 ++++++++++++++++++++++++ src/code_generator/spim_scope.py | 6 +- src/code_generator/spim_visitor.py | 55 +++-- src/code_generator/utils.py | 20 +- 7 files changed, 420 insertions(+), 257 deletions(-) create mode 100644 src/code_generator/saved.txt diff --git a/src/code_generator/cil_codegen.py b/src/code_generator/cil_codegen.py index e0e6d0a49..381b83a3e 100644 --- a/src/code_generator/cil_codegen.py +++ b/src/code_generator/cil_codegen.py @@ -131,6 +131,10 @@ def visit(self, node: CILAllocateNode): def visit(self, node: CILTypeOfNode): return f'TYPEOF {node.var.lex}' + @visitor.when(CILCallNode) + def visit(self, node: CILCallNode): + return f'CALL {node.func}' + @visitor.when(CILVCallNode) def visit(self, node: CILVCallNode): return f'VCALL {node.type} {node.func}' diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index c43237b22..8399bc652 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -7,7 +7,7 @@ class CIL: def __init__(self, context): - self.scope = CILScope(context) + self.scope = CILScope(context) @visitor.on('node') def visit(self, node, scope): @@ -15,6 +15,21 @@ def visit(self, node, scope): @visitor.when(ProgramNode) def visit(self, node): + # Creates the first function to execute + locals = [] + locals.append(CILLocalNode("m0", "Main")) + locals.append(CILLocalNode("m1", "Main")) + locals.append(CILLocalNode("m2", "Main")) + + instructions = [] + instructions.append(CILAssignNode(CILVariableNode("m0"), CILAllocateNode(CILTypeConstantNode("Main")))) + instructions.append(CILArgNode(CILVariableNode("m0"))) + instructions.append(CILAssignNode(CILVariableNode("m1"), CILVCallNode("Main", "init"))) + instructions.append(CILArgNode(CILVariableNode("m1"))) + instructions.append(CILAssignNode(CILVariableNode("m2"), CILVCallNode("Main", "main"))) + instructions.append(CILReturnNode(CILVariableNode("m2"))) + self.scope.functions.append(CILFuncNode('main', [], locals, instructions)) + types_ts = get_ts(self.scope.context) infos = self.scope.infos = {} for type in types_ts: @@ -35,13 +50,7 @@ def visit(self, node): types.append(type) # Add built-in types and functions - types.extend(self.scope.create_builtin_types()) - - # Brings main function to the first position - main_idx = [idx for idx, element in enumerate(self.scope.functions) if element.id == 'main_Main'][0] - main = self.scope.functions[main_idx] - self.scope.functions.pop(main_idx) - self.scope.functions.insert(0, main) + types.extend(self.scope.create_builtin_types()) return CILProgramNode(types, self.scope.data, self.scope.functions) @@ -52,7 +61,7 @@ def visit(self, node): attributes = [] expressions = [] methods = [] - + locals = [] type_info = self.scope.infos[node.id] for a in type_info.attrs: attributes.append(CILAttributeNode(a.name, a.type)) @@ -64,14 +73,18 @@ def visit(self, node): if isinstance(feature, AttrDeclarationNode): if feature.expr is not None: expr = self.visit(feature.expr) - expressions.append((expr, feature.expr.computed_type)) + expressions.append((expr, feature.expr.computed_type, self.scope.instructions.copy())) + self.scope.instructions = [] att_aux.append(feature.id) - + locals.extend(self.scope.all_locals.copy()) + self.scope.locals = [{}] + self.scope.all_locals = [] + else: function = self.visit(feature) self.scope.functions.append(function) - init_class = self.scope.create_init_class(att_aux, expressions) + init_class = self.scope.create_init_class(att_aux, expressions, locals) self.scope.functions.append(init_class) return CILTypeNode(node.id, attributes, methods) @@ -135,8 +148,8 @@ def visit(self, node): args.append(CILArgNode(CILVariableNode(expr.lex))) self.scope.instructions.extend(args) - if node.type is not None: - expression = CILVCallNode(node.type, node.id) + if type is not None: + expression = CILVCallNode(type, node.id) else: expression = CILVCallNode(self.scope.current_class, node.id) type = self.scope.ret_type_of_method(node.id, type) @@ -367,4 +380,7 @@ def visit(self, node): def visit(self, node): name = self.scope.add_new_local(node.lex) self.scope.instructions.append(CILAssignNode(CILVariableNode(name),CILAllocateNode(CILTypeConstantNode(node.lex)))) + self.scope.instructions.append(CILArgNode(CILVariableNode(name))) + name = self.scope.add_new_local(node.lex) + self.scope.instructions.append(CILAssignNode(CILVariableNode(name), CILVCallNode(node.lex, f"init"))) return CILVariableNode(name) \ No newline at end of file diff --git a/src/code_generator/mips_built_in.txt b/src/code_generator/mips_built_in.txt index e6ec5881e..dc2aafdbd 100644 --- a/src/code_generator/mips_built_in.txt +++ b/src/code_generator/mips_built_in.txt @@ -1,274 +1,131 @@ -abort_Object: - sw $ra, 0($sp) - addu $sp, $sp, -4 - sw $fp, 0($sp) - addu $sp, $sp, -4 - move $fp, $sp - - li $v0, 55 - la $a0, ObjectErrorMessage - li $a1, 0 - syscall - - li $v0, 17 - li $a0, 1 - syscall - - move $sp, $fp - lw $fp, 0($sp) - addu $sp, $sp, 4 - lw $ra, 0($sp) - addu $sp, $sp, 4 - jr $ra - -typename_Object: +out_string_IO: + # calling conventions sw $ra, 0($sp) - addu $sp, $sp, -4 + addi $sp, $sp, -4 sw $fp, 0($sp) - addu $sp, $sp, -4 + addi $sp, $sp, -4 move $fp, $sp - lw $t7, 12($fp) - lw $t6, 0($t7) - lw $a0, 4($t6) + lw $a1, 12($fp) # reference to string object + lw $a0, 4($a1) # get the address of the value of the string li $v0, 4 syscall - move $sp, $fp + lw $v0, 16($fp) + + # calling conventions + addi $sp, $sp, 4 lw $fp, 0($sp) - addu $sp, $sp, 4 + addi $sp, $sp, 4 + lw $ra, 0($sp) + jr $ra -copy_Object: +type_name_Object: + # calling conventions sw $ra, 0($sp) - addu $sp, $sp, -4 + addi $sp, $sp, -4 sw $fp, 0($sp) - addu $sp, $sp, -4 + addi $sp, $sp, -4 move $fp, $sp - - lw $t7, 12($fp) # load the object address + lw $t7, 12($fp) # get the instance address lw $t6, 0($t7) # get the type info address - lw $t5, 0($t6) # get the size of the type + lw $t5, 4($t6) # get the type name - move $a0, $t5 + # create the String class instance to return + li $a0, 8 li $v0, 9 - syscall - move $t6, $v0 -copy_Object_loop: - lw $t4, 0($t7) - sw $t4, 0($t6) - addu $t7, $t7, 4 - addu $t6, $t6, 4 - addu $t5, $t5, -4 - bgtz $t5, copy_Object_loop - - move $sp, $fp - lw $fp, 0($sp) - addu $sp, $sp, 4 - lw $ra, 0($sp) - addu $sp, $sp, 4 - jr $ra - -out_int_IO: - sw $ra, 0($sp) - addu $sp, $sp, -4 - sw $fp, 0($sp) - addu $sp, $sp, -4 - move $fp, $sp - + syscall - lw $v1, 12($fp) - lw $a0, 4($v1) - li $v0, 1 - syscall + la $t1, String + sw $t1, 0($v0) + sw $t5, 4($v0) - move $sp, $fp + # calling conventions + addi $sp, $sp, 4 lw $fp, 0($sp) - addu $sp, $sp, 4 + addi $sp, $sp, 4 lw $ra, 0($sp) - addu $sp, $sp, 4 + jr $ra -out_string_IO: +substr_String: + # calling conventions sw $ra, 0($sp) - addu $sp, $sp, -4 + addi $sp, $sp, -4 sw $fp, 0($sp) - addu $sp, $sp, -4 + addi $sp, $sp, -4 move $fp, $sp + lw $t7, 20($fp) # get the String instance address + lw $t0, 4($t7) # get the value of the source String - lw $a1, 12($fp) # reference to string object - lw $a0, 4($a1) # get the address of the value of the string - li $v0, 4 - syscall - - move $sp, $fp - lw $fp, 0($sp) - addu $sp, $sp, 4 - lw $ra, 0($sp) - addu $sp, $sp, 4 - jr $ra - -strlen_String: - sw $ra, 0($sp) - addu $sp, $sp, -4 - sw $fp, 0($sp) - addu $sp, $sp, -4 - move $fp, $sp + lw $t7, 16($fp) # get the start parameter Int instance address + lw $t1, 4($t7) # get the value of the Int + lw $t7, 12($fp) # get the length perameter Int instance address + lw $t2, 4($t7) # get the value of the Int - lw $a0, 12($fp) - li $t0, 0 -srtlen_String_loop: - lb $t1, 0($a0) - beqz $t1, strlen_String_exit - addu $a0, $a0, 1 - addu $t0, $t0, 1 - j strlen_String_loop - strlen_String_exit: - move $v0, $t0 + move $a0, $t2 + li $v0, 9 + syscall # allocate memory for the substring value - move $sp, $fp - lw $fp, 0($sp) - addu $sp, $sp, 4 - lw $ra, 0($sp) - addu $sp, $sp, 4 - jr $ra -strcopy_String: - sw $ra, 0($sp) - addu $sp, $sp, -4 - sw $fp, 0($sp) - addu $sp, $sp, -4 - move $fp, $sp + li $t3, 0 # current pos in the string + substr_String_loop1: + beq $t3, $t1, substr_String_eloop1 # if the current pos == start pos break + # else move the current pos + addi $t0, $t0, 1 + addi $t3, $t3, 1 + j substr_String_loop1 - lw $a0, 12($fp) + substr_String_eloop1: - sw $a0, 0($sp) # pass the string address as a parameter - addu $sp, $sp, -4 - jal strlen_String # len of the string at v0 + li $t3, 0 + move $t4, $v0 # move the substring address to $t4 - # push v0 to stack and save the len - sw $v0, 0($sp) - addu $sp, $sp, -4 + substr_String_loop2: + beq $t3, $t2, substr_String_eloop2 + lb $t7, 0($t0) + sb $t7, 0($t4) + addi $t0, $t0, 1 + addi $t4, $t4, 1 + addi $t3, $t3, 1 + j substr_String_loop2 - move $a0, $v0 # pass as argument the size to alloc + substr_String_eloop2: + + move $t0, $v0 + la $t1, String + + li $a0, 8 li $v0, 9 - syscall # v0 location of the dst string + syscall - lw $v1, 12($fp) # load the source string address - move $t2, $v0 # copy the dst string address + sw $t1, 0($v0) + sw $t0, 4($v0) -strcopy_String_loop: - lb $t0, 0($v1) # load the next char - sb $t0, 0($t2) # copy the char - addu $v1, $v1, 1 - addu $t2, $t2, 1 - bgtz $t0, strcopy_String_loop - move $sp, $fp + # calling conventions + addi $sp, $sp, 4 lw $fp, 0($sp) - addu $sp, $sp, 4 + addi $sp, $sp, 4 lw $ra, 0($sp) - addu $sp, $sp, 4 + jr $ra -length_String: - sw $ra, 0($sp) - addu $sp, $sp, -4 - sw $fp, 0($sp) - addu $sp, $sp, -4 - move $fp, $sp - lw $v0, 12($fp) # get the string instance address - lw $v1, 4($fp) # get the string value address - sw $v1, 0($sp) - addu $sp, $sp, -4 - jal strlen_String # length at v0 - - move $sp, $fp - lw $fp, 0($sp) - addu $sp, $sp, 4 - lw $ra, 0($sp) - addu $sp, $sp, 4 - - jr $ra -concat_String: - sw $ra, 0($sp) - addu $sp, $sp, -4 - sw $fp, 0($sp) - addu $sp, $sp, -4 - move $fp, $sp - lw $v0, 16($fp) # first str instance address - sw $v0, 0($sp) # pass the instance - addu $sp, $sp, -4 - jal length_String - sw $v0, 0($sp) # save the length of the first string - addu $sp, $sp, -4 - lw $v0, 12($fp) # second str instance address - sw $v0, 0($sp) # pass the instance - addu $sp, $sp, -4 - jal length_String # second str lenght in $v0 - lw $v1, 0($sp) # load the length of the first string - addu $sp, $sp, 4 - addu $a0, $v1, $v0 - addu $a0, $a0, 1 - li $v0, 9 - syscall # allocate memory for the new string - - # the new string is at $v0 - lw $v1, 16($fp) - move $t2, $v0 - -concat_String_loop1: # copy the first string - lb $t0, 0($v1) # load the next char - beq $t0, $zero, concat_String_eloop1 - sb $t0, 0($t2) # copy the char - addu $v1, $v1, 1 - addu $t2, $t2, 1 - j concat_String_loop1 - -concat_String_eloop1: - lw $v1, 12($fp) - -concat_String_loop2: # copy the second string - lb $t0, 0($v1) # load the next char - sb $t0, 0($t2) # copy the char - addu $v1, $v1, 1 - addu $t2, $t2, 1 - bgtz $t0, concat_String_loop2 - - sw $v0, 0($sp) # save the address of the result string - addu $sp, $sp, -4 - - # allocate space for an String intance - li $v0, 9 - li $a0, 8 - syscall # v0 is the address for the instance - la $v1, String - sw $v1, 0($v0) # copy type info - - lw $v1, 0($sp) # load the address of the result string - addu $sp, $sp, 4 - sw $v1, 4($v0) # copy value - move $sp, $fp - lw $fp, 0($sp) - addu $sp, $sp, 4 - lw $ra, 0($sp) - addu $sp, $sp, 4 - jr $ra -substr_String: diff --git a/src/code_generator/saved.txt b/src/code_generator/saved.txt new file mode 100644 index 000000000..bc97fec9b --- /dev/null +++ b/src/code_generator/saved.txt @@ -0,0 +1,259 @@ +abort_Object: + addu $sp, $sp, -4 + sw $ra, 0($sp) + + addu $sp, $sp, -4 + sw $fp, 0($sp) + + move $fp, $sp + + li $v0, 55 + la $a0, ObjectErrorMessage + li $a1, 0 + syscall + + li $v0, 17 + li $a0, 1 + syscall + + + lw $fp, 0($sp) + addu $sp, $sp, 4 + lw $ra, 0($sp) + addu $sp, $sp, 4 + jr $ra + +typename_Object: + addu $sp, $sp, -4 + sw $ra, 0($sp) + addu $sp, $sp, -4 + sw $fp, 0($sp) + move $fp, $sp + + lw $t7, 12($fp) + lw $t6, 0($t7) + + lw $a0, 4($t6) + li $v0, 4 + syscall + + + lw $fp, 0($sp) + addu $sp, $sp, 4 + lw $ra, 0($sp) + addu $sp, $sp, 4 + jr $ra + +copy_Object: + addu $sp, $sp, -4 + sw $ra, 0($sp) + addu $sp, $sp, -4 + sw $fp, 0($sp) + move $fp, $sp + + + lw $t7, 12($fp) # load the object address + lw $t6, 0($t7) # get the type info address + lw $t5, 0($t6) # get the size of the type + + move $a0, $t5 + li $v0, 9 + syscall + move $t6, $v0 +copy_Object_loop: + lw $t4, 0($t7) + sw $t4, 0($t6) + addu $t7, $t7, 4 + addu $t6, $t6, 4 + addu $t5, $t5, -4 + bgtz $t5, copy_Object_loop + + + lw $fp, 0($sp) + addu $sp, $sp, 4 + lw $ra, 0($sp) + addu $sp, $sp, 4 + jr $ra + +out_int_IO: + addu $sp, $sp, -4 + sw $ra, 0($sp) + addu $sp, $sp, -4 + sw $fp, 0($sp) + move $fp, $sp + + + lw $v1, 12($fp) + lw $a0, 4($v1) + li $v0, 1 + syscall + + + lw $fp, 0($sp) + addu $sp, $sp, 4 + lw $ra, 0($sp) + addu $sp, $sp, 4 + jr $ra + + + +strlen_String: + sw $ra, 0($sp) + addu $sp, $sp, -4 + sw $fp, 0($sp) + addu $sp, $sp, -4 + move $fp, $sp + + + lw $a0, 12($fp) + li $t0, 0 +srtlen_String_loop: + lb $t1, 0($a0) + beqz $t1, strlen_String_exit + addu $a0, $a0, 1 + addu $t0, $t0, 1 + j strlen_String_loop + strlen_String_exit: + move $v0, $t0 + + + lw $fp, 0($sp) + addu $sp, $sp, 4 + lw $ra, 0($sp) + addu $sp, $sp, 4 + jr $ra + +strcopy_String: + sw $ra, 0($sp) + addu $sp, $sp, -4 + sw $fp, 0($sp) + addu $sp, $sp, -4 + move $fp, $sp + + + lw $a0, 12($fp) + + sw $a0, 0($sp) # pass the string address as a parameter + addu $sp, $sp, -4 + jal strlen_String # len of the string at v0 + + # push v0 to stack and save the len + sw $v0, 0($sp) + addu $sp, $sp, -4 + + move $a0, $v0 # pass as argument the size to alloc + li $v0, 9 + syscall # v0 location of the dst string + + lw $v1, 12($fp) # load the source string address + move $t2, $v0 # copy the dst string address + +strcopy_String_loop: + lb $t0, 0($v1) # load the next char + sb $t0, 0($t2) # copy the char + addu $v1, $v1, 1 + addu $t2, $t2, 1 + bgtz $t0, strcopy_String_loop + + + lw $fp, 0($sp) + addu $sp, $sp, 4 + lw $ra, 0($sp) + addu $sp, $sp, 4 + jr $ra + +length_String: + sw $ra, 0($sp) + addu $sp, $sp, -4 + sw $fp, 0($sp) + addu $sp, $sp, -4 + move $fp, $sp + + lw $v0, 12($fp) # get the string instance address + lw $v1, 4($fp) # get the string value address + + sw $v1, 0($sp) + addu $sp, $sp, -4 + jal strlen_String # length at v0 + + + lw $fp, 0($sp) + addu $sp, $sp, 4 + lw $ra, 0($sp) + addu $sp, $sp, 4 + + jr $ra + +concat_String: + sw $ra, 0($sp) + addu $sp, $sp, -4 + sw $fp, 0($sp) + addu $sp, $sp, -4 + move $fp, $sp + + lw $v0, 16($fp) # first str instance address + sw $v0, 0($sp) # pass the instance + addu $sp, $sp, -4 + jal length_String + + sw $v0, 0($sp) # save the length of the first string + addu $sp, $sp, -4 + + lw $v0, 12($fp) # second str instance address + sw $v0, 0($sp) # pass the instance + addu $sp, $sp, -4 + jal length_String # second str lenght in $v0 + + lw $v1, 0($sp) # load the length of the first string + addu $sp, $sp, 4 + + addu $a0, $v1, $v0 + addu $a0, $a0, 1 + li $v0, 9 + syscall # allocate memory for the new string + + # the new string is at $v0 + lw $v1, 16($fp) + move $t2, $v0 + +concat_String_loop1: # copy the first string + lb $t0, 0($v1) # load the next char + beq $t0, $zero, concat_String_eloop1 + sb $t0, 0($t2) # copy the char + addu $v1, $v1, 1 + addu $t2, $t2, 1 + j concat_String_loop1 + +concat_String_eloop1: + lw $v1, 12($fp) + +concat_String_loop2: # copy the second string + lb $t0, 0($v1) # load the next char + sb $t0, 0($t2) # copy the char + addu $v1, $v1, 1 + addu $t2, $t2, 1 + bgtz $t0, concat_String_loop2 + + sw $v0, 0($sp) # save the address of the result string + addu $sp, $sp, -4 + + # allocate space for an String intance + li $v0, 9 + li $a0, 8 + syscall # v0 is the address for the instance + + la $v1, String + sw $v1, 0($v0) # copy type info + + lw $v1, 0($sp) # load the address of the result string + addu $sp, $sp, 4 + + sw $v1, 4($v0) # copy value + + lw $fp, 0($sp) + addu $sp, $sp, 4 + lw $ra, 0($sp) + addu $sp, $sp, 4 + jr $ra + +substr_String: diff --git a/src/code_generator/spim_scope.py b/src/code_generator/spim_scope.py index 640da01b7..e54d6e4f2 100644 --- a/src/code_generator/spim_scope.py +++ b/src/code_generator/spim_scope.py @@ -40,7 +40,7 @@ def get_attr_addr(self, attr, register): def get_method_addr(self, method, register): offset = self.methods_offset[method] - return f'{(offset + 1) * WSIZE}({register})' + return f'{(offset + 2) * WSIZE}({register})' def __str__(self): r = '--------------------Type----------------\n' @@ -72,11 +72,11 @@ def add_variable(self, idx): def arg_addr(self, id): offset = self.args[id] - return f'{(3 + offset) * WSIZE}($fp)' + return f'{(2 + offset) * WSIZE}($fp)' def var_addr(self, id): offset = self.vars[id] - return f'{offset * WSIZE}($fp)' + return f'-{offset * WSIZE}($fp)' def get_addr(self, id): try: diff --git a/src/code_generator/spim_visitor.py b/src/code_generator/spim_visitor.py index c7abb38de..a27a417e8 100644 --- a/src/code_generator/spim_visitor.py +++ b/src/code_generator/spim_visitor.py @@ -21,13 +21,14 @@ def set_tabs(self,n): def gen_push(self,src): self.add_line(f'# push {src} to the stack') self.add_line(f'sw {src}, 0($sp)') - self.add_line(f'subu $sp $sp {WSIZE}') + self.add_line(f'addi $sp $sp -{WSIZE}') + self.add_line('') def gen_pop(self,dst): self.add_line(f'# pop the top of the stack to {dst}') + self.add_line(f'addi $sp $sp {WSIZE}') self.add_line(f'lw {dst}, 0($sp)') - self.add_line(f'addu $sp $sp {WSIZE}') self.add_line('') @visitor.on('node') @@ -42,13 +43,14 @@ def visit(self, node: CILProgramNode, frame): self.set_tabs(1) self.add_line(".data") self.set_tabs(0) - self.add_line("ObjectErrorMessage : .asciiz \"Program was halted\n\"") + self.add_line("ObjectErrorMessage : .asciiz \"Program was halted\"") for d in node.data: self.visit(d, frame) for f in node.functions: self.visit(f, frame) + self.add_line('') with open('./code_generator/mips_built_in.txt') as file: self.code += file.read() @@ -63,6 +65,8 @@ def visit(self, node: CILTypeNode, frame): methods_str = ' '.join(m.function_id for m in node.methods) assert len(node.methods) == len(t.methods_offset) self.add_line(f"_{node.id}: .asciiz \"{node.id}\"") + self.add_line("\t.data") + self.add_line("\t.align 4") self.add_line(f"{node.id}: .word {t.size} _{node.id} {methods_str}") self.add_line('') @@ -80,17 +84,13 @@ def visit(self, node: CILFuncNode, frame): self.set_tabs(1) self.add_line('.text') self.set_tabs(0) - if self.main: - self.add_line(f'main:') - else: - self.add_line(f'{node.id}:') # Place the label - - + self.add_line(f'{node.id}:') self.set_tabs(1) self.add_line('# save the return address and frame pointer') self.gen_push('$ra') # Save the return address self.gen_push('$fp') # Save the frame pointer + self.add_line('# update the frame pointer and allocate the frame in the stack') self.add_line(f'move $fp $sp') # Update the frame pointer to the top of the stack @@ -100,9 +100,9 @@ def visit(self, node: CILFuncNode, frame): for i in node.instructions: self.visit(i, frame) - + self.add_line(f'# restore the stack pointer, frame pointer y return address') - self.add_line(f'move $sp $fp') + self.add_line(f'addu $sp $sp {frame.size}') self.gen_pop('$fp') self.gen_pop('$ra') @@ -214,12 +214,13 @@ def visit(self, node: CILGetAttribute, frame): def visit(self, node: CILAllocateNode, frame): register0 = '$v0' register1 = '$a0' - t = self.scope.types[node.type] + t = self.scope.types[node.type.lex] self.add_line(f'li {register1}, {t.size}') self.add_line(f'li {register0}, 9') self.add_line(f'syscall') - self.add_line(f'sw {node.type}, {register0}') # Place the dynamic type of the instance in memory + self.add_line(f'la {register1}, {node.type.lex}') + self.add_line(f'sw {register1}, 0({register0})') # Place the dynamic type of the instance in memory return register0 @visitor.when(CILTypeOfNode) # Get the dynamic type of an instance @@ -236,11 +237,15 @@ def visit(self, node: CILTypeOfNode, frame): def visit(self, node: CILCallNode, frame): register0 = '$v0' self.add_line(f'jal {node.func}') + for a in frame.arg_queue: + self.gen_pop('$v1') + frame.clear_args() # clear arguments for the new function return register0 @visitor.when(CILVCallNode) def visit(self, node: CILVCallNode, frame): # the instance of type T is always the first argument to be passed to the function + self.add_line(f'# calling the method {node.func} of type {node.type}') instance = frame.arg_queue[0] instance_addr = self.visit(instance, frame) # load into a register the address of the instance in the heap @@ -254,11 +259,15 @@ def visit(self, node: CILVCallNode, frame): try: method_addr = t.get_method_addr(node.func, register0) except: + print(node.func) + print(t.id) print('shdglsdglsjdg0000000000000') print(t.methods_offset) self.add_line(f'lw $v1, {method_addr}') self.add_line(f'jal $v1') # calls the method and by convention methods return in $v0 + for a in frame.arg_queue: + self.gen_pop('$v1') frame.clear_args() # clear arguments for the new function return '$v0' @@ -267,15 +276,29 @@ def visit(self, node: CILVCallNode, frame): def visit(self, node: CILLoadNode, frame): self.add_line(f'#load the string {node.var}') register = '$v0' - self.add_line(f'lw {register}, {node.var}') + self.add_line(f'li $a0, 8') + self.add_line(f'li $v0, 9') + self.add_line(f'syscall') + self.add_line(f'la $v1, String') + self.add_line(f'sw $v1, 0($v0)') + self.add_line(f'la $v1, {node.var}') + self.add_line(f'sw $v1, 4($v0)') return register - @visitor.when(CILNumberNode) def visit(self, node: CILNumberNode, frame): register = '$v0' - self.add_line(f'li {register}, {node.lex}') + self.add_line(f'# Creating Int instance for atomic {node.lex}') + self.add_line(f'li $a0, 8') + self.add_line(f'li $v0, 9') + self.add_line(f'syscall') + + self.add_line(f'la $t0, Int') + self.add_line(f'li $t1, {node.lex}') + self.add_line(f'sw $t0, 0($v0)') + self.add_line(f'sw $t1, 4($v0)') + self.add_line(f'') return register @visitor.when(CILVariableNode) diff --git a/src/code_generator/utils.py b/src/code_generator/utils.py index 81427dad6..a350df07b 100644 --- a/src/code_generator/utils.py +++ b/src/code_generator/utils.py @@ -146,28 +146,32 @@ def create_builtin_types(self): return types - def create_init_class(self, attributes, expresions): + def create_init_class(self, attributes, expresions, locals): type = self.context.get_type(self.current_class) instructions = [] - + print(expresions) if not isinstance(type.parent, ObjectType): instructions.append(CILArgNode(CILVariableNode(f'self'))) - call = CILVCallNode(type.parent.name, f'init') + call = CILCallNode(f'init_{type.parent.name}') instructions.append(CILAssignNode(CILVariableNode('self'), call)) - for attr, (expr, type) in zip(attributes, expresions): + for attr, (expr, type, inst) in zip(attributes, expresions): + + instructions.extend(inst) if not isinstance(expr, CILAtomicNode): variable = CILVariableNode(self.add_new_local(type)) - self.instructions.append(CILAssignNode(variable, expr)) + # print + instructions.append(CILAssignNode(variable, expr)) else: - variable = CILVariableNode(expr.lex) + variable = expr instructions.append(CILSetAttributeNode(CILVariableNode('self'), self.current_class, CILVariableNode(attr), variable)) instructions.append(CILReturnNode(CILVariableNode('self'))) - return CILFuncNode(f'init_{self.current_class}', [CILParamNode('self', None)], [], instructions) - + return CILFuncNode(f'init_{self.current_class}', [CILParamNode('self', None)], locals, instructions) + + class TypeInfo: def __init__(self): From 4d1aea630ea83427e027f697aa96c5edd434f6af Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Sat, 26 Feb 2022 18:55:47 -0500 Subject: [PATCH 41/81] Modifiy Makefile to use spim --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 746ec098a..423c34480 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ pytest: compile: docker-compose run compiler python3 cool.py program.cl exec: - docker-compose run compiler bash -c "python3 cool.py program.cl && spim output.out result.s && cat result.s" + docker-compose run compiler bash -c "python3 cool.py program.cl && spim" spim: docker-compose run compiler spim From b18d0ff5c346a558e84ddd530f45585d38f459d9 Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Sat, 26 Feb 2022 18:56:24 -0500 Subject: [PATCH 42/81] Update cool.py to output the CIL code file --- src/cool.py | 9 ++- src/output.cil | 173 +++++++++++++++++++++++++++++++++++++++++++++++++ src/program.cl | 8 ++- 3 files changed, 184 insertions(+), 6 deletions(-) create mode 100644 src/output.cil diff --git a/src/cool.py b/src/cool.py index 65715e1ed..5744e3215 100644 --- a/src/cool.py +++ b/src/cool.py @@ -48,18 +48,21 @@ cil_generator = CIL(context) cil = cil_generator.visit(ast) +#print(cil) cil_codegen = CILCodegen() code = cil_codegen.visit(cil) mips_scope_builder = MIPSScopeBuilder() #print(cil) -#print('---------------- CIL Code------------------') -#print(code) -#print('-----------------MIPS----------------------') +print('---------------- CIL Code------------------') +print(code) +print('-----------------MIPS----------------------') scope = mips_scope_builder.visit(cil) #print(scope) mips_codegen = MIPSCodegen(scope) mips_codegen.visit(cil, None) #print(mips_codegen.code) +with open(f'output.cil', 'w') as f: + f.write(code) with open(f'output.out', 'w') as f: f.write(mips_codegen.code) exit(0) diff --git a/src/output.cil b/src/output.cil new file mode 100644 index 000000000..2894213cc --- /dev/null +++ b/src/output.cil @@ -0,0 +1,173 @@ +.TYPES + +type Main { + + method init : init_Main; + method abort : abort_Object; + method type_name : type_name_Object; + method copy : copy_Object; + method out_string : out_string_IO; + method out_int : out_int_IO; + method in_string : in_string_IO; + method in_int : in_int_IO; + method main : main_Main; +} + +type Object { + + method init : init_Object; + method abort : abort_Object; + method type_name : type_name_Object; + method copy : copy_Object; +} + +type Int { + attribute value; + + method init : init_Int; + method abort : abort_Object; + method type_name : type_name_Object; + method copy : copy_Object; +} + +type String { + attribute value; + + method init : init_String; + method abort : abort_Object; + method type_name : type_name_Object; + method copy : copy_Object; + method length : length_String; + method concat : concat_String; + method substr : substr_String; +} + +type Bool { + attribute value; + + method init : init_Bool; + method abort : abort_Object; + method type_name : type_name_Object; + method copy : copy_Object; +} + +type IO { + + method init : init_IO; + method abort : abort_Object; + method type_name : type_name_Object; + method copy : copy_Object; + method out_string : out_string_IO; + method out_int : out_int_IO; + method in_string : in_string_IO; + method in_int : in_int_IO; +} + + +.DATA + + +.CODE + +function main { + + LOCAL m0; + LOCAL m1; + LOCAL m2; + + m0 = ALLOCATE Main; + ARG m0; + m1 = VCALL Main init; + ARG m1; + m2 = VCALL Main main; + RETURN m2; + +} + + +function main_Main { + PARAM self_Main; + + LOCAL t_0; + LOCAL t_1; + LOCAL t_2; + LOCAL t_3; + LOCAL t_4; + LOCAL t_5; + + t_0 = self_Main; + t_1 = t_0 == 0; + ARG t_1; + t_2 = VCALL Bool type_name; + t_3 = t_2; + ARG self_Main; + ARG t_3; + t_4 = VCALL Main out_string; + t_5 = t_4; + RETURN t_5; + +} + + +function init_Main { + PARAM self; + + + ARG self; + self = CALL init_IO; + RETURN self; + +} + + +function init_Object { + PARAM self; + + + RETURN self; + +} + + +function init_Int { + PARAM self; + PARAM v; + + + SETATTR self value v; + RETURN self; + +} + + +function init_String { + PARAM self; + PARAM v; + + + SETATTR self value v; + RETURN self; + +} + + +function init_Bool { + PARAM self; + PARAM v; + + + SETATTR self value v; + RETURN self; + +} + + +function init_IO { + PARAM self; + + + RETURN self; + +} + + diff --git a/src/program.cl b/src/program.cl index 0c818f908..4774ec308 100644 --- a/src/program.cl +++ b/src/program.cl @@ -1,5 +1,7 @@ class Main inherits IO { - main(): IO { - out_string("Hello, World.\n") - }; + main() : IO { + { + out_string((isvoid self).type_name()); -- demonstrates the dispatch rules. + } + }; }; From e923689f76b512e0a54f27e07bf38eb081380895 Mon Sep 17 00:00:00 2001 From: Amy Date: Sat, 26 Feb 2022 19:25:33 -0500 Subject: [PATCH 43/81] fix is_void --- src/code_generator/generate_ast.py | 12 ++++++------ src/code_generator/utils.py | 2 -- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 8399bc652..2cd7075c4 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -346,12 +346,12 @@ def visit(self, node): @visitor.when(IsVoidNode) def visit(self, node): expr = self.visit(node.expr) - if isinstance(node.expr.computed_type, IntType) or isinstance(node.expr.computed_type, StringType) or isinstance(node.expr.computed_type, BoolType): - return CILNumberNode(0) - else: - name = self.scope.add_new_local(node.computed_type) - self.scope.instructions.append(CILAssignNode(CILVariableNode(name), expr)) - return CILEqualsNode(CILVariableNode(name), CILNumberNode(0)) + name = self.scope.add_new_local(node.computed_type) + self.scope.instructions.append(CILAssignNode(CILVariableNode(name), expr)) + self.scope.instructions.append(CILArgNode(CILVariableNode(name))) + name = self.scope.add_new_local("Bool") + self.scope.instructions.append(CILAssignNode(CILVariableNode(name), CILCallNode("isvoid") )) + return CILVariableNode(name) @visitor.when(ConstantNumNode) def visit(self, node): diff --git a/src/code_generator/utils.py b/src/code_generator/utils.py index a350df07b..295d7b535 100644 --- a/src/code_generator/utils.py +++ b/src/code_generator/utils.py @@ -149,7 +149,6 @@ def create_builtin_types(self): def create_init_class(self, attributes, expresions, locals): type = self.context.get_type(self.current_class) instructions = [] - print(expresions) if not isinstance(type.parent, ObjectType): instructions.append(CILArgNode(CILVariableNode(f'self'))) call = CILCallNode(f'init_{type.parent.name}') @@ -160,7 +159,6 @@ def create_init_class(self, attributes, expresions, locals): instructions.extend(inst) if not isinstance(expr, CILAtomicNode): variable = CILVariableNode(self.add_new_local(type)) - # print instructions.append(CILAssignNode(variable, expr)) else: variable = expr From c8ec22cb027b4b65c097ba603d810a34876fcb10 Mon Sep 17 00:00:00 2001 From: Amy Date: Sat, 26 Feb 2022 20:05:02 -0500 Subject: [PATCH 44/81] fix error --- src/code_generator/generate_ast.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 2cd7075c4..82650e4c2 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -70,6 +70,7 @@ def visit(self, node): methods.append(CILMethodNode(m, type_info.methods[m])) for feature in node.features: + self.scope.instructions = [] if isinstance(feature, AttrDeclarationNode): if feature.expr is not None: expr = self.visit(feature.expr) From 23ec5a865d7ae3348f1890a8bc27e338a7488e05 Mon Sep 17 00:00:00 2001 From: Amy Date: Sat, 26 Feb 2022 20:33:45 -0500 Subject: [PATCH 45/81] fix --- src/code_generator/generate_ast.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 82650e4c2..dae71a9b7 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -71,6 +71,8 @@ def visit(self, node): for feature in node.features: self.scope.instructions = [] + self.scope.locals = [{}] + self.scope.all_locals = [] if isinstance(feature, AttrDeclarationNode): if feature.expr is not None: expr = self.visit(feature.expr) From ab339803225b9f70112c192d0ae775dfe66e8809 Mon Sep 17 00:00:00 2001 From: Amy Date: Sat, 26 Feb 2022 20:34:38 -0500 Subject: [PATCH 46/81] fix error --- src/code_generator/generate_ast.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index dae71a9b7..2c03eb8f9 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -80,8 +80,6 @@ def visit(self, node): self.scope.instructions = [] att_aux.append(feature.id) locals.extend(self.scope.all_locals.copy()) - self.scope.locals = [{}] - self.scope.all_locals = [] else: function = self.visit(feature) From 6abd28f5c9e08e80756b6e28674b4d168b5b7c8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karla=20Olivera=20Hern=C3=A1ndez?= Date: Sat, 26 Feb 2022 20:56:42 -0500 Subject: [PATCH 47/81] Change init method name for no conflicts --- src/code_generator/generate_ast.py | 12 ++++++------ src/code_generator/utils.py | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 2c03eb8f9..24699c057 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -24,7 +24,7 @@ def visit(self, node): instructions = [] instructions.append(CILAssignNode(CILVariableNode("m0"), CILAllocateNode(CILTypeConstantNode("Main")))) instructions.append(CILArgNode(CILVariableNode("m0"))) - instructions.append(CILAssignNode(CILVariableNode("m1"), CILVCallNode("Main", "init"))) + instructions.append(CILAssignNode(CILVariableNode("m1"), CILVCallNode("Main", "init_Main"))) instructions.append(CILArgNode(CILVariableNode("m1"))) instructions.append(CILAssignNode(CILVariableNode("m2"), CILVCallNode("Main", "main"))) instructions.append(CILReturnNode(CILVariableNode("m2"))) @@ -65,7 +65,7 @@ def visit(self, node): type_info = self.scope.infos[node.id] for a in type_info.attrs: attributes.append(CILAttributeNode(a.name, a.type)) - methods.append(CILMethodNode('init', f'init_{node.id}')) + methods.append(CILMethodNode(f'init_{node.id}', f'init_{node.id}')) for m in type_info.methods.keys(): methods.append(CILMethodNode(m, type_info.methods[m])) @@ -198,15 +198,15 @@ def visit(self, node): elif isinstance(node.computed_type, IntType): self.scope.instructions.append(CILArgNode(CILNumberNode(0))) var = CILVariableNode(name) - self.scope.instructions.append(CILAssignNode(var, CILVCallNode('Int', 'init'))) + self.scope.instructions.append(CILAssignNode(var, CILVCallNode('Int', 'init_Int'))) elif isinstance(node.computed_type, BoolType): self.scope.instructions.append(CILArgNode(CILNumberNode(0))) var = CILVariableNode(name) - self.scope.instructions.append(CILAssignNode(var, CILVCallNode('Bool', 'init'))) + self.scope.instructions.append(CILAssignNode(var, CILVCallNode('Bool', 'init_Bool'))) elif isinstance(node.computed_type, StringType): self.scope.instructions.append(CILArgNode(CILNumberNode(0))) var = CILVariableNode(name) - self.scope.instructions.append(CILAssignNode(var, CILVCallNode('String', 'init'))) + self.scope.instructions.append(CILAssignNode(var, CILVCallNode('String', 'init_String'))) @visitor.when(LoopNode) def visit(self, node): @@ -383,5 +383,5 @@ def visit(self, node): self.scope.instructions.append(CILAssignNode(CILVariableNode(name),CILAllocateNode(CILTypeConstantNode(node.lex)))) self.scope.instructions.append(CILArgNode(CILVariableNode(name))) name = self.scope.add_new_local(node.lex) - self.scope.instructions.append(CILAssignNode(CILVariableNode(name), CILVCallNode(node.lex, f"init"))) + self.scope.instructions.append(CILAssignNode(CILVariableNode(name), CILVCallNode(node.lex, f"init_{node.lex}"))) return CILVariableNode(name) \ No newline at end of file diff --git a/src/code_generator/utils.py b/src/code_generator/utils.py index 295d7b535..b1932e3b4 100644 --- a/src/code_generator/utils.py +++ b/src/code_generator/utils.py @@ -68,7 +68,7 @@ def create_builtin_types(self): types = [] obj_methods = [ - CILMethodNode('init', 'init_Object'), + CILMethodNode('init_Object', 'init_Object'), CILMethodNode('abort', 'abort_Object'), CILMethodNode('type_name', 'type_name_Object'), CILMethodNode('copy', 'copy_Object'), @@ -82,7 +82,7 @@ def create_builtin_types(self): self.functions.append(init_Object) int_methods = [ - CILMethodNode('init', 'init_Int'), + CILMethodNode('init_Int', 'init_Int'), CILMethodNode('abort', 'abort_Object'), CILMethodNode('type_name', 'type_name_Object'), CILMethodNode('copy', 'copy_Object'), @@ -96,7 +96,7 @@ def create_builtin_types(self): self.functions.append(init_int) str_methods = [ - CILMethodNode('init', 'init_String'), + CILMethodNode('init_String', 'init_String'), CILMethodNode('abort', 'abort_Object'), CILMethodNode('type_name', 'type_name_Object'), CILMethodNode('copy', 'copy_Object'), @@ -113,7 +113,7 @@ def create_builtin_types(self): self.functions.append(init_string) bool_methods = [ - CILMethodNode('init', 'init_Bool'), + CILMethodNode('init_Bool', 'init_Bool'), CILMethodNode('abort', 'abort_Object'), CILMethodNode('type_name', 'type_name_Object'), CILMethodNode('copy', 'copy_Object'), @@ -127,7 +127,7 @@ def create_builtin_types(self): self.functions.append(init_bool) io_methods = [ - CILMethodNode('init', 'init_IO'), + CILMethodNode('init_IO', 'init_IO'), CILMethodNode('abort', 'abort_Object'), CILMethodNode('type_name', 'type_name_Object'), CILMethodNode('copy', 'copy_Object'), From 84265e6a70ed29b70bfb3e542b40a24a058022c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karla=20Olivera=20Hern=C3=A1ndez?= Date: Sat, 26 Feb 2022 21:39:36 -0500 Subject: [PATCH 48/81] Fix then and ifthen labels --- src/code_generator/generate_ast.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 24699c057..4d46a1269 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -172,11 +172,11 @@ def visit(self, node): self.scope.if_count += 1 exp_else = self.visit(node.elsex) self.scope.instructions.append(CILAssignNode(var_return, exp_else)) - self.scope.instructions.append(CILGotoNode(CILLabelNode(f'ifend{count}'))) - self.scope.instructions.append(CILLabelNode( f'then{count}')) + self.scope.instructions.append(CILGotoNode(CILLabelNode(f'ifend_{count}'))) + self.scope.instructions.append(CILLabelNode( f'then_{count}')) exp_then = self.visit(node.then) self.scope.instructions.append(CILAssignNode(var_return, exp_then)) - self.scope.instructions.append(CILLabelNode(f'ifend{count}')) + self.scope.instructions.append(CILLabelNode(f'ifend_{count}')) return var_return @visitor.when(LetNode) From 52cea6871c78e14ca1da8e8e7ec5349a4fc1ccc0 Mon Sep 17 00:00:00 2001 From: Amy Date: Sat, 26 Feb 2022 21:48:36 -0500 Subject: [PATCH 49/81] fix prime and not --- src/code_generator/generate_ast.py | 34 +++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 24699c057..c0c8b1abf 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -1,3 +1,4 @@ +from cmath import exp from parsing.ast import * from .ast_CIL import * from .utils import * @@ -311,29 +312,42 @@ def visit(self, node): right = expr_right if isinstance(node, PlusNode): - return CILPlusNode(left, right) + oper = CILPlusNode(left, right) elif isinstance(node, MinusNode): - return CILMinusNode(left, right) + oper = CILMinusNode(left, right) elif isinstance(node, DivNode): - return CILDivNode(left, right) + oper = CILDivNode(left, right) elif isinstance(node, StarNode): - return CILStarNode(left, right) + oper = CILStarNode(left, right) elif isinstance(node, ElessNode): - return CILElessNode(left, right) + oper = CILElessNode(left, right) elif isinstance(node, LessNode): - return CILLessNode(left, right) + oper = CILLessNode(left, right) else: - return CILEqualsNode(left, right) - + oper = CILEqualsNode(left, right) + name = self.scope.add_new_local(node.computed_type.name) + self.scope.instructions.append(CILAssignNode(CILVariableNode(name),oper)) + return CILVariableNode(name) @visitor.when(PrimeNode) def visit(self, node): expr = self.visit(node.expr) - return CILStarNode(expr , CILNumberNode(-1)) + name_exp = self.scope.add_new_local(node.expr.computed_type.name) + self.scope.instructions.append(CILAssignNode(CILVariableNode(name_exp), expr)) + name = self.scope.add_new_local(node.computed_type.name) + self.scope.instructions.append(CILAssignNode(CILVariableNode(name), CILMinusNode(CILNumberNode(0), CILVariableNode(name_exp)))) + return CILVariableNode(name) @visitor.when(NotNode) def visit(self, node): expr = self.visit(node.expr) - return CILNotEqualsNode( expr, CILNumberNode(0)) + name_exp = self.scope.add_new_local(node.expr.computed_type.name) + self.scope.instructions.append(CILAssignNode(CILVariableNode(name_exp), expr)) + name = self.scope.add_new_local(node.computed_type.name) + self.scope.instructions.append(CILAssignNode(CILVariableNode(name), CILNotEqualsNode(CILVariableNode(name_exp) , CILNumberNode(0)))) + return CILVariableNode(name) + + self.scope.instructions.append(CILAssignNode(CILVariableNode(name), CILNotEqualsNode( expr, CILNumberNode(0)))) + return CILVariableNode(name) @visitor.when(StringNode) def visit(self, node): From 20bdc17d55b813e6718f7bc18a08a0a839637c44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karla=20Olivera=20Hern=C3=A1ndez?= Date: Sat, 26 Feb 2022 22:08:27 -0500 Subject: [PATCH 50/81] Change False and True nodes in CIL visitor --- src/code_generator/generate_ast.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index f96cb4f50..8f19503f0 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -312,7 +312,7 @@ def visit(self, node): right = expr_right if isinstance(node, PlusNode): - oper = CILPlusNode(left, right) + oper = CILPlusNode(left, right) elif isinstance(node, MinusNode): oper = CILMinusNode(left, right) elif isinstance(node, DivNode): @@ -328,6 +328,7 @@ def visit(self, node): name = self.scope.add_new_local(node.computed_type.name) self.scope.instructions.append(CILAssignNode(CILVariableNode(name),oper)) return CILVariableNode(name) + @visitor.when(PrimeNode) def visit(self, node): expr = self.visit(node.expr) @@ -345,10 +346,7 @@ def visit(self, node): name = self.scope.add_new_local(node.computed_type.name) self.scope.instructions.append(CILAssignNode(CILVariableNode(name), CILNotEqualsNode(CILVariableNode(name_exp) , CILNumberNode(0)))) return CILVariableNode(name) - - self.scope.instructions.append(CILAssignNode(CILVariableNode(name), CILNotEqualsNode( expr, CILNumberNode(0)))) - return CILVariableNode(name) - + @visitor.when(StringNode) def visit(self, node): data = CILDataNode(f'str_{self.scope.str_count}', node.lex) @@ -385,11 +383,17 @@ def visit(self, node): @visitor.when(TrueNode) def visit(self, node): - return CILNumberNode(1) + oper = CILEqualsNode(CILNumberNode(0), CILNumberNode(0)) + name = self.scope.add_new_local('Bool') + self.scope.instructions.append(CILAssignNode(CILVariableNode(name), oper)) + return CILVariableNode(name) @visitor.when(FalseNode) def visit(self, node): - return CILNumberNode(0) + oper = CILEqualsNode(CILNumberNode(0), CILNumberNode(1)) + name = self.scope.add_new_local('Bool') + self.scope.instructions.append(CILAssignNode(CILVariableNode(name), oper)) + return CILVariableNode(name) @visitor.when(InstantiateNode) def visit(self, node): From dc9bcd74aff251c544601545ae56c03123602722 Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Sun, 27 Feb 2022 01:46:48 -0500 Subject: [PATCH 51/81] Fix arithmetic and comparison operations code generation Fixes the code generation of sum, sub, less, eless, equals operators --- src/code_generator/mips_built_in.txt | 264 +++++++++++++++++++++++++++ src/code_generator/spim_visitor.py | 117 +++++++----- 2 files changed, 337 insertions(+), 44 deletions(-) diff --git a/src/code_generator/mips_built_in.txt b/src/code_generator/mips_built_in.txt index dc2aafdbd..9e003c5d2 100644 --- a/src/code_generator/mips_built_in.txt +++ b/src/code_generator/mips_built_in.txt @@ -22,6 +22,97 @@ out_string_IO: jr $ra +out_int_IO: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + lw $v1, 12($fp) + lw $a0, 4($v1) + li $v0, 1 + syscall + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + +in_string_IO: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + # Read the string to the buffer + la $a0, IO_Buffer + li $a1, 1000 + li $v0, 8 + syscall + + # get the length of the string to allocate the memory + la $t0, IO_Buffer + sw $t0, 0($sp) + addi $sp, $sp, -4 + jal strlen + addi $sp, $sp, 4 + lw $t0, 0($sp) # the length is now in $v0 + + addi $v0, $v0, 1 + move $a0, $v0 + li $v0, 9 + syscall # in $v0 is the address of the value string + + la $t1, IO_Buffer # copy the string value from the buffer to the heap + move $t2, $v0 + in_string_IO_loop: + lb $t3, 0($t1) + sb $t3, 0($t2) + addi $t1, $t1, 1 + addi $t2, $t2, 1 + bgtz $t3, in_string_IO_loop + addi $t2, $t2, -2 + li $t3, 0 + sb $t3, 0($t2) + + move $t0, $v0 + + li $a0, 8 + li $v0, 9 + syscall + + la $t1, String + sw $t0, 4($v0) + sw $t1, 0($v0) + + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + + + + + + + + + + + + + type_name_Object: # calling conventions sw $ra, 0($sp) @@ -118,6 +209,179 @@ substr_String: jr $ra +isvoid: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + lw $t0, 12($fp) + li $t1, 0 + beq $t0, $t1, isvoid_end + li $t0, 1 + isvoid_end: + + li $a0, 8 + li $v0, 9 + syscall + + la $t1, Bool + sw $t1, 0($v0) + sw $t0, 4($v0) + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + +# function to get the length of a string value +strlen: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + + lw $a0, 12($fp) + li $t0, 0 +strlen_loop: + lb $t1, 0($a0) + beqz $t1, strlen_exit + addu $a0, $a0, 1 + addu $t0, $t0, 1 + j strlen_loop + strlen_exit: + move $v0, $t0 + + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + + +length_String: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + lw $v0, 12($fp) # get the string instance address + lw $v1, 4($v0) # get the string value address + + # push the instace in the stack + sw $v1, 0($sp) + addi $sp, $sp, -4 + + jal strlen # length at v0 + + addi $sp, $sp, 4 + lw $t0, 0($sp) + + + move $t0, $v0 + + # allocate space for the Int instace + li $a0, 8 + li $v0, 9 + syscall + + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + + +compare: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + lw $t0, 12($fp) + lw $t1, 16($fp) + + lw $t3, 0($t0) + + la $t4, Int + beq $t3, $t4, compare_branch1 + + la $t4, Bool + beq $t3, $t4, compare_branch1 + + la $t4, String + beq $t3, $t4, compare_branch2 + + j compare_values + + compare_branch1: + lw $t0, 4($t0) + lw $t1, 4($t1) + + compare_values: + beq $t0, $t1, compare_true + j compare_false + + + compare_branch2: + lw $t0, 4($t0) + lw $t1, 4($t1) + compare_str_loop: + lb $t3, 0($t0) + lb $t4, 0($t1) + bne $t3, $t4, compare_false + beq $t3, $zero, compare_true + addi $t0, $t0, 1 + addi $t1, $t1, 1 + j compare_str_loop + + compare_true: + li $t0, 1 + j compare_end + + compare_false: + li $t0, 0 + + compare_end: + + li $a0, 8 + li $v0, 9 + syscall + la $t1, Bool + sw $t1, 0($v0) + sw $t0, 4($v0) + + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + + diff --git a/src/code_generator/spim_visitor.py b/src/code_generator/spim_visitor.py index a27a417e8..82ec15ffa 100644 --- a/src/code_generator/spim_visitor.py +++ b/src/code_generator/spim_visitor.py @@ -45,6 +45,10 @@ def visit(self, node: CILProgramNode, frame): self.set_tabs(0) self.add_line("ObjectErrorMessage : .asciiz \"Program was halted\"") + self.set_tabs(1) + self.add_line(".data") + self.set_tabs(0) + self.add_line("IO_Buffer : .space 1001") for d in node.data: self.visit(d, frame) @@ -166,10 +170,10 @@ def visit(self, node: CILArgNode, frame): @visitor.when(CILIfGotoNode) def visit(self, node: CILIfGotoNode, frame): - register = '$v1' value_addr = frame.get_addr(node.var.lex) - self.add_line(f'lw {register}, {value_addr}') - self.add_line(f'bne {register}, $zero, {node.label.id}') + self.add_line(f'lw $t1, {value_addr}') + self.add_line(f'lw $t0, 4($t1)') + self.add_line(f'bne $t0, $zero, {node.label.id}') @visitor.when(CILGotoNode) def visit(self, node: CILGotoNode, frame): @@ -312,23 +316,39 @@ def visit(self, node: CILVariableNode, frame): @visitor.when(CILPlusNode) def visit(self, node: CILPlusNode, frame): register0 = '$v0' - register1 = '$v1' self.add_line(f'# computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at {register0}') - self.visit(node.left, frame) - self.add_line(f'move {register1}, {register0}') + self.visit(node.left, frame) # in $v0 is the address of the Int instance + self.add_line(f'lw $t0, 4($v0)') + self.gen_push('$t0') self.visit(node.right, frame) - self.add_line(f'addu {register0}, {register0}, {register1}') + self.gen_pop('$t0') + self.add_line(f'lw $t1, 4($v0)') + self.add_line(f'add $t0, $t0, $t1') + self.add_line(f'li $a0, 8') + self.add_line(f'li $v0, 9') + self.add_line(f'syscall') + self.add_line(f'la $t1, Int') + self.add_line(f'sw $t1, 0($v0)') + self.add_line(f'sw $t0, 4($v0)') return register0 @visitor.when(CILMinusNode) def visit(self, node: CILMinusNode, frame): register0 = '$v0' - register1 = '$v1' - self.add_line(f'# computes the substraction of (node.left.to_string) and (node.right.to_string) and stores it at {register0}') - self.visit(node.left, frame) - self.add_line(f'move {register1}, {register0}') + self.add_line(f'# computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at {register0}') + self.visit(node.left, frame) # in $v0 is the address of the Int instance + self.add_line(f'lw $t0, 4($v0)') + self.gen_push('$t0') self.visit(node.right, frame) - self.add_line(f'subu {register0}, {register1}, {register0}') + self.add_line(f'lw $t1, 4($v0)') + self.gen_pop('$t0') + self.add_line(f'sub $t0, $t0, $t1') + self.add_line(f'li $a0, 8') + self.add_line(f'li $v0, 9') + self.add_line(f'syscall') + self.add_line(f'la $t1, Int') + self.add_line(f'sw $t1, 0($v0)') + self.add_line(f'sw $t0, 4($v0)') return register0 @@ -358,50 +378,59 @@ def visit(self, node: CILDivNode, frame): @visitor.when(CILLessNode) def visit(self, node: CILLessNode, frame): - register0 = '$v0' - register1 = '$v1' self.visit(node.left, frame) - self.add_line(f'move {register1}, {register0}') + self.add_line(f'move $t1, $v0') # get the address to the left Int instance + self.add_line(f'lw $t1, 4($t1)') # get the value of the instance + self.visit(node.right, frame) - self.add_line(f'slt {register0}, {register1}, {register0}') - return register0 + self.add_line(f'move $t2, $v0') # get the address to the right Int instance + self.add_line(f'lw $t2, 4($t2)') # get the value of the instance + + + self.add_line(f'slt $t3, $t1, $t2') # l < r ? + + self.add_line(f'la $t4, Bool') + self.add_line(f'li $a0, 8') + self.add_line(f'li $v0, 9') + self.add_line('syscall') + self.add_line(f'sw $t4, 0($v0)') + self.add_line(f'sw $t3, 4($v0)') + return '$v0' @visitor.when(CILElessNode) def visit(self, node: CILElessNode, frame): - register0 = '$v0' - register1 = '$s1' - register2 = '$s2' - register3 = '$s3' - register4 = '$s4' self.visit(node.left, frame) - self.add_line(f'move {register1}, {register0}') - self.add_line(f'move {register3}, {register0}') + self.add_line(f'move $t1, $v0') # get the address to the left Int instance + self.add_line(f'lw $t1, 4($t1)') # get the value of the instance + self.visit(node.right, frame) - self.add_line(f'move {register2}, {register0}') - self.add_line(f'slt {register0}, {register1}, {register0}') - self.add_line(f'slt {register2}, {register2}, {register3}') - self.add_line(f'nor {register2}, {register2}, $zero') - self.add_line(f'and {register0}, {register0}, {register2}') - return register0 + self.add_line(f'move $t2, $v0') # get the address to the right Int instance + self.add_line(f'lw $t2, 4($t2)') # get the value of the instance + + + self.add_line(f'slt $t4, $t2, $t1') # r < l? + self.add_line(f'li $t3, 1') + self.add_line(f'xor $t3, $t3, $t4') + self.add_line(f'andi $t3, $t3, 0x01') # get the last bit + + self.add_line(f'la $t4, Bool') + self.add_line(f'li $a0, 8') + self.add_line(f'li $v0, 9') + self.add_line('syscall') + self.add_line(f'sw $t4, 0($v0)') + self.add_line(f'sw $t3, 4($v0)') + return '$v0' @visitor.when(CILEqualsNode) def visit(self, node: CILEqualsNode, frame): - register0 = '$s0' - register1 = '$s1' - register2 = '$s2' - register3 = '$s3' - register4 = '$s4' self.visit(node.left, frame) - self.add_line(f'move {register1}, {register0}') - self.add_line(f'move {register3}, {register0}') + self.gen_push('$v0') self.visit(node.right, frame) - self.add_line(f'move {register2}, {register0}') - self.add_line(f'slt {register0}, {register1}, {register0}') - self.add_line(f'nor {register0}, {register0}, $zero') - self.add_line(f'slt {register2}, {register2}, {register3}') - self.add_line(f'nor {register2}, {register2}, $zero') - self.add_line(f'and {register0}, {register0}, {register2}') - return register0 + self.gen_push('$v0') + self.add_line('jal compare') + self.gen_pop('$t0') + self.gen_pop('$t0') + return '$v0' From dedef972541b5276e620f5285f68b4d156c44001 Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Sun, 27 Feb 2022 05:12:15 -0500 Subject: [PATCH 52/81] Fixes in code generation - Fixed not operator - Fixed argument genration in the init methods - Fixed * and / operations --- src/code_generator/ast_CIL.py | 4 + src/code_generator/cil_codegen.py | 5 + src/code_generator/generate_ast.py | 16 +- src/code_generator/mips_built_in.txt | 60 + src/code_generator/spim_scope.py | 7 +- src/code_generator/spim_visitor.py | 69 +- src/code_generator/utils.py | 32 +- src/cool.py | 13 +- src/output.cil | 214 ++- src/program.cl | 87 +- src/result.s | 2088 ++++++++++++++++++++++++++ 11 files changed, 2511 insertions(+), 84 deletions(-) diff --git a/src/code_generator/ast_CIL.py b/src/code_generator/ast_CIL.py index ab74d0868..fb5696c95 100644 --- a/src/code_generator/ast_CIL.py +++ b/src/code_generator/ast_CIL.py @@ -345,4 +345,8 @@ class CILEqualsNode(CILBinaryOperationNode): class CILNotEqualsNode(CILBinaryOperationNode): pass + +class CILNotNode(CILExpressionNode): + def __init__(self, var): + self.var = var \ No newline at end of file diff --git a/src/code_generator/cil_codegen.py b/src/code_generator/cil_codegen.py index 381b83a3e..59a5d4158 100644 --- a/src/code_generator/cil_codegen.py +++ b/src/code_generator/cil_codegen.py @@ -206,3 +206,8 @@ def visit(self, node: CILNotEqualsNode): l = self.visit(node.left) r = self.visit(node.right) return f'{l} != {r}' + + @visitor.when(CILNotNode) + def visit(self, node: CILNotNode): + return f'~ {self.var.lex}' + diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 8f19503f0..1b0501873 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -25,7 +25,7 @@ def visit(self, node): instructions = [] instructions.append(CILAssignNode(CILVariableNode("m0"), CILAllocateNode(CILTypeConstantNode("Main")))) instructions.append(CILArgNode(CILVariableNode("m0"))) - instructions.append(CILAssignNode(CILVariableNode("m1"), CILVCallNode("Main", "init_Main"))) + instructions.append(CILAssignNode(CILVariableNode("m1"), CILVCallNode("Main", "Init_Main"))) instructions.append(CILArgNode(CILVariableNode("m1"))) instructions.append(CILAssignNode(CILVariableNode("m2"), CILVCallNode("Main", "main"))) instructions.append(CILReturnNode(CILVariableNode("m2"))) @@ -66,7 +66,7 @@ def visit(self, node): type_info = self.scope.infos[node.id] for a in type_info.attrs: attributes.append(CILAttributeNode(a.name, a.type)) - methods.append(CILMethodNode(f'init_{node.id}', f'init_{node.id}')) + methods.append(CILMethodNode(f'Init_{node.id}', f'Init_{node.id}')) for m in type_info.methods.keys(): methods.append(CILMethodNode(m, type_info.methods[m])) @@ -199,15 +199,15 @@ def visit(self, node): elif isinstance(node.computed_type, IntType): self.scope.instructions.append(CILArgNode(CILNumberNode(0))) var = CILVariableNode(name) - self.scope.instructions.append(CILAssignNode(var, CILVCallNode('Int', 'init_Int'))) + self.scope.instructions.append(CILAssignNode(var, CILVCallNode('Int', 'Init_Int'))) elif isinstance(node.computed_type, BoolType): self.scope.instructions.append(CILArgNode(CILNumberNode(0))) var = CILVariableNode(name) - self.scope.instructions.append(CILAssignNode(var, CILVCallNode('Bool', 'init_Bool'))) + self.scope.instructions.append(CILAssignNode(var, CILVCallNode('Bool', 'Init_Bool'))) elif isinstance(node.computed_type, StringType): self.scope.instructions.append(CILArgNode(CILNumberNode(0))) var = CILVariableNode(name) - self.scope.instructions.append(CILAssignNode(var, CILVCallNode('String', 'init_String'))) + self.scope.instructions.append(CILAssignNode(var, CILVCallNode('String', 'Init_String'))) @visitor.when(LoopNode) def visit(self, node): @@ -344,7 +344,7 @@ def visit(self, node): name_exp = self.scope.add_new_local(node.expr.computed_type.name) self.scope.instructions.append(CILAssignNode(CILVariableNode(name_exp), expr)) name = self.scope.add_new_local(node.computed_type.name) - self.scope.instructions.append(CILAssignNode(CILVariableNode(name), CILNotEqualsNode(CILVariableNode(name_exp) , CILNumberNode(0)))) + self.scope.instructions.append(CILAssignNode(CILVariableNode(name), CILNotNode(CILVariableNode(name_exp)))) return CILVariableNode(name) @visitor.when(StringNode) @@ -401,5 +401,5 @@ def visit(self, node): self.scope.instructions.append(CILAssignNode(CILVariableNode(name),CILAllocateNode(CILTypeConstantNode(node.lex)))) self.scope.instructions.append(CILArgNode(CILVariableNode(name))) name = self.scope.add_new_local(node.lex) - self.scope.instructions.append(CILAssignNode(CILVariableNode(name), CILVCallNode(node.lex, f"init_{node.lex}"))) - return CILVariableNode(name) \ No newline at end of file + self.scope.instructions.append(CILAssignNode(CILVariableNode(name), CILVCallNode(node.lex, f"Init_{node.lex}"))) + return CILVariableNode(name) diff --git a/src/code_generator/mips_built_in.txt b/src/code_generator/mips_built_in.txt index 9e003c5d2..5520965ef 100644 --- a/src/code_generator/mips_built_in.txt +++ b/src/code_generator/mips_built_in.txt @@ -1,3 +1,36 @@ +abort_Object: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + la $a0, ObjectAbortMessage + li $v0, 4 + syscall + + lw $t0, 12($fp) + lw $t0, 0($t0) + lw $t0, 4($t0) + + move $a0, $t0 + li $v0, 4 + syscall + + li $v0, 10 + syscall + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + + + out_string_IO: # calling conventions sw $ra, 0($sp) @@ -101,7 +134,34 @@ in_string_IO: jr $ra +in_int_IO: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + li $v0, 5 + syscall + move $t0, $v0 + + li $v0, 9 + li $a0, 8 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra diff --git a/src/code_generator/spim_scope.py b/src/code_generator/spim_scope.py index e54d6e4f2..22dde5c99 100644 --- a/src/code_generator/spim_scope.py +++ b/src/code_generator/spim_scope.py @@ -50,7 +50,8 @@ def __str__(self): return r class ProcCallFrame: - def __init__(self, nargs, nvars): + def __init__(self,name, nargs, nvars): + self.name = name self.nargs = nargs self.size = WSIZE * nvars self.args = {} # Associates each argument with the offset to be accessed in the stack @@ -85,7 +86,7 @@ def get_addr(self, id): return self.var_addr(id) def __str__(self): - r = '-------------- Frame -----------------\n' + r = f'-------------- Frame {self.name} -----------------\n' r += f'Size: {self.size}\n' r += f'Args: {self.args}\n' r += f'Vars: {self.vars}\n' @@ -117,7 +118,7 @@ def visit(self, node: CILTypeNode): @visitor.when(CILFuncNode) def visit(self, node: CILFuncNode): - frame = ProcCallFrame(len(node.params), len(node.locals)) + frame = ProcCallFrame(node.id, len(node.params), len(node.locals)) for p in node.params: frame.add_argument(p.id) for l in node.locals: diff --git a/src/code_generator/spim_visitor.py b/src/code_generator/spim_visitor.py index 82ec15ffa..0148932c5 100644 --- a/src/code_generator/spim_visitor.py +++ b/src/code_generator/spim_visitor.py @@ -43,7 +43,7 @@ def visit(self, node: CILProgramNode, frame): self.set_tabs(1) self.add_line(".data") self.set_tabs(0) - self.add_line("ObjectErrorMessage : .asciiz \"Program was halted\"") + self.add_line("ObjectAbortMessage : .asciiz \"Abort called from class \"") self.set_tabs(1) self.add_line(".data") @@ -355,25 +355,41 @@ def visit(self, node: CILMinusNode, frame): @visitor.when(CILStarNode) def visit(self, node: CILStarNode, frame): register0 = '$v0' - register1 = '$v1' - self.add_line(f'# computes the multiplication of (node.left.to_string) and (node.right.to_string) and stores it at {register0}') - self.visit(node.left, frame) - self.add_line(f'move {register1}, {register0}') + self.add_line(f'# computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at {register0}') + self.visit(node.left, frame) # in $v0 is the address of the Int instance + self.add_line(f'lw $t0, 4($v0)') + self.gen_push('$t0') self.visit(node.right, frame) - self.add_line(f'mult {register0}, {register0}') - self.add_line(f'mflo {register0}') + self.add_line(f'lw $t1, 4($v0)') + self.gen_pop('$t0') + self.add_line(f'mul $t0, $t1') + self.add_line(f'mflo $t0') + self.add_line(f'li $a0, 8') + self.add_line(f'li $v0, 9') + self.add_line(f'syscall') + self.add_line(f'la $t1, Int') + self.add_line(f'sw $t1, 0($v0)') + self.add_line(f'sw $t0, 4($v0)') return register0 @visitor.when(CILDivNode) def visit(self, node: CILDivNode, frame): register0 = '$v0' - register1 = '$v1' - self.add_line(f'# computes the quotient of (node.left.to_string) and (node.right.to_string) and stores it at {register0}') - self.visit(node.left, frame) - self.add_line(f'move {register1}, {register0}') + self.add_line(f'# computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at {register0}') + self.visit(node.left, frame) # in $v0 is the address of the Int instance + self.add_line(f'lw $t0, 4($v0)') + self.gen_push('$t0') self.visit(node.right, frame) - self.add_line(f'div {register1}, {register0}') - self.add_line(f'mflo {register0}') + self.add_line(f'lw $t1, 4($v0)') + self.gen_pop('$t0') + self.add_line(f'div $t0, $t1') + self.add_line(f'mflo $t0') + self.add_line(f'li $a0, 8') + self.add_line(f'li $v0, 9') + self.add_line(f'syscall') + self.add_line(f'la $t1, Int') + self.add_line(f'sw $t1, 0($v0)') + self.add_line(f'sw $t0, 4($v0)') return register0 @visitor.when(CILLessNode) @@ -431,8 +447,33 @@ def visit(self, node: CILEqualsNode, frame): self.gen_pop('$t0') self.gen_pop('$t0') return '$v0' - + + @visitor.when(CILNotEqualsNode) + def visit(self, node: CILNotEqualsNode, frame): + self.visit(node.left, frame) + self.gen_push('$v0') + self.visit(node.right, frame) + self.gen_push('$v0') + self.add_line('jal compare') + self.gen_pop('$t0') + self.gen_pop('$t0') + self.add_line('lw $t0, 4($v0)') + self.add_line('li $t1, 1') + self.add_line('xor $t0, $t0, $t1') + self.add_line('andi $t0, $t0, 0x01') + self.add_line('sw $t0, 4($v0)') + return '$v0' + + @visitor.when(CILNotNode) + def visit(self, node: CILNotNode, frame): + self.visit(node.var, frame) + self.add_line('lw $t0, 4($v0)') + self.add_line('li $t1, 1') + self.add_line('xor $t0, $t0, $t1') + self.add_line('andi $t0, $t0, 0x01') + self.add_line('sw $t0, 4($v0)') + return '$v0' diff --git a/src/code_generator/utils.py b/src/code_generator/utils.py index b1932e3b4..c2166cc12 100644 --- a/src/code_generator/utils.py +++ b/src/code_generator/utils.py @@ -68,35 +68,35 @@ def create_builtin_types(self): types = [] obj_methods = [ - CILMethodNode('init_Object', 'init_Object'), + CILMethodNode('Init_Object', 'Init_Object'), CILMethodNode('abort', 'abort_Object'), CILMethodNode('type_name', 'type_name_Object'), CILMethodNode('copy', 'copy_Object'), ] types.append(CILTypeNode('Object', [], obj_methods)) init_Object = CILFuncNode( - 'init_Object', + 'Init_Object', [CILParamNode('self', None)], [], [CILReturnNode(CILVariableNode('self'))]) self.functions.append(init_Object) int_methods = [ - CILMethodNode('init_Int', 'init_Int'), + CILMethodNode('Init_Int', 'Init_Int'), CILMethodNode('abort', 'abort_Object'), CILMethodNode('type_name', 'type_name_Object'), CILMethodNode('copy', 'copy_Object'), ] types.append(CILTypeNode('Int', [CILAttributeNode('value', None)], int_methods)) init_int = CILFuncNode( - 'init_Int', + 'Init_Int', [CILParamNode('self', None), CILParamNode('v', None)], [], [CILSetAttributeNode(CILVariableNode('self'), 'Int', CILVariableNode('value'), CILVariableNode('v')), CILReturnNode(CILVariableNode('self'))]) self.functions.append(init_int) str_methods = [ - CILMethodNode('init_String', 'init_String'), + CILMethodNode('Init_String', 'Init_String'), CILMethodNode('abort', 'abort_Object'), CILMethodNode('type_name', 'type_name_Object'), CILMethodNode('copy', 'copy_Object'), @@ -106,28 +106,28 @@ def create_builtin_types(self): ] types.append(CILTypeNode('String', [CILAttributeNode('value', None)], str_methods)) init_string = CILFuncNode( - 'init_String', + 'Init_String', [CILParamNode('self', None), CILParamNode('v', None)], [], [CILSetAttributeNode(CILVariableNode('self'), 'String', CILVariableNode('value'), CILVariableNode('v')), CILReturnNode(CILVariableNode('self'))]) self.functions.append(init_string) bool_methods = [ - CILMethodNode('init_Bool', 'init_Bool'), + CILMethodNode('Init_Bool', 'Init_Bool'), CILMethodNode('abort', 'abort_Object'), CILMethodNode('type_name', 'type_name_Object'), CILMethodNode('copy', 'copy_Object'), ] types.append(CILTypeNode('Bool', [CILAttributeNode('value', None)], bool_methods)) init_bool = CILFuncNode( - 'init_Bool', + 'Init_Bool', [CILParamNode('self', None), CILParamNode('v', None)], [], [CILSetAttributeNode(CILVariableNode('self'), 'Bool', CILVariableNode('value'), CILVariableNode('v')), CILReturnNode(CILVariableNode('self'))]) self.functions.append(init_bool) io_methods = [ - CILMethodNode('init_IO', 'init_IO'), + CILMethodNode('Init_IO', 'Init_IO'), CILMethodNode('abort', 'abort_Object'), CILMethodNode('type_name', 'type_name_Object'), CILMethodNode('copy', 'copy_Object'), @@ -138,7 +138,7 @@ def create_builtin_types(self): ] types.append(CILTypeNode('IO', [], io_methods)) init_IO = CILFuncNode( - 'init_IO', + 'Init_IO', [CILParamNode('self', None)], [], [CILReturnNode(CILVariableNode('self'))]) @@ -150,9 +150,9 @@ def create_init_class(self, attributes, expresions, locals): type = self.context.get_type(self.current_class) instructions = [] if not isinstance(type.parent, ObjectType): - instructions.append(CILArgNode(CILVariableNode(f'self'))) - call = CILCallNode(f'init_{type.parent.name}') - instructions.append(CILAssignNode(CILVariableNode('self'), call)) + instructions.append(CILArgNode(CILVariableNode(f'self_{self.current_class}'))) + call = CILCallNode(f'Init_{type.parent.name}') + instructions.append(CILAssignNode(CILVariableNode(f'self_{self.current_class}'), call)) for attr, (expr, type, inst) in zip(attributes, expresions): @@ -163,11 +163,11 @@ def create_init_class(self, attributes, expresions, locals): else: variable = expr - instructions.append(CILSetAttributeNode(CILVariableNode('self'), self.current_class, CILVariableNode(attr), variable)) + instructions.append(CILSetAttributeNode(CILVariableNode(f'self_{self.current_class}'), self.current_class, CILVariableNode(attr), variable)) - instructions.append(CILReturnNode(CILVariableNode('self'))) + instructions.append(CILReturnNode(CILVariableNode(f'self_{self.current_class}'))) - return CILFuncNode(f'init_{self.current_class}', [CILParamNode('self', None)], locals, instructions) + return CILFuncNode(f'Init_{self.current_class}', [CILParamNode(f'self_{self.current_class}', None)], locals, instructions) diff --git a/src/cool.py b/src/cool.py index 5744e3215..d8994e296 100644 --- a/src/cool.py +++ b/src/cool.py @@ -48,21 +48,20 @@ cil_generator = CIL(context) cil = cil_generator.visit(ast) -#print(cil) +print(cil) cil_codegen = CILCodegen() code = cil_codegen.visit(cil) +with open(f'output.cil', 'w') as f: + f.write(code) + mips_scope_builder = MIPSScopeBuilder() -#print(cil) -print('---------------- CIL Code------------------') -print(code) -print('-----------------MIPS----------------------') scope = mips_scope_builder.visit(cil) #print(scope) mips_codegen = MIPSCodegen(scope) mips_codegen.visit(cil, None) #print(mips_codegen.code) -with open(f'output.cil', 'w') as f: - f.write(code) with open(f'output.out', 'w') as f: f.write(mips_codegen.code) +#with open(f'{input_file[:-3]}.mips', 'w') as f: +# f.write(mips_codegen.code) exit(0) diff --git a/src/output.cil b/src/output.cil index 2894213cc..8e6ae4fb9 100644 --- a/src/output.cil +++ b/src/output.cil @@ -1,8 +1,13 @@ .TYPES type Main { + attribute out; + attribute testee; + attribute divisor; + attribute stop; + attribute m; - method init : init_Main; + method Init_Main : Init_Main; method abort : abort_Object; method type_name : type_name_Object; method copy : copy_Object; @@ -15,7 +20,7 @@ type Main { type Object { - method init : init_Object; + method Init_Object : Init_Object; method abort : abort_Object; method type_name : type_name_Object; method copy : copy_Object; @@ -24,7 +29,7 @@ type Object { type Int { attribute value; - method init : init_Int; + method Init_Int : Init_Int; method abort : abort_Object; method type_name : type_name_Object; method copy : copy_Object; @@ -33,7 +38,7 @@ type Int { type String { attribute value; - method init : init_String; + method Init_String : Init_String; method abort : abort_Object; method type_name : type_name_Object; method copy : copy_Object; @@ -45,7 +50,7 @@ type String { type Bool { attribute value; - method init : init_Bool; + method Init_Bool : Init_Bool; method abort : abort_Object; method type_name : type_name_Object; method copy : copy_Object; @@ -53,7 +58,7 @@ type Bool { type IO { - method init : init_IO; + method Init_IO : Init_IO; method abort : abort_Object; method type_name : type_name_Object; method copy : copy_Object; @@ -66,6 +71,10 @@ type IO { .DATA +str_0 = "2 is trivially prime.\n"; +str_1 = " is prime.\n"; +str_2 = "continue"; +str_3 = "halt"; .CODE @@ -77,7 +86,7 @@ function main { m0 = ALLOCATE Main; ARG m0; - m1 = VCALL Main init; + m1 = VCALL Main Init_Main; ARG m1; m2 = VCALL Main main; RETURN m2; @@ -89,38 +98,181 @@ function main_Main { PARAM self_Main; LOCAL t_0; + + t_0 = 0; + RETURN t_0; + +} + + +function Init_Main { + PARAM self_Main; + LOCAL t_1; LOCAL t_2; LOCAL t_3; LOCAL t_4; LOCAL t_5; + LOCAL t_6; + LOCAL t_7; + LOCAL t_8; + LOCAL t_9; + LOCAL t_10; + LOCAL t_11; + LOCAL t_12; + LOCAL t_13; + LOCAL t_14; + LOCAL t_15; + LOCAL t_16; + LOCAL t_17; + LOCAL t_18; + LOCAL t_19; + LOCAL t_20; + LOCAL t_21; + LOCAL t_22; + LOCAL t_23; + LOCAL t_24; + LOCAL t_25; + LOCAL t_26; + LOCAL t_27; + LOCAL t_28; + LOCAL t_29; + LOCAL t_30; + LOCAL t_31; + LOCAL t_32; + LOCAL t_33; + LOCAL t_34; + LOCAL t_35; + LOCAL t_36; + LOCAL t_37; + LOCAL t_38; + LOCAL t_39; + LOCAL t_40; + LOCAL t_41; + LOCAL t_42; + LOCAL t_43; + LOCAL t_44; + LOCAL t_45; + LOCAL t_46; + LOCAL t_47; + LOCAL t_48; + LOCAL t_49; + LOCAL t_50; + LOCAL t_51; + LOCAL t_52; + LOCAL t_53; + LOCAL t_54; - t_0 = self_Main; - t_1 = t_0 == 0; - ARG t_1; - t_2 = VCALL Bool type_name; - t_3 = t_2; ARG self_Main; - ARG t_3; - t_4 = VCALL Main out_string; + self_Main = CALL Init_IO; + t_1 = LOAD str_0; + t_2 = t_1; + ARG self_Main; + ARG t_2; + t_3 = VCALL Main out_string; + SETATTR self_Main out 2; + t_55 = GETATTR self_Main out; + SETATTR self_Main testee t_55; + SETATTR self_Main stop 500; +while_0: + t_4 = 0 == 0; t_5 = t_4; - RETURN t_5; - -} - - -function init_Main { - PARAM self; - - - ARG self; - self = CALL init_IO; - RETURN self; + IF t_5 GOTO body_0; + GOTO pool_0; +body_0: + t_7 = GETATTR self_Main testee; + t_8 = t_7 + 1; + SETATTR self_Main testee t_8; + SETATTR self_Main divisor 2; +while_1: + t_9 = GETATTR self_Main divisor; + t_10 = GETATTR self_Main divisor; + t_11 = t_9 * t_10; + t_12 = GETATTR self_Main testee; + t_13 = t_12 < t_11; + t_14 = t_13; + IF t_14 GOTO then_0; + t_16 = GETATTR self_Main testee; + t_17 = GETATTR self_Main divisor; + t_18 = t_16 / t_17; + t_19 = GETATTR self_Main divisor; + t_20 = t_19 * t_18; + t_21 = GETATTR self_Main testee; + t_22 = t_21 - t_20; + t_23 = t_22 == 0; + t_24 = t_23; + IF t_24 GOTO then_1; + t_26 = 0 == 0; + t_25 = t_26; + GOTO ifend_1; +then_1: + t_27 = 0 == 1; + t_25 = t_27; +ifend_1: + t_15 = t_25; + GOTO ifend_0; +then_0: + t_28 = 0 == 1; + t_15 = t_28; +ifend_0: + t_29 = t_15; + IF t_29 GOTO body_1; + GOTO pool_1; +body_1: + t_31 = GETATTR self_Main divisor; + t_32 = t_31 + 1; + SETATTR self_Main divisor t_32; + t_30 = t_32; + GOTO while_1; +pool_1: + t_33 = GETATTR self_Main divisor; + t_34 = GETATTR self_Main divisor; + t_35 = t_33 * t_34; + t_36 = GETATTR self_Main testee; + t_37 = t_36 < t_35; + t_38 = t_37; + IF t_38 GOTO then_2; + t_39 = 0; + GOTO ifend_2; +then_2: + t_40 = GETATTR self_Main testee; + SETATTR self_Main out t_40; + t_41 = GETATTR self_Main out; + ARG self_Main; + ARG t_41; + t_42 = VCALL Main out_int; + t_43 = LOAD str_1; + t_44 = t_43; + ARG self_Main; + ARG t_44; + t_45 = VCALL Main out_string; + t_39 = t_45; +ifend_2: + t_46 = GETATTR self_Main stop; + t_47 = GETATTR self_Main testee; + t_48 = t_46 <= t_47; + t_49 = t_48; + IF t_49 GOTO then_3; + t_51 = LOAD str_2; + t_50 = t_51; + GOTO ifend_3; +then_3: + t_52 = LOAD str_3; + t_53 = t_52; + ARG t_53; + t_54 = VCALL String abort; + t_50 = t_54; +ifend_3: + t_6 = t_50; + GOTO while_0; +pool_0: + SETATTR self_Main m t_6; + RETURN self_Main; } -function init_Object { +function Init_Object { PARAM self; @@ -129,7 +281,7 @@ function init_Object { } -function init_Int { +function Init_Int { PARAM self; PARAM v; @@ -140,7 +292,7 @@ function init_Int { } -function init_String { +function Init_String { PARAM self; PARAM v; @@ -151,7 +303,7 @@ function init_String { } -function init_Bool { +function Init_Bool { PARAM self; PARAM v; @@ -162,7 +314,7 @@ function init_Bool { } -function init_IO { +function Init_IO { PARAM self; diff --git a/src/program.cl b/src/program.cl index 4774ec308..ea9533298 100644 --- a/src/program.cl +++ b/src/program.cl @@ -1,7 +1,84 @@ + +(* + * methodless-primes.cl + * + * Designed by Jesse H. Willett, jhw@cory, 11103234, with + * Istvan Siposs, isiposs@cory, 12342921. + * + * This program generates primes in order without using any methods. + * Actually, it does use three methods: those of IO to print out each + * prime, and abort() to halt the program. These methods are incidental, + * however, to the information-processing functionality of the program. We + * could regard the attribute 'out's sequential values as our output, and + * the string "halt" as our terminate signal. + * + * Naturally, using Cool this way is a real waste, basically reducing it + * to assembly without the benefit of compilation. + * + * There could even be a subroutine-like construction, in that different + * code could be in the assign fields of attributes of other classes, + * and it could be executed by calling 'new Sub', but no parameters + * could be passed to the subroutine, and it could only return itself. + * but returning itself would be useless since we couldn't call methods + * and the only operators we have are for Int and Bool, which do nothing + * interesting when we initialize them! + *) + class Main inherits IO { - main() : IO { - { - out_string((isvoid self).type_name()); -- demonstrates the dispatch rules. - } + + main() : Int { -- main() is an atrophied method so we can parse. + 0 + }; + + out : Int <- -- out is our 'output'. Its values are the primes. + { + out_string("2 is trivially prime.\n"); + 2; }; -}; + + testee : Int <- out; -- testee is a number to be tested for primeness. + + divisor : Int; -- divisor is a number which may factor testee. + + stop : Int <- 500; -- stop is an arbitrary value limiting testee. + + m : Object <- -- m supplants the main method. + while true loop + { + + testee <- testee + 1; + divisor <- 2; + + while + if testee < divisor * divisor + then false -- can stop if divisor > sqrt(testee). + else if testee - divisor*(testee/divisor) = 0 + then false -- can stop if divisor divides testee. + else true + fi fi + loop + divisor <- divisor + 1 + pool; + + if testee < divisor * divisor -- which reason did we stop for? + then -- testee has no factors less than sqrt(testee). + { + out <- testee; -- we could think of out itself as the output. + out_int(out); + out_string(" is prime.\n"); + } + else -- the loop halted on testee/divisor = 0, testee isn't prime. + 0 -- testee isn't prime, do nothing. + fi; + + if stop <= testee then + "halt".abort() -- we could think of "halt" as SIGTERM. + else + "continue" + fi; + + } + pool; + +}; (* end of Main *) + diff --git a/src/result.s b/src/result.s index e69de29bb..d42924307 100644 --- a/src/result.s +++ b/src/result.s @@ -0,0 +1,2088 @@ + .data +_List: .asciiz "List" + .data + .align 4 +List: .word 4 _List Init_List abort_Object type_name_Object copy_Object isNil_List head_List tail_List cons_List + + .data +_Cons: .asciiz "Cons" + .data + .align 4 +Cons: .word 12 _Cons Init_Cons abort_Object type_name_Object copy_Object isNil_Cons head_Cons tail_Cons cons_List init_Cons + + .data +_Main: .asciiz "Main" + .data + .align 4 +Main: .word 8 _Main Init_Main abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO print_list_Main main_Main + + .data +_Object: .asciiz "Object" + .data + .align 4 +Object: .word 4 _Object Init_Object abort_Object type_name_Object copy_Object + + .data +_Int: .asciiz "Int" + .data + .align 4 +Int: .word 8 _Int Init_Int abort_Object type_name_Object copy_Object + + .data +_String: .asciiz "String" + .data + .align 4 +String: .word 8 _String Init_String abort_Object type_name_Object copy_Object length_String concat_String substr_String + + .data +_Bool: .asciiz "Bool" + .data + .align 4 +Bool: .word 8 _Bool Init_Bool abort_Object type_name_Object copy_Object + + .data +_IO: .asciiz "IO" + .data + .align 4 +IO: .word 4 _IO Init_IO abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO + + .data +ObjectAbortMessage : .asciiz "Abort called from class " + .data +IO_Buffer : .space 1001 + .data +str_0: .asciiz " " + + .data +str_1: .asciiz "\n" + + .text +main: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 12 + + # assign (add here the expr.to_string) to m0 + li $a0, 8 + li $v0, 9 + syscall + la $a0, Main + sw $a0, 0($v0) + sw $v0, -0($fp) + + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to m1 + # calling the method Init_Main of type Main + #load the variable m0 + lw $v0, -0($fp) + lw $v0, 0($v0) + lw $v1, 8($v0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -4($fp) + + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to m2 + # calling the method main of type Main + #load the variable m1 + lw $v0, -4($fp) + lw $v0, 0($v0) + lw $v1, 44($v0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -8($fp) + + # return the value of the function in the register $v0 + #load the variable m2 + lw $v0, -8($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 12 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + li $v0, 10 + syscall + + .text +isNil_List: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 8 + + # assign (add here the expr.to_string) to t_0 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_1 + #load the variable t_0 + lw $v0, -0($fp) + sw $v0, -4($fp) + + # return the value of the function in the register $v0 + #load the variable t_1 + lw $v0, -4($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 8 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +head_List: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 8 + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_2 + # calling the method abort of type List + #load the variable self_List + lw $v0, 12($fp) + lw $v0, 0($v0) + lw $v1, 12($v0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_3 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -4($fp) + + # return the value of the function in the register $v0 + #load the variable t_3 + lw $v0, -4($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 8 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +tail_List: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 8 + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_4 + # calling the method abort of type List + #load the variable self_List + lw $v0, 12($fp) + lw $v0, 0($v0) + lw $v1, 12($v0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_5 + #load the variable self_List + lw $v0, 12($fp) + sw $v0, -4($fp) + + # return the value of the function in the register $v0 + #load the variable t_5 + lw $v0, -4($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 8 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +cons_List: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 28 + + # assign (add here the expr.to_string) to t_7 + li $a0, 12 + li $v0, 9 + syscall + la $a0, Cons + sw $a0, 0($v0) + sw $v0, -0($fp) + + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_8 + # calling the method Init_Cons of type Cons + #load the variable t_7 + lw $v0, -0($fp) + lw $v0, 0($v0) + lw $v1, 8($v0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_9 + #load the variable t_8 + lw $v0, -4($fp) + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_10 + #load the variable i_6 + lw $v0, 12($fp) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_11 + #load the variable self_List + lw $v0, 16($fp) + sw $v0, -16($fp) + + lw $v0, -8($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_12 + # calling the method init of type Cons + #load the variable t_9 + lw $v0, -8($fp) + lw $v0, 0($v0) + lw $v1, 40($v0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_13 + #load the variable t_12 + lw $v0, -20($fp) + sw $v0, -24($fp) + + # return the value of the function in the register $v0 + #load the variable t_13 + lw $v0, -24($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 28 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_List: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 0 + + # return the value of the function in the register $v0 + #load the variable self + lw $v0, 12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 0 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +isNil_Cons: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 8 + + # assign (add here the expr.to_string) to t_14 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_15 + #load the variable t_14 + lw $v0, -0($fp) + sw $v0, -4($fp) + + # return the value of the function in the register $v0 + #load the variable t_15 + lw $v0, -4($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 8 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +head_Cons: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 4 + + # assign (add here the expr.to_string) to t_16 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -0($fp) + + # return the value of the function in the register $v0 + #load the variable t_16 + lw $v0, -0($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 4 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +tail_Cons: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 4 + + # assign (add here the expr.to_string) to t_17 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -0($fp) + + # return the value of the function in the register $v0 + #load the variable t_17 + lw $v0, -0($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 4 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +init_Cons: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 4 + + # Setting value of the attribute car in the instance self_Cons to i_18 + #load the variable i_18 + lw $v0, 16($fp) + move $s2, $v0 + lw $v1, 20($fp) + sw $s2, 4($v1) + + # Setting value of the attribute cdr in the instance self_Cons to rest_19 + #load the variable rest_19 + lw $v0, 12($fp) + move $s2, $v0 + lw $v1, 20($fp) + sw $s2, 8($v1) + + # assign (add here the expr.to_string) to t_20 + #load the variable self_Cons + lw $v0, 20($fp) + sw $v0, -0($fp) + + # return the value of the function in the register $v0 + #load the variable t_20 + lw $v0, -0($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 4 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_Cons: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 0 + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to self + jal Init_List + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, 12($fp) + + # return the value of the function in the register $v0 + #load the variable self + lw $v0, 12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 0 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +print_list_Main: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 76 + + # assign (add here the expr.to_string) to t_22 + #load the variable l_21 + lw $v0, 12($fp) + sw $v0, -0($fp) + + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_23 + # calling the method isNil of type List + #load the variable t_22 + lw $v0, -0($fp) + lw $v0, 0($v0) + lw $v1, 24($v0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_24 + #load the variable t_23 + lw $v0, -4($fp) + sw $v0, -8($fp) + + lw $t1, -8($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_0 + # assign (add here the expr.to_string) to t_26 + #load the variable l_21 + lw $v0, 12($fp) + sw $v0, -16($fp) + + lw $v0, -16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_27 + # calling the method head of type List + #load the variable t_26 + lw $v0, -16($fp) + lw $v0, 0($v0) + lw $v1, 28($v0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_28 + #load the variable t_27 + lw $v0, -20($fp) + sw $v0, -24($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -24($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_29 + # calling the method out_int of type Main + #load the variable self_Main + lw $v0, 16($fp) + lw $v0, 0($v0) + lw $v1, 28($v0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -28($fp) + + # assign (add here the expr.to_string) to t_30 + #load the string str_0 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_0 + sw $v1, 4($v0) + sw $v0, -32($fp) + + # assign (add here the expr.to_string) to t_31 + #load the variable t_30 + lw $v0, -32($fp) + sw $v0, -36($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -36($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_32 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 16($fp) + lw $v0, 0($v0) + lw $v1, 24($v0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -40($fp) + + # assign (add here the expr.to_string) to t_33 + #load the variable l_21 + lw $v0, 12($fp) + sw $v0, -44($fp) + + lw $v0, -44($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_34 + # calling the method tail of type List + #load the variable t_33 + lw $v0, -44($fp) + lw $v0, 0($v0) + lw $v1, 32($v0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -48($fp) + + # assign (add here the expr.to_string) to t_35 + #load the variable t_34 + lw $v0, -48($fp) + sw $v0, -52($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -52($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_36 + # calling the method print_list of type Main + #load the variable self_Main + lw $v0, 16($fp) + lw $v0, 0($v0) + lw $v1, 40($v0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -56($fp) + + # assign (add here the expr.to_string) to t_25 + #load the variable t_36 + lw $v0, -56($fp) + sw $v0, -12($fp) + + j ifend_0 + then_0: + # assign (add here the expr.to_string) to t_37 + #load the string str_1 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_1 + sw $v1, 4($v0) + sw $v0, -60($fp) + + # assign (add here the expr.to_string) to t_38 + #load the variable t_37 + lw $v0, -60($fp) + sw $v0, -64($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -64($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_39 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 16($fp) + lw $v0, 0($v0) + lw $v1, 24($v0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -68($fp) + + # assign (add here the expr.to_string) to t_25 + #load the variable t_39 + lw $v0, -68($fp) + sw $v0, -12($fp) + + ifend_0: + # assign (add here the expr.to_string) to t_40 + #load the variable t_25 + lw $v0, -12($fp) + sw $v0, -72($fp) + + # return the value of the function in the register $v0 + #load the variable t_40 + lw $v0, -72($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 76 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +main_Main: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 112 + + # assign (add here the expr.to_string) to t_41 + li $a0, 4 + li $v0, 9 + syscall + la $a0, List + sw $a0, 0($v0) + sw $v0, -0($fp) + + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_42 + # calling the method Init_List of type List + #load the variable t_41 + lw $v0, -0($fp) + lw $v0, 0($v0) + lw $v1, 8($v0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_43 + #load the variable t_42 + lw $v0, -4($fp) + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_44 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -12($fp) + + lw $v0, -8($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_45 + # calling the method cons of type List + #load the variable t_43 + lw $v0, -8($fp) + lw $v0, 0($v0) + lw $v1, 36($v0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -16($fp) + + # assign (add here the expr.to_string) to t_46 + #load the variable t_45 + lw $v0, -16($fp) + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_47 + # Creating Int instance for atomic 2 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 2 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -24($fp) + + lw $v0, -20($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -24($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_48 + # calling the method cons of type List + #load the variable t_46 + lw $v0, -20($fp) + lw $v0, 0($v0) + lw $v1, 36($v0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -28($fp) + + # assign (add here the expr.to_string) to t_49 + #load the variable t_48 + lw $v0, -28($fp) + sw $v0, -32($fp) + + # assign (add here the expr.to_string) to t_50 + # Creating Int instance for atomic 3 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 3 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -36($fp) + + lw $v0, -32($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -36($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_51 + # calling the method cons of type List + #load the variable t_49 + lw $v0, -32($fp) + lw $v0, 0($v0) + lw $v1, 36($v0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -40($fp) + + # assign (add here the expr.to_string) to t_52 + #load the variable t_51 + lw $v0, -40($fp) + sw $v0, -44($fp) + + # assign (add here the expr.to_string) to t_53 + # Creating Int instance for atomic 4 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 4 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -48($fp) + + lw $v0, -44($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -48($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_54 + # calling the method cons of type List + #load the variable t_52 + lw $v0, -44($fp) + lw $v0, 0($v0) + lw $v1, 36($v0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -52($fp) + + # assign (add here the expr.to_string) to t_55 + #load the variable t_54 + lw $v0, -52($fp) + sw $v0, -56($fp) + + # assign (add here the expr.to_string) to t_56 + # Creating Int instance for atomic 5 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 5 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -60($fp) + + lw $v0, -56($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -60($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_57 + # calling the method cons of type List + #load the variable t_55 + lw $v0, -56($fp) + lw $v0, 0($v0) + lw $v1, 36($v0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -64($fp) + + # Setting value of the attribute mylist in the instance self_Main to t_57 + #load the variable t_57 + lw $v0, -64($fp) + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 4($v1) + + while_0: + # assign (add here the expr.to_string) to t_58 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -68($fp) + + lw $v0, -68($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_59 + # calling the method isNil of type List + #load the variable t_58 + lw $v0, -68($fp) + lw $v0, 0($v0) + lw $v1, 24($v0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -72($fp) + + # assign (add here the expr.to_string) to t_60 + #load the variable t_59 + lw $v0, -72($fp) + sw $v0, -76($fp) + + # assign (add here the expr.to_string) to t_61 + #load the variable t_60 + lw $v0, -76($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t0, 4($v0) + li $t1, 1 + xor $t0, $t0, $t1 + andi $t0, $t0, 0x01 + sw $t0, 4($v0) + sw $v0, -80($fp) + + # assign (add here the expr.to_string) to t_62 + #load the variable t_61 + lw $v0, -80($fp) + sw $v0, -84($fp) + + lw $t1, -84($fp) + lw $t0, 4($t1) + bne $t0, $zero, body_0 + j pool_0 + body_0: + # assign (add here the expr.to_string) to t_64 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -92($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -92($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_65 + # calling the method print_list of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $v0, 0($v0) + lw $v1, 40($v0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -96($fp) + + # assign (add here the expr.to_string) to t_66 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -100($fp) + + lw $v0, -100($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_67 + # calling the method tail of type List + #load the variable t_66 + lw $v0, -100($fp) + lw $v0, 0($v0) + lw $v1, 32($v0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -104($fp) + + # Setting value of the attribute mylist in the instance self_Main to t_67 + #load the variable t_67 + lw $v0, -104($fp) + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 4($v1) + + # assign (add here the expr.to_string) to t_63 + #load the variable t_67 + lw $v0, -104($fp) + sw $v0, -88($fp) + + j while_0 + pool_0: + # assign (add here the expr.to_string) to t_68 + #load the variable t_63 + lw $v0, -88($fp) + sw $v0, -108($fp) + + # return the value of the function in the register $v0 + #load the variable t_68 + lw $v0, -108($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 112 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_Main: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 0 + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to self + jal Init_IO + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, 12($fp) + + # return the value of the function in the register $v0 + #load the variable self + lw $v0, 12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 0 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_Object: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 0 + + # return the value of the function in the register $v0 + #load the variable self + lw $v0, 12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 0 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_Int: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 0 + + # Setting value of the attribute value in the instance self to v + #load the variable v + lw $v0, 12($fp) + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 4($v1) + + # return the value of the function in the register $v0 + #load the variable self + lw $v0, 16($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 0 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_String: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 0 + + # Setting value of the attribute value in the instance self to v + #load the variable v + lw $v0, 12($fp) + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 4($v1) + + # return the value of the function in the register $v0 + #load the variable self + lw $v0, 16($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 0 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_Bool: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 0 + + # Setting value of the attribute value in the instance self to v + #load the variable v + lw $v0, 12($fp) + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 4($v1) + + # return the value of the function in the register $v0 + #load the variable self + lw $v0, 16($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 0 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_IO: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 0 + + # return the value of the function in the register $v0 + #load the variable self + lw $v0, 12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 0 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + +abort_Object: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + la $a0, ObjectAbortMessage + li $v0, 4 + syscall + + lw $t0, 12($fp) + lw $t0, 0($t0) + lw $t0, 4($t0) + + move $a0, $t0 + li $v0, 4 + syscall + + li $v0, 10 + syscall + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + + + + + + + + +out_string_IO: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + + lw $a1, 12($fp) # reference to string object + lw $a0, 4($a1) # get the address of the value of the string + li $v0, 4 + syscall + + lw $v0, 16($fp) + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + +out_int_IO: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + lw $v1, 12($fp) + lw $a0, 4($v1) + li $v0, 1 + syscall + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + +in_string_IO: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + # Read the string to the buffer + la $a0, IO_Buffer + li $a1, 1000 + li $v0, 8 + syscall + + # get the length of the string to allocate the memory + la $t0, IO_Buffer + sw $t0, 0($sp) + addi $sp, $sp, -4 + jal strlen + addi $sp, $sp, 4 + lw $t0, 0($sp) # the length is now in $v0 + + addi $v0, $v0, 1 + move $a0, $v0 + li $v0, 9 + syscall # in $v0 is the address of the value string + + la $t1, IO_Buffer # copy the string value from the buffer to the heap + move $t2, $v0 + in_string_IO_loop: + lb $t3, 0($t1) + sb $t3, 0($t2) + addi $t1, $t1, 1 + addi $t2, $t2, 1 + bgtz $t3, in_string_IO_loop + addi $t2, $t2, -2 + li $t3, 0 + sb $t3, 0($t2) + + move $t0, $v0 + + li $a0, 8 + li $v0, 9 + syscall + + la $t1, String + sw $t0, 4($v0) + sw $t1, 0($v0) + + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + + + + + + + + + + + + + +type_name_Object: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + lw $t7, 12($fp) # get the instance address + lw $t6, 0($t7) # get the type info address + lw $t5, 4($t6) # get the type name + + # create the String class instance to return + li $a0, 8 + li $v0, 9 + syscall + + la $t1, String + sw $t1, 0($v0) + sw $t5, 4($v0) + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + +substr_String: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + lw $t7, 20($fp) # get the String instance address + lw $t0, 4($t7) # get the value of the source String + + lw $t7, 16($fp) # get the start parameter Int instance address + lw $t1, 4($t7) # get the value of the Int + + lw $t7, 12($fp) # get the length perameter Int instance address + lw $t2, 4($t7) # get the value of the Int + + move $a0, $t2 + li $v0, 9 + syscall # allocate memory for the substring value + + + li $t3, 0 # current pos in the string + + substr_String_loop1: + beq $t3, $t1, substr_String_eloop1 # if the current pos == start pos break + # else move the current pos + addi $t0, $t0, 1 + addi $t3, $t3, 1 + j substr_String_loop1 + + substr_String_eloop1: + + li $t3, 0 + move $t4, $v0 # move the substring address to $t4 + + substr_String_loop2: + beq $t3, $t2, substr_String_eloop2 + lb $t7, 0($t0) + sb $t7, 0($t4) + addi $t0, $t0, 1 + addi $t4, $t4, 1 + addi $t3, $t3, 1 + j substr_String_loop2 + + substr_String_eloop2: + + move $t0, $v0 + la $t1, String + + li $a0, 8 + li $v0, 9 + syscall + + sw $t1, 0($v0) + sw $t0, 4($v0) + + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + + +isvoid: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + lw $t0, 12($fp) + li $t1, 0 + beq $t0, $t1, isvoid_end + li $t0, 1 + isvoid_end: + + li $a0, 8 + li $v0, 9 + syscall + + la $t1, Bool + sw $t1, 0($v0) + sw $t0, 4($v0) + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + +# function to get the length of a string value +strlen: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + + lw $a0, 12($fp) + li $t0, 0 +strlen_loop: + lb $t1, 0($a0) + beqz $t1, strlen_exit + addu $a0, $a0, 1 + addu $t0, $t0, 1 + j strlen_loop + strlen_exit: + move $v0, $t0 + + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + + +length_String: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + lw $v0, 12($fp) # get the string instance address + lw $v1, 4($v0) # get the string value address + + # push the instace in the stack + sw $v1, 0($sp) + addi $sp, $sp, -4 + + jal strlen # length at v0 + + addi $sp, $sp, 4 + lw $t0, 0($sp) + + + move $t0, $v0 + + # allocate space for the Int instace + li $a0, 8 + li $v0, 9 + syscall + + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + + +compare: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + lw $t0, 12($fp) + lw $t1, 16($fp) + + lw $t3, 0($t0) + + la $t4, Int + beq $t3, $t4, compare_branch1 + + la $t4, Bool + beq $t3, $t4, compare_branch1 + + la $t4, String + beq $t3, $t4, compare_branch2 + + j compare_values + + compare_branch1: + lw $t0, 4($t0) + lw $t1, 4($t1) + + compare_values: + beq $t0, $t1, compare_true + j compare_false + + + compare_branch2: + lw $t0, 4($t0) + lw $t1, 4($t1) + compare_str_loop: + lb $t3, 0($t0) + lb $t4, 0($t1) + bne $t3, $t4, compare_false + beq $t3, $zero, compare_true + addi $t0, $t0, 1 + addi $t1, $t1, 1 + j compare_str_loop + + compare_true: + li $t0, 1 + j compare_end + + compare_false: + li $t0, 0 + + compare_end: + + li $a0, 8 + li $v0, 9 + syscall + la $t1, Bool + sw $t1, 0($v0) + sw $t0, 4($v0) + + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + + + + + + + + + + + + + From 9f2186ae13d905d2816f59275d3cecb79b5dbbeb Mon Sep 17 00:00:00 2001 From: Amy Date: Sun, 27 Feb 2022 08:21:30 -0500 Subject: [PATCH 53/81] fix VariableNode in CIL ASt --- src/code_generator/generate_ast.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 8f19503f0..0790c616c 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -359,7 +359,7 @@ def visit(self, node): @visitor.when(IsVoidNode) def visit(self, node): expr = self.visit(node.expr) - name = self.scope.add_new_local(node.computed_type) + name = self.scope.add_new_local(node.computed_type.name) self.scope.instructions.append(CILAssignNode(CILVariableNode(name), expr)) self.scope.instructions.append(CILArgNode(CILVariableNode(name))) name = self.scope.add_new_local("Bool") @@ -379,7 +379,10 @@ def visit(self, node): if node.lex == 'self': return CILVariableNode(f'self_{self.scope.current_class}') else: - return CILGetAttribute(CILVariableNode(f'self_{self.scope.current_class}'), self.scope.current_class, CILVariableNode(node.lex)) + name = self.scope.add_new_local(node.computed_type.name) + self.scope.instructions.append(CILAssignNode(CILVariableNode(name),CILGetAttribute(CILVariableNode(f'self_{self.scope.current_class}'), self.scope.current_class, CILVariableNode(node.lex)))) + return CILVariableNode(name) + CILGetAttribute(CILVariableNode(f'self_{self.scope.current_class}'), self.scope.current_class, CILVariableNode(node.lex)) @visitor.when(TrueNode) def visit(self, node): From 1c5db00c6f1c3dde8a027c6ece9fc53df43ea283 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karla=20Olivera=20Hern=C3=A1ndez?= Date: Sun, 27 Feb 2022 13:10:44 -0500 Subject: [PATCH 54/81] Fix error in AssignNode visitor --- src/code_generator/ast_CIL.py | 2 +- src/code_generator/generate_ast.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/code_generator/ast_CIL.py b/src/code_generator/ast_CIL.py index ab74d0868..afc91b228 100644 --- a/src/code_generator/ast_CIL.py +++ b/src/code_generator/ast_CIL.py @@ -270,7 +270,7 @@ def __str__(self): class CILVCallNode(CILExpressionNode): - def __init__(self, type, func): + def __init__(self, type, func): self.type = type self.func = func diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 8f19503f0..9b6208977 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -282,7 +282,7 @@ def visit(self, node): variable = CILVariableNode(self.scope.add_new_local(node.expr.computed_type.name)) self.scope.instructions.append(CILAssignNode(variable, var)) else: - variable = CILVariableNode(var.lex) + variable = var local = self.scope.find_local(node.id.lex) From 1d106bbd47eed2906bda5426841bff45ea897923 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karla=20Olivera=20Hern=C3=A1ndez?= Date: Sun, 27 Feb 2022 14:35:28 -0500 Subject: [PATCH 55/81] Fix the label of the last case case --- src/code_generator/generate_ast.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index ca7814d51..c3b91a31a 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -245,7 +245,7 @@ def visit(self, node): name_return = self.scope.add_new_local(node.computed_type.name) return_ = CILVariableNode(name_return) - for case, index in zip(node.cases,range(0,len(node.cases))): + for case, index in zip(node.cases,range(0, len(node.cases))): if index != 0: self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index-1}')) @@ -253,13 +253,16 @@ def visit(self, node): name_var_condition = self.scope.add_new_local(None) var_condition = CILVariableNode(name_var_condition) self.scope.instructions.append(CILAssignNode(var_condition, CILNotEqualsNode(CILVariableNode(name_type_expr),case_expr_type_of))) - self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'branch_{self.scope.case_count}_{index}'))) - + if index == len(node.cases) - 1: + self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'case_end{self.scope.case_count}'))) + else: + self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'branch_{self.scope.case_count}_{index}'))) + expr_attr = self.visit(case) self.scope.instructions.append(CILAssignNode(return_, expr_attr)) - self.scope.instructions.append(CILGotoNode(CILLabelNode(f'case_end{self.scope.case_count}'))) + self.scope.instructions.append(CILLabelNode(f'case_end{ self.scope.case_count}')) self.scope.case_count += 1 return return_ @@ -382,7 +385,6 @@ def visit(self, node): name = self.scope.add_new_local(node.computed_type.name) self.scope.instructions.append(CILAssignNode(CILVariableNode(name),CILGetAttribute(CILVariableNode(f'self_{self.scope.current_class}'), self.scope.current_class, CILVariableNode(node.lex)))) return CILVariableNode(name) - CILGetAttribute(CILVariableNode(f'self_{self.scope.current_class}'), self.scope.current_class, CILVariableNode(node.lex)) @visitor.when(TrueNode) def visit(self, node): From 363bde28bd61cb26572c20afaf387a8074c958c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karla=20Olivera=20Hern=C3=A1ndez?= Date: Sun, 27 Feb 2022 18:42:53 -0500 Subject: [PATCH 56/81] Init basic types in let and attributes definitions when the expression is None --- src/code_generator/generate_ast.py | 39 ++++++++++++++++-------------- src/code_generator/utils.py | 33 ++++++++++++++++--------- 2 files changed, 43 insertions(+), 29 deletions(-) diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index c3b91a31a..d5ca3a341 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -31,6 +31,8 @@ def visit(self, node): instructions.append(CILReturnNode(CILVariableNode("m2"))) self.scope.functions.append(CILFuncNode('main', [], locals, instructions)) + self.scope.data.append(CILDataNode(f'str_empty', "")) + types_ts = get_ts(self.scope.context) infos = self.scope.infos = {} for type in types_ts: @@ -58,15 +60,16 @@ def visit(self, node): @visitor.when(ClassDeclarationNode) def visit(self, node): self.scope.current_class = node.id - att_aux = [] attributes = [] - expressions = [] + features = [] methods = [] locals = [] type_info = self.scope.infos[node.id] + for a in type_info.attrs: attributes.append(CILAttributeNode(a.name, a.type)) methods.append(CILMethodNode(f'Init_{node.id}', f'Init_{node.id}')) + for m in type_info.methods.keys(): methods.append(CILMethodNode(m, type_info.methods[m])) @@ -75,18 +78,20 @@ def visit(self, node): self.scope.locals = [{}] self.scope.all_locals = [] if isinstance(feature, AttrDeclarationNode): - if feature.expr is not None: + if feature.expr is not None: expr = self.visit(feature.expr) - expressions.append((expr, feature.expr.computed_type, self.scope.instructions.copy())) + features.append((feature.id, feature.type, expr, self.scope.instructions.copy())) self.scope.instructions = [] - att_aux.append(feature.id) locals.extend(self.scope.all_locals.copy()) + else: + expr = None + features.append((feature.id, feature.type, None, None)) else: function = self.visit(feature) self.scope.functions.append(function) - init_class = self.scope.create_init_class(att_aux, expressions, locals) + init_class = self.scope.create_init_class(features, locals) self.scope.functions.append(init_class) return CILTypeNode(node.id, attributes, methods) @@ -192,23 +197,21 @@ def visit(self, node): @visitor.when(VarDeclarationNode) def visit(self, node): name = self.scope.add_local(node.id, node.type) + if node.expr is not None: expr = self.visit(node.expr) - instruction = CILAssignNode(CILVariableNode(name), expr) - self.scope.instructions.append(instruction) elif isinstance(node.computed_type, IntType): - self.scope.instructions.append(CILArgNode(CILNumberNode(0))) - var = CILVariableNode(name) - self.scope.instructions.append(CILAssignNode(var, CILVCallNode('Int', 'Init_Int'))) + expr = CILNumberNode(0) elif isinstance(node.computed_type, BoolType): - self.scope.instructions.append(CILArgNode(CILNumberNode(0))) - var = CILVariableNode(name) - self.scope.instructions.append(CILAssignNode(var, CILVCallNode('Bool', 'Init_Bool'))) + expr = CILEqualsNode(CILNumberNode(0), CILNumberNode(1)) elif isinstance(node.computed_type, StringType): - self.scope.instructions.append(CILArgNode(CILNumberNode(0))) - var = CILVariableNode(name) - self.scope.instructions.append(CILAssignNode(var, CILVCallNode('String', 'Init_String'))) - + expr = CILLoadNode('str_empty') + else: + expr = None + + if expr is not None: + self.scope.instructions.append(CILAssignNode(CILVariableNode(name), expr)) + @visitor.when(LoopNode) def visit(self, node): count = self.scope.loop_count diff --git a/src/code_generator/utils.py b/src/code_generator/utils.py index c2166cc12..b714e41ad 100644 --- a/src/code_generator/utils.py +++ b/src/code_generator/utils.py @@ -1,4 +1,4 @@ -from cmp.semantic import ObjectType +from cmp.semantic import IntType, ObjectType, StringType, BoolType from .ast_CIL import * @@ -146,24 +146,35 @@ def create_builtin_types(self): return types - def create_init_class(self, attributes, expresions, locals): + def create_init_class(self, attributes, locals): type = self.context.get_type(self.current_class) instructions = [] if not isinstance(type.parent, ObjectType): instructions.append(CILArgNode(CILVariableNode(f'self_{self.current_class}'))) call = CILCallNode(f'Init_{type.parent.name}') instructions.append(CILAssignNode(CILVariableNode(f'self_{self.current_class}'), call)) - - for attr, (expr, type, inst) in zip(attributes, expresions): - instructions.extend(inst) - if not isinstance(expr, CILAtomicNode): + for id, type, expr, inst in attributes: + if expr is not None: + instructions.extend(inst) + if not isinstance(expr, CILAtomicNode): + variable = CILVariableNode(self.add_new_local(type)) + instructions.append(CILAssignNode(variable, expr)) + else: + variable = expr + elif type == 'Int': + variable = CILNumberNode(0) + elif type == 'String': variable = CILVariableNode(self.add_new_local(type)) - instructions.append(CILAssignNode(variable, expr)) - else: - variable = expr - - instructions.append(CILSetAttributeNode(CILVariableNode(f'self_{self.current_class}'), self.current_class, CILVariableNode(attr), variable)) + instructions.append(CILAssignNode(variable, CILLoadNode('str_empty'))) + elif type == 'Bool': + variable = CILVariableNode(self.add_new_local(type)) + instructions.append(CILAssignNode(variable, CILEqualsNode(CILNumberNode(0), CILNumberNode(1)))) + else: + variable = None + + if variable is not None: + instructions.append(CILSetAttributeNode(CILVariableNode(f'self_{self.current_class}'), self.current_class, CILVariableNode(id), variable)) instructions.append(CILReturnNode(CILVariableNode(f'self_{self.current_class}'))) From 085a49f8865f571de77be626dd397b3ebfc32116 Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Sun, 27 Feb 2022 21:05:27 -0500 Subject: [PATCH 57/81] Fix error with emtpy string declaration --- src/code_generator/generate_ast.py | 2 +- src/code_generator/mips_built_in.txt | 10 + src/code_generator/spim_visitor.py | 6 +- src/output.cil | 720 +++++++++-- src/program.cl | 190 +-- src/result.s | 1746 +++++++++++++++----------- 6 files changed, 1732 insertions(+), 942 deletions(-) diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index d5ca3a341..6a220719d 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -31,7 +31,7 @@ def visit(self, node): instructions.append(CILReturnNode(CILVariableNode("m2"))) self.scope.functions.append(CILFuncNode('main', [], locals, instructions)) - self.scope.data.append(CILDataNode(f'str_empty', "")) + self.scope.data.append(CILDataNode(f'str_empty', "\"\"")) types_ts = get_ts(self.scope.context) infos = self.scope.infos = {} diff --git a/src/code_generator/mips_built_in.txt b/src/code_generator/mips_built_in.txt index 5520965ef..54d97de40 100644 --- a/src/code_generator/mips_built_in.txt +++ b/src/code_generator/mips_built_in.txt @@ -442,6 +442,16 @@ compare: jr $ra +concat_String: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + + diff --git a/src/code_generator/spim_visitor.py b/src/code_generator/spim_visitor.py index 0148932c5..286675da9 100644 --- a/src/code_generator/spim_visitor.py +++ b/src/code_generator/spim_visitor.py @@ -233,8 +233,8 @@ def visit(self, node: CILTypeOfNode, frame): register1 = '$v1' var_addr = frame.get_addr(node.var.lex) # register0 points to the heap - self.add_line = ('lw {register1}, {var_addr}') - self.add_line = ('lw {register0}, {register1}') + self.add_line(f'lw $t1, {var_addr}') + self.add_line('lw $v0, 0($t1)') return register0 @visitor.when(CILCallNode) # I don't think this is necessary @@ -362,7 +362,7 @@ def visit(self, node: CILStarNode, frame): self.visit(node.right, frame) self.add_line(f'lw $t1, 4($v0)') self.gen_pop('$t0') - self.add_line(f'mul $t0, $t1') + self.add_line(f'mult $t0, $t1') self.add_line(f'mflo $t0') self.add_line(f'li $a0, 8') self.add_line(f'li $v0, 9') diff --git a/src/output.cil b/src/output.cil index 8e6ae4fb9..d189e76e9 100644 --- a/src/output.cil +++ b/src/output.cil @@ -1,13 +1,61 @@ .TYPES -type Main { - attribute out; - attribute testee; - attribute divisor; - attribute stop; - attribute m; +type Book { + attribute title; + attribute author; - method Init_Main : Init_Main; + method Init_Book : Init_Book; + method abort : abort_Object; + method type_name : type_name_Object; + method copy : copy_Object; + method out_string : out_string_IO; + method out_int : out_int_IO; + method in_string : in_string_IO; + method in_int : in_int_IO; + method initBook : initBook_Book; + method print : print_Book; +} + +type Article { + attribute title; + attribute author; + attribute per_title; + + method Init_Article : Init_Article; + method abort : abort_Object; + method type_name : type_name_Object; + method copy : copy_Object; + method out_string : out_string_IO; + method out_int : out_int_IO; + method in_string : in_string_IO; + method in_int : in_int_IO; + method initBook : initBook_Book; + method print : print_Article; + method initArticle : initArticle_Article; +} + +type BookList { + + method Init_BookList : Init_BookList; + method abort : abort_Object; + method type_name : type_name_Object; + method copy : copy_Object; + method out_string : out_string_IO; + method out_int : out_int_IO; + method in_string : in_string_IO; + method in_int : in_int_IO; + method isNil : isNil_BookList; + method cons : cons_BookList; + method car : car_BookList; + method cdr : cdr_BookList; + method print_list : print_list_BookList; +} + +type Cons { + attribute xcar; + attribute xcdr; + + method Init_Cons : Init_Cons; method abort : abort_Object; method type_name : type_name_Object; method copy : copy_Object; @@ -15,6 +63,38 @@ type Main { method out_int : out_int_IO; method in_string : in_string_IO; method in_int : in_int_IO; + method isNil : isNil_Cons; + method cons : cons_BookList; + method car : car_Cons; + method cdr : cdr_Cons; + method print_list : print_list_Cons; + method init : init_Cons; +} + +type Nil { + + method Init_Nil : Init_Nil; + method abort : abort_Object; + method type_name : type_name_Object; + method copy : copy_Object; + method out_string : out_string_IO; + method out_int : out_int_IO; + method in_string : in_string_IO; + method in_int : in_int_IO; + method isNil : isNil_Nil; + method cons : cons_BookList; + method car : car_BookList; + method cdr : cdr_BookList; + method print_list : print_list_Nil; +} + +type Main { + attribute books; + + method Init_Main : Init_Main; + method abort : abort_Object; + method type_name : type_name_Object; + method copy : copy_Object; method main : main_Main; } @@ -71,10 +151,20 @@ type IO { .DATA -str_0 = "2 is trivially prime.\n"; -str_1 = " is prime.\n"; -str_2 = "continue"; -str_3 = "halt"; +str_empty = ""; +str_0 = "title: "; +str_1 = "\n"; +str_2 = "author: "; +str_3 = "\n"; +str_4 = "periodical: "; +str_5 = "\n"; +str_6 = "- dynamic type was Book -\n"; +str_7 = "- dynamic type was Article -\n"; +str_8 = "Compilers, Principles, Techniques, and Tools"; +str_9 = "Aho, Sethi, and Ullman"; +str_10 = "The Top 100 CD_ROMs"; +str_11 = "Ulanoff"; +str_12 = "PC Magazine"; .CODE @@ -94,22 +184,24 @@ function main { } -function main_Main { - PARAM self_Main; +function initBook_Book { + PARAM self_Book; + PARAM title_p_0; + PARAM author_p_1; - LOCAL t_0; + LOCAL t_2; - t_0 = 0; - RETURN t_0; + SETATTR self_Book title title_p_0; + SETATTR self_Book author author_p_1; + t_2 = self_Book; + RETURN t_2; } -function Init_Main { - PARAM self_Main; +function print_Book { + PARAM self_Book; - LOCAL t_1; - LOCAL t_2; LOCAL t_3; LOCAL t_4; LOCAL t_5; @@ -135,13 +227,89 @@ function Init_Main { LOCAL t_25; LOCAL t_26; LOCAL t_27; - LOCAL t_28; - LOCAL t_29; - LOCAL t_30; + + t_3 = LOAD str_0; + t_4 = t_3; + ARG self_Book; + ARG t_4; + t_5 = VCALL Book out_string; + t_6 = t_5; + t_7 = GETATTR self_Book title; + t_8 = t_7; + ARG t_6; + ARG t_8; + t_9 = VCALL Book out_string; + t_10 = t_9; + t_11 = LOAD str_1; + t_12 = t_11; + ARG t_10; + ARG t_12; + t_13 = VCALL Book out_string; + t_14 = LOAD str_2; + t_15 = t_14; + ARG self_Book; + ARG t_15; + t_16 = VCALL Book out_string; + t_17 = t_16; + t_18 = GETATTR self_Book author; + t_19 = t_18; + ARG t_17; + ARG t_19; + t_20 = VCALL Book out_string; + t_21 = t_20; + t_22 = LOAD str_3; + t_23 = t_22; + ARG t_21; + ARG t_23; + t_24 = VCALL Book out_string; + t_25 = self_Book; + RETURN t_25; + +} + + +function Init_Book { + PARAM self_Book; + + + ARG self_Book; + self_Book = CALL Init_IO; + t_26 = LOAD str_empty; + SETATTR self_Book title t_26; + t_27 = LOAD str_empty; + SETATTR self_Book author t_27; + RETURN self_Book; + +} + + +function initArticle_Article { + PARAM self_Article; + PARAM title_p_28; + PARAM author_p_29; + PARAM per_title_p_30; + LOCAL t_31; LOCAL t_32; LOCAL t_33; LOCAL t_34; + + t_31 = title_p_28; + t_32 = author_p_29; + ARG self_Article; + ARG t_31; + ARG t_32; + t_33 = VCALL Article initBook; + SETATTR self_Article per_title per_title_p_30; + t_34 = self_Article; + RETURN t_34; + +} + + +function print_Article { + PARAM self_Article; + LOCAL t_35; LOCAL t_36; LOCAL t_37; @@ -156,117 +324,411 @@ function Init_Main { LOCAL t_46; LOCAL t_47; LOCAL t_48; + + ARG self_Article; + t_35 = VCALL Article print; + t_36 = LOAD str_4; + t_37 = t_36; + ARG self_Article; + ARG t_37; + t_38 = VCALL Article out_string; + t_39 = t_38; + t_40 = GETATTR self_Article per_title; + t_41 = t_40; + ARG t_39; + ARG t_41; + t_42 = VCALL Article out_string; + t_43 = t_42; + t_44 = LOAD str_5; + t_45 = t_44; + ARG t_43; + ARG t_45; + t_46 = VCALL Article out_string; + t_47 = self_Article; + RETURN t_47; + +} + + +function Init_Article { + PARAM self_Article; + + + ARG self_Article; + self_Article = CALL Init_Book; + t_48 = LOAD str_empty; + SETATTR self_Article per_title t_48; + RETURN self_Article; + +} + + +function isNil_BookList { + PARAM self_BookList; + LOCAL t_49; LOCAL t_50; LOCAL t_51; - LOCAL t_52; - LOCAL t_53; + + ARG self_BookList; + t_49 = VCALL BookList abort; + t_50 = 0 == 0; + t_51 = t_50; + RETURN t_51; + +} + + +function cons_BookList { + PARAM self_BookList; + PARAM hd_52; + + LOCAL new_cell_53; LOCAL t_54; + LOCAL t_55; + LOCAL t_56; + LOCAL t_57; + LOCAL t_58; + LOCAL t_59; + LOCAL t_60; + + t_54 = ALLOCATE Cons; + ARG t_54; + t_55 = VCALL Cons Init_Cons; + new_cell_53 = t_55; + t_56 = new_cell_53; + t_57 = hd_52; + t_58 = self_BookList; + ARG t_56; + ARG t_57; + ARG t_58; + t_59 = VCALL Cons init; + t_60 = t_59; + RETURN t_60; + +} + + +function car_BookList { + PARAM self_BookList; + + LOCAL t_61; + LOCAL t_62; + LOCAL t_63; + LOCAL t_64; + + ARG self_BookList; + t_61 = VCALL BookList abort; + t_62 = ALLOCATE Book; + ARG t_62; + t_63 = VCALL Book Init_Book; + t_64 = t_63; + RETURN t_64; + +} + + +function cdr_BookList { + PARAM self_BookList; + + LOCAL t_65; + LOCAL t_66; + LOCAL t_67; + LOCAL t_68; + + ARG self_BookList; + t_65 = VCALL BookList abort; + t_66 = ALLOCATE BookList; + ARG t_66; + t_67 = VCALL BookList Init_BookList; + t_68 = t_67; + RETURN t_68; + +} + + +function print_list_BookList { + PARAM self_BookList; + + LOCAL t_69; + LOCAL t_70; + + ARG self_BookList; + t_69 = VCALL BookList abort; + t_70 = t_69; + RETURN t_70; + +} + + +function Init_BookList { + PARAM self_BookList; + + + ARG self_BookList; + self_BookList = CALL Init_IO; + RETURN self_BookList; + +} + + +function isNil_Cons { + PARAM self_Cons; + + LOCAL t_71; + LOCAL t_72; + + t_71 = 0 == 1; + t_72 = t_71; + RETURN t_72; + +} + + +function init_Cons { + PARAM self_Cons; + PARAM hd_73; + PARAM tl_74; + + LOCAL t_75; + + SETATTR self_Cons xcar hd_73; + SETATTR self_Cons xcdr tl_74; + t_75 = self_Cons; + RETURN t_75; + +} + + +function car_Cons { + PARAM self_Cons; + + LOCAL t_76; + LOCAL t_77; + + t_76 = GETATTR self_Cons xcar; + t_77 = t_76; + RETURN t_77; + +} + + +function cdr_Cons { + PARAM self_Cons; + + LOCAL t_78; + LOCAL t_79; + + t_78 = GETATTR self_Cons xcdr; + t_79 = t_78; + RETURN t_79; + +} + + +function print_list_Cons { + PARAM self_Cons; + + LOCAL t_80; + LOCAL t_81; + LOCAL t_82; + LOCAL t_83; + LOCAL t_84; + LOCAL t_85; + LOCAL t_86; + LOCAL dummy_87; + LOCAL t_88; + LOCAL t_89; + LOCAL t_90; + LOCAL t_91; + LOCAL dummy_92; + LOCAL t_93; + LOCAL t_94; + LOCAL t_95; + LOCAL t_96; + LOCAL t_97; + LOCAL t_98; + LOCAL t_99; + + t_80 = GETATTR self_Cons xcar; + t_81 = t_80; + ARG t_81; + t_82 = VCALL Book print; + t_83 = t_82; + t_84 = TYPEOF t_83; + t_86 = t_84 != Book; + IF t_86 GOTO branch_0_0; + dummy_87 = t_82; + t_88 = LOAD str_6; + t_89 = t_88; + ARG self_Cons; + ARG t_89; + t_90 = VCALL Cons out_string; + t_85 = t_90; + GOTO case_end0; +branch_0_0: + t_91 = t_84 != Article; + IF t_91 GOTO case_end0; + dummy_92 = t_82; + t_93 = LOAD str_7; + t_94 = t_93; + ARG self_Cons; + ARG t_94; + t_95 = VCALL Cons out_string; + t_85 = t_95; + GOTO case_end0; +case_end0: + t_96 = GETATTR self_Cons xcdr; + t_97 = t_96; + ARG t_97; + t_98 = VCALL BookList print_list; + t_99 = t_98; + RETURN t_99; + +} + + +function Init_Cons { + PARAM self_Cons; + + + ARG self_Cons; + self_Cons = CALL Init_BookList; + RETURN self_Cons; + +} + + +function isNil_Nil { + PARAM self_Nil; + + LOCAL t_100; + LOCAL t_101; + + t_100 = 0 == 0; + t_101 = t_100; + RETURN t_101; + +} + + +function print_list_Nil { + PARAM self_Nil; + + LOCAL t_102; + LOCAL t_103; + + t_102 = 0 == 0; + t_103 = t_102; + RETURN t_103; + +} + + +function Init_Nil { + PARAM self_Nil; + + + ARG self_Nil; + self_Nil = CALL Init_BookList; + RETURN self_Nil; + +} + + +function main_Main { + PARAM self_Main; + + LOCAL a_book_104; + LOCAL t_105; + LOCAL t_106; + LOCAL t_107; + LOCAL t_108; + LOCAL t_109; + LOCAL t_110; + LOCAL t_111; + LOCAL t_112; + LOCAL an_article_113; + LOCAL t_114; + LOCAL t_115; + LOCAL t_116; + LOCAL t_117; + LOCAL t_118; + LOCAL t_119; + LOCAL t_120; + LOCAL t_121; + LOCAL t_122; + LOCAL t_123; + LOCAL t_124; + LOCAL t_125; + LOCAL t_126; + LOCAL t_127; + LOCAL t_128; + LOCAL t_129; + LOCAL t_130; + LOCAL t_131; + LOCAL t_132; + LOCAL t_133; + LOCAL t_134; + LOCAL t_135; + + t_105 = ALLOCATE Book; + ARG t_105; + t_106 = VCALL Book Init_Book; + t_107 = t_106; + t_108 = LOAD str_8; + t_109 = t_108; + t_110 = LOAD str_9; + t_111 = t_110; + ARG t_107; + ARG t_109; + ARG t_111; + t_112 = VCALL Book initBook; + a_book_104 = t_112; + t_114 = ALLOCATE Article; + ARG t_114; + t_115 = VCALL Article Init_Article; + t_116 = t_115; + t_117 = LOAD str_10; + t_118 = t_117; + t_119 = LOAD str_11; + t_120 = t_119; + t_121 = LOAD str_12; + t_122 = t_121; + ARG t_116; + ARG t_118; + ARG t_120; + ARG t_122; + t_123 = VCALL Article initArticle; + an_article_113 = t_123; + t_124 = ALLOCATE Nil; + ARG t_124; + t_125 = VCALL Nil Init_Nil; + t_126 = t_125; + t_127 = a_book_104; + ARG t_126; + ARG t_127; + t_128 = VCALL Nil cons; + t_129 = t_128; + t_130 = an_article_113; + ARG t_129; + ARG t_130; + t_131 = VCALL Cons cons; + SETATTR self_Main books t_131; + t_132 = GETATTR self_Main books; + t_133 = t_132; + ARG t_133; + t_134 = VCALL BookList print_list; + t_135 = t_134; + RETURN t_135; + +} + + +function Init_Main { + PARAM self_Main; + - ARG self_Main; - self_Main = CALL Init_IO; - t_1 = LOAD str_0; - t_2 = t_1; - ARG self_Main; - ARG t_2; - t_3 = VCALL Main out_string; - SETATTR self_Main out 2; - t_55 = GETATTR self_Main out; - SETATTR self_Main testee t_55; - SETATTR self_Main stop 500; -while_0: - t_4 = 0 == 0; - t_5 = t_4; - IF t_5 GOTO body_0; - GOTO pool_0; -body_0: - t_7 = GETATTR self_Main testee; - t_8 = t_7 + 1; - SETATTR self_Main testee t_8; - SETATTR self_Main divisor 2; -while_1: - t_9 = GETATTR self_Main divisor; - t_10 = GETATTR self_Main divisor; - t_11 = t_9 * t_10; - t_12 = GETATTR self_Main testee; - t_13 = t_12 < t_11; - t_14 = t_13; - IF t_14 GOTO then_0; - t_16 = GETATTR self_Main testee; - t_17 = GETATTR self_Main divisor; - t_18 = t_16 / t_17; - t_19 = GETATTR self_Main divisor; - t_20 = t_19 * t_18; - t_21 = GETATTR self_Main testee; - t_22 = t_21 - t_20; - t_23 = t_22 == 0; - t_24 = t_23; - IF t_24 GOTO then_1; - t_26 = 0 == 0; - t_25 = t_26; - GOTO ifend_1; -then_1: - t_27 = 0 == 1; - t_25 = t_27; -ifend_1: - t_15 = t_25; - GOTO ifend_0; -then_0: - t_28 = 0 == 1; - t_15 = t_28; -ifend_0: - t_29 = t_15; - IF t_29 GOTO body_1; - GOTO pool_1; -body_1: - t_31 = GETATTR self_Main divisor; - t_32 = t_31 + 1; - SETATTR self_Main divisor t_32; - t_30 = t_32; - GOTO while_1; -pool_1: - t_33 = GETATTR self_Main divisor; - t_34 = GETATTR self_Main divisor; - t_35 = t_33 * t_34; - t_36 = GETATTR self_Main testee; - t_37 = t_36 < t_35; - t_38 = t_37; - IF t_38 GOTO then_2; - t_39 = 0; - GOTO ifend_2; -then_2: - t_40 = GETATTR self_Main testee; - SETATTR self_Main out t_40; - t_41 = GETATTR self_Main out; - ARG self_Main; - ARG t_41; - t_42 = VCALL Main out_int; - t_43 = LOAD str_1; - t_44 = t_43; - ARG self_Main; - ARG t_44; - t_45 = VCALL Main out_string; - t_39 = t_45; -ifend_2: - t_46 = GETATTR self_Main stop; - t_47 = GETATTR self_Main testee; - t_48 = t_46 <= t_47; - t_49 = t_48; - IF t_49 GOTO then_3; - t_51 = LOAD str_2; - t_50 = t_51; - GOTO ifend_3; -then_3: - t_52 = LOAD str_3; - t_53 = t_52; - ARG t_53; - t_54 = VCALL String abort; - t_50 = t_54; -ifend_3: - t_6 = t_50; - GOTO while_0; -pool_0: - SETATTR self_Main m t_6; RETURN self_Main; } diff --git a/src/program.cl b/src/program.cl index ea9533298..025ea1695 100644 --- a/src/program.cl +++ b/src/program.cl @@ -1,84 +1,132 @@ +-- example of static and dynamic type differing for a dispatch -(* - * methodless-primes.cl - * - * Designed by Jesse H. Willett, jhw@cory, 11103234, with - * Istvan Siposs, isiposs@cory, 12342921. - * - * This program generates primes in order without using any methods. - * Actually, it does use three methods: those of IO to print out each - * prime, and abort() to halt the program. These methods are incidental, - * however, to the information-processing functionality of the program. We - * could regard the attribute 'out's sequential values as our output, and - * the string "halt" as our terminate signal. - * - * Naturally, using Cool this way is a real waste, basically reducing it - * to assembly without the benefit of compilation. - * - * There could even be a subroutine-like construction, in that different - * code could be in the assign fields of attributes of other classes, - * and it could be executed by calling 'new Sub', but no parameters - * could be passed to the subroutine, and it could only return itself. - * but returning itself would be useless since we couldn't call methods - * and the only operators we have are for Int and Bool, which do nothing - * interesting when we initialize them! - *) - -class Main inherits IO { - - main() : Int { -- main() is an atrophied method so we can parse. - 0 - }; - - out : Int <- -- out is our 'output'. Its values are the primes. - { - out_string("2 is trivially prime.\n"); - 2; +Class Book inherits IO { + title : String; + author : String; + + initBook(title_p : String, author_p : String) : Book { + { + title <- title_p; + author <- author_p; + self; + } + }; + + print() : Book { + { + out_string("title: ").out_string(title).out_string("\n"); + out_string("author: ").out_string(author).out_string("\n"); + self; + } + }; +}; + +Class Article inherits Book { + per_title : String; + + initArticle(title_p : String, author_p : String, + per_title_p : String) : Article { + { + initBook(title_p, author_p); + per_title <- per_title_p; + self; + } }; - testee : Int <- out; -- testee is a number to be tested for primeness. + print() : Book { + { + self@Book.print(); + out_string("periodical: ").out_string(per_title).out_string("\n"); + self; + } + }; +}; + +Class BookList inherits IO { + (* Since abort "returns" type Object, we have to add + an expression of type Bool here to satisfy the typechecker. + This code is unreachable, since abort() halts the program. + *) + isNil() : Bool { { abort(); true; } }; + + cons(hd : Book) : Cons { + (let new_cell : Cons <- new Cons in + new_cell.init(hd,self) + ) + }; - divisor : Int; -- divisor is a number which may factor testee. + (* Since abort "returns" type Object, we have to add + an expression of type Book here to satisfy the typechecker. + This code is unreachable, since abort() halts the program. + *) + car() : Book { { abort(); new Book; } }; + + (* Since abort "returns" type Object, we have to add + an expression of type BookList here to satisfy the typechecker. + This code is unreachable, since abort() halts the program. + *) + cdr() : BookList { { abort(); new BookList; } }; + + print_list() : Object { abort() }; +}; - stop : Int <- 500; -- stop is an arbitrary value limiting testee. +Class Cons inherits BookList { + xcar : Book; -- We keep the car and cdr in attributes. + xcdr : BookList; -- Because methods and features must have different names, + -- we use xcar and xcdr for the attributes and reserve + -- car and cdr for the features. + + isNil() : Bool { false }; + + init(hd : Book, tl : BookList) : Cons { + { + xcar <- hd; + xcdr <- tl; + self; + } + }; - m : Object <- -- m supplants the main method. - while true loop - { + car() : Book { xcar }; - testee <- testee + 1; - divisor <- 2; + cdr() : BookList { xcdr }; + + print_list() : Object { + { + case xcar.print() of + dummy : Book => out_string("- dynamic type was Book -\n"); + dummy : Article => out_string("- dynamic type was Article -\n"); + esac; + xcdr.print_list(); + } + }; +}; - while - if testee < divisor * divisor - then false -- can stop if divisor > sqrt(testee). - else if testee - divisor*(testee/divisor) = 0 - then false -- can stop if divisor divides testee. - else true - fi fi - loop - divisor <- divisor + 1 - pool; +Class Nil inherits BookList { + isNil() : Bool { true }; - if testee < divisor * divisor -- which reason did we stop for? - then -- testee has no factors less than sqrt(testee). - { - out <- testee; -- we could think of out itself as the output. - out_int(out); - out_string(" is prime.\n"); - } - else -- the loop halted on testee/divisor = 0, testee isn't prime. - 0 -- testee isn't prime, do nothing. - fi; + print_list() : Object { true }; +}; - if stop <= testee then - "halt".abort() -- we could think of "halt" as SIGTERM. - else - "continue" - fi; - } - pool; +Class Main { -}; (* end of Main *) + books : BookList; + main() : Object { + (let a_book : Book <- + (new Book).initBook("Compilers, Principles, Techniques, and Tools", + "Aho, Sethi, and Ullman") + in + (let an_article : Article <- + (new Article).initArticle("The Top 100 CD_ROMs", + "Ulanoff", + "PC Magazine") + in + { + books <- (new Nil).cons(a_book).cons(an_article); + books.print_list(); + } + ) -- end let an_article + ) -- end let a_book + }; +}; diff --git a/src/result.s b/src/result.s index d42924307..7138e7241 100644 --- a/src/result.s +++ b/src/result.s @@ -1,20 +1,14 @@ .data -_List: .asciiz "List" - .data - .align 4 -List: .word 4 _List Init_List abort_Object type_name_Object copy_Object isNil_List head_List tail_List cons_List - - .data -_Cons: .asciiz "Cons" +_Main: .asciiz "Main" .data .align 4 -Cons: .word 12 _Cons Init_Cons abort_Object type_name_Object copy_Object isNil_Cons head_Cons tail_Cons cons_List init_Cons +Main: .word 4 _Main Init_Main abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO main_Main .data -_Main: .asciiz "Main" +_Complex: .asciiz "Complex" .data .align 4 -Main: .word 8 _Main Init_Main abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO print_list_Main main_Main +Complex: .word 12 _Complex Init_Complex abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO init_Complex print_Complex reflect_0_Complex reflect_X_Complex reflect_Y_Complex equal_Complex x_value_Complex y_value_Complex .data _Object: .asciiz "Object" @@ -51,10 +45,16 @@ ObjectAbortMessage : .asciiz "Abort called from class " .data IO_Buffer : .space 1001 .data -str_0: .asciiz " " +str_0: .asciiz "=(\n" + + .data +str_1: .asciiz "=)\n" .data -str_1: .asciiz "\n" +str_2: .asciiz "+" + + .data +str_3: .asciiz "I" .text main: @@ -72,7 +72,7 @@ main: subu $sp $sp 12 # assign (add here the expr.to_string) to m0 - li $a0, 8 + li $a0, 4 li $v0, 9 syscall la $a0, Main @@ -107,7 +107,7 @@ main: #load the variable m1 lw $v0, -4($fp) lw $v0, 0($v0) - lw $v1, 44($v0) + lw $v1, 40($v0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -134,7 +134,7 @@ main: syscall .text -isNil_List: +main_Main: # save the return address and frame pointer # push $ra to the stack sw $ra, 0($sp) @@ -146,396 +146,293 @@ isNil_List: # update the frame pointer and allocate the frame in the stack move $fp $sp - subu $sp $sp 8 - - # assign (add here the expr.to_string) to t_0 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) + subu $sp $sp 84 - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 0 - li $a0, 8 + # assign (add here the expr.to_string) to t_1 + li $a0, 12 li $v0, 9 syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_1 - #load the variable t_0 - lw $v0, -0($fp) + la $a0, Complex + sw $a0, 0($v0) sw $v0, -4($fp) - # return the value of the function in the register $v0 - #load the variable t_1 lw $v0, -4($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 8 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -head_List: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 8 - - lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 # assign (add here the expr.to_string) to t_2 - # calling the method abort of type List - #load the variable self_List - lw $v0, 12($fp) + # calling the method Init_Complex of type Complex + #load the variable t_1 + lw $v0, -4($fp) lw $v0, 0($v0) - lw $v1, 12($v0) + lw $v1, 8($v0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -0($fp) + sw $v0, -8($fp) # assign (add here the expr.to_string) to t_3 - # Creating Int instance for atomic 0 + #load the variable t_2 + lw $v0, -8($fp) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_4 + # Creating Int instance for atomic 1 li $a0, 8 li $v0, 9 syscall la $t0, Int - li $t1, 0 + li $t1, 1 sw $t0, 0($v0) sw $t1, 4($v0) - sw $v0, -4($fp) - - # return the value of the function in the register $v0 - #load the variable t_3 - lw $v0, -4($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 8 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) + sw $v0, -16($fp) - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) + # assign (add here the expr.to_string) to t_5 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) - jr $ra + sw $v0, -20($fp) - .text -tail_List: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) + lw $v0, -12($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # push $fp to the stack - sw $fp, 0($sp) + lw $v0, -16($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 8 - - lw $v0, 12($fp) + lw $v0, -20($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_4 - # calling the method abort of type List - #load the variable self_List - lw $v0, 12($fp) + # assign (add here the expr.to_string) to t_6 + # calling the method init of type Complex + #load the variable t_3 + lw $v0, -12($fp) lw $v0, 0($v0) - lw $v1, 12($v0) + lw $v1, 40($v0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_5 - #load the variable self_List - lw $v0, 12($fp) - sw $v0, -4($fp) - - # return the value of the function in the register $v0 - #load the variable t_5 - lw $v0, -4($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 8 - # pop the top of the stack to $fp + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $fp, 0($sp) + lw $v1, 0($sp) - # pop the top of the stack to $ra + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -cons_List: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 + lw $v1, 0($sp) - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 28 + sw $v0, -24($fp) - # assign (add here the expr.to_string) to t_7 - li $a0, 12 - li $v0, 9 - syscall - la $a0, Cons - sw $a0, 0($v0) + # assign (add here the expr.to_string) to c_0 + #load the variable t_6 + lw $v0, -24($fp) sw $v0, -0($fp) + # assign (add here the expr.to_string) to t_7 + #load the variable c_0 lw $v0, -0($fp) + sw $v0, -28($fp) + + lw $v0, -28($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 # assign (add here the expr.to_string) to t_8 - # calling the method Init_Cons of type Cons + # calling the method reflect_X of type Complex #load the variable t_7 - lw $v0, -0($fp) + lw $v0, -28($fp) lw $v0, 0($v0) - lw $v1, 8($v0) + lw $v1, 52($v0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -4($fp) + sw $v0, -32($fp) # assign (add here the expr.to_string) to t_9 - #load the variable t_8 - lw $v0, -4($fp) - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to t_10 - #load the variable i_6 - lw $v0, 12($fp) - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_11 - #load the variable self_List - lw $v0, 16($fp) - sw $v0, -16($fp) + #load the variable c_0 + lw $v0, -0($fp) + sw $v0, -36($fp) - lw $v0, -8($fp) + lw $v0, -36($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -12($fp) + # assign (add here the expr.to_string) to t_10 + # calling the method reflect_0 of type Complex + #load the variable t_9 + lw $v0, -36($fp) + lw $v0, 0($v0) + lw $v1, 48($v0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -40($fp) + + # assign (add here the expr.to_string) to t_11 + #load the variable t_8 + lw $v0, -32($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -16($fp) + #load the variable t_10 + lw $v0, -40($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_12 - # calling the method init of type Cons - #load the variable t_9 - lw $v0, -8($fp) - lw $v0, 0($v0) - lw $v1, 40($v0) - jal $v1 - # pop the top of the stack to $v1 + jal compare + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $v1, 0($sp) + lw $t0, 0($sp) - # pop the top of the stack to $v1 + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $v1, 0($sp) + lw $t0, 0($sp) - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) + sw $v0, -44($fp) - sw $v0, -20($fp) + # assign (add here the expr.to_string) to t_12 + #load the variable t_11 + lw $v0, -44($fp) + sw $v0, -48($fp) - # assign (add here the expr.to_string) to t_13 - #load the variable t_12 - lw $v0, -20($fp) - sw $v0, -24($fp) - - # return the value of the function in the register $v0 - #load the variable t_13 - lw $v0, -24($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 28 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) + lw $t1, -48($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_0 + # assign (add here the expr.to_string) to t_14 + #load the string str_0 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_0 + sw $v1, 4($v0) + sw $v0, -56($fp) - jr $ra + # assign (add here the expr.to_string) to t_15 + #load the variable t_14 + lw $v0, -56($fp) + sw $v0, -60($fp) - .text -Init_List: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # push $fp to the stack - sw $fp, 0($sp) + lw $v0, -60($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 0 - - # return the value of the function in the register $v0 - #load the variable self + # assign (add here the expr.to_string) to t_16 + # calling the method out_string of type Main + #load the variable self_Main lw $v0, 12($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 - # pop the top of the stack to $fp + lw $v0, 0($v0) + lw $v1, 24($v0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $fp, 0($sp) + lw $v1, 0($sp) - # pop the top of the stack to $ra + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -isNil_Cons: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + lw $v1, 0($sp) - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 + sw $v0, -64($fp) - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 8 + # assign (add here the expr.to_string) to t_13 + #load the variable t_16 + lw $v0, -64($fp) + sw $v0, -52($fp) - # assign (add here the expr.to_string) to t_14 - # Creating Int instance for atomic 0 + j ifend_0 + then_0: + # assign (add here the expr.to_string) to t_17 + #load the string str_1 li $a0, 8 li $v0, 9 syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) + la $v1, String + sw $v1, 0($v0) + la $v1, str_1 + sw $v1, 4($v0) + sw $v0, -68($fp) + + # assign (add here the expr.to_string) to t_18 + #load the variable t_17 + lw $v0, -68($fp) + sw $v0, -72($fp) + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - + lw $v0, -72($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - jal compare - # pop the top of the stack to $t0 + # assign (add here the expr.to_string) to t_19 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $v0, 0($v0) + lw $v1, 24($v0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $t0, 0($sp) + lw $v1, 0($sp) - # pop the top of the stack to $t0 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $t0, 0($sp) + lw $v1, 0($sp) - sw $v0, -0($fp) + sw $v0, -76($fp) - # assign (add here the expr.to_string) to t_15 - #load the variable t_14 - lw $v0, -0($fp) - sw $v0, -4($fp) + # assign (add here the expr.to_string) to t_13 + #load the variable t_19 + lw $v0, -76($fp) + sw $v0, -52($fp) + + ifend_0: + # assign (add here the expr.to_string) to t_20 + #load the variable t_13 + lw $v0, -52($fp) + sw $v0, -80($fp) # return the value of the function in the register $v0 - #load the variable t_15 - lw $v0, -4($fp) + #load the variable t_20 + lw $v0, -80($fp) move $v0, $v0 # restore the stack pointer, frame pointer y return address - addu $sp $sp 8 + addu $sp $sp 84 # pop the top of the stack to $fp addi $sp $sp 4 lw $fp, 0($sp) @@ -547,7 +444,7 @@ isNil_Cons: jr $ra .text -head_Cons: +Init_Main: # save the return address and frame pointer # push $ra to the stack sw $ra, 0($sp) @@ -559,20 +456,28 @@ head_Cons: # update the frame pointer and allocate the frame in the stack move $fp $sp - subu $sp $sp 4 + subu $sp $sp 0 - # assign (add here the expr.to_string) to t_16 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -0($fp) + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to self_Main + jal Init_IO + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, 12($fp) # return the value of the function in the register $v0 - #load the variable t_16 - lw $v0, -0($fp) + #load the variable self_Main + lw $v0, 12($fp) move $v0, $v0 # restore the stack pointer, frame pointer y return address - addu $sp $sp 4 + addu $sp $sp 0 # pop the top of the stack to $fp addi $sp $sp 4 lw $fp, 0($sp) @@ -584,7 +489,7 @@ head_Cons: jr $ra .text -tail_Cons: +init_Complex: # save the return address and frame pointer # push $ra to the stack sw $ra, 0($sp) @@ -596,71 +501,78 @@ tail_Cons: # update the frame pointer and allocate the frame in the stack move $fp $sp - subu $sp $sp 4 + subu $sp $sp 20 - # assign (add here the expr.to_string) to t_17 - lw $v1, 12($fp) - lw $v0, 8($v1) + # assign (add here the expr.to_string) to t_23 + lw $v1, 20($fp) + lw $v0, 4($v1) sw $v0, -0($fp) - # return the value of the function in the register $v0 - #load the variable t_17 + # assign (add here the expr.to_string) to t_24 + #load the variable t_23 lw $v0, -0($fp) - move $v0, $v0 + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # restore the stack pointer, frame pointer y return address - addu $sp $sp 4 - # pop the top of the stack to $fp + #load the variable a_21 + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $fp, 0($sp) + lw $t0, 0($sp) - # pop the top of the stack to $ra + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $ra, 0($sp) + lw $t0, 0($sp) - jr $ra + sw $v0, -4($fp) - .text -init_Cons: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) + # assign (add here the expr.to_string) to t_25 + lw $v1, 20($fp) + lw $v0, 8($v1) + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_26 + #load the variable t_25 + lw $v0, -8($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # push $fp to the stack - sw $fp, 0($sp) + #load the variable b_22 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 4 + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) - # Setting value of the attribute car in the instance self_Cons to i_18 - #load the variable i_18 - lw $v0, 16($fp) - move $s2, $v0 - lw $v1, 20($fp) - sw $s2, 4($v1) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) - # Setting value of the attribute cdr in the instance self_Cons to rest_19 - #load the variable rest_19 - lw $v0, 12($fp) - move $s2, $v0 - lw $v1, 20($fp) - sw $s2, 8($v1) + sw $v0, -12($fp) - # assign (add here the expr.to_string) to t_20 - #load the variable self_Cons + # assign (add here the expr.to_string) to t_27 + #load the variable self_Complex lw $v0, 20($fp) - sw $v0, -0($fp) + sw $v0, -16($fp) # return the value of the function in the register $v0 - #load the variable t_20 - lw $v0, -0($fp) + #load the variable t_27 + lw $v0, -16($fp) move $v0, $v0 # restore the stack pointer, frame pointer y return address - addu $sp $sp 4 + addu $sp $sp 20 # pop the top of the stack to $fp addi $sp $sp 4 lw $fp, 0($sp) @@ -672,7 +584,7 @@ init_Cons: jr $ra .text -Init_Cons: +print_Complex: # save the return address and frame pointer # push $ra to the stack sw $ra, 0($sp) @@ -684,126 +596,76 @@ Init_Cons: # update the frame pointer and allocate the frame in the stack move $fp $sp - subu $sp $sp 0 - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 + subu $sp $sp 92 - # assign (add here the expr.to_string) to self - jal Init_List - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, 12($fp) - - # return the value of the function in the register $v0 - #load the variable self - lw $v0, 12($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -print_list_Main: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_28 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -0($fp) - # push $fp to the stack - sw $fp, 0($sp) + # assign (add here the expr.to_string) to t_29 + #load the variable t_28 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 76 - - # assign (add here the expr.to_string) to t_22 - #load the variable l_21 - lw $v0, 12($fp) - sw $v0, -0($fp) + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) - lw $v0, -0($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_23 - # calling the method isNil of type List - #load the variable t_22 - lw $v0, -0($fp) - lw $v0, 0($v0) - lw $v1, 24($v0) - jal $v1 - # pop the top of the stack to $v1 + jal compare + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $v1, 0($sp) + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) sw $v0, -4($fp) - # assign (add here the expr.to_string) to t_24 - #load the variable t_23 + # assign (add here the expr.to_string) to t_30 + #load the variable t_29 lw $v0, -4($fp) sw $v0, -8($fp) lw $t1, -8($fp) lw $t0, 4($t1) - bne $t0, $zero, then_0 - # assign (add here the expr.to_string) to t_26 - #load the variable l_21 - lw $v0, 12($fp) + bne $t0, $zero, then_1 + # assign (add here the expr.to_string) to t_32 + lw $v1, 12($fp) + lw $v0, 4($v1) sw $v0, -16($fp) + # assign (add here the expr.to_string) to t_33 + #load the variable t_32 lw $v0, -16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_27 - # calling the method head of type List - #load the variable t_26 - lw $v0, -16($fp) - lw $v0, 0($v0) - lw $v1, 28($v0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - sw $v0, -20($fp) - # assign (add here the expr.to_string) to t_28 - #load the variable t_27 - lw $v0, -20($fp) - sw $v0, -24($fp) - - lw $v0, 16($fp) + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -24($fp) + lw $v0, -20($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_29 - # calling the method out_int of type Main - #load the variable self_Main - lw $v0, 16($fp) + # assign (add here the expr.to_string) to t_34 + # calling the method out_int of type Complex + #load the variable self_Complex + lw $v0, 12($fp) lw $v0, 0($v0) lw $v1, 28($v0) jal $v1 @@ -815,25 +677,30 @@ print_list_Main: addi $sp $sp 4 lw $v1, 0($sp) + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_35 + #load the variable t_34 + lw $v0, -24($fp) sw $v0, -28($fp) - # assign (add here the expr.to_string) to t_30 - #load the string str_0 + # assign (add here the expr.to_string) to t_36 + #load the string str_2 li $a0, 8 li $v0, 9 syscall la $v1, String sw $v1, 0($v0) - la $v1, str_0 + la $v1, str_2 sw $v1, 4($v0) sw $v0, -32($fp) - # assign (add here the expr.to_string) to t_31 - #load the variable t_30 + # assign (add here the expr.to_string) to t_37 + #load the variable t_36 lw $v0, -32($fp) sw $v0, -36($fp) - lw $v0, 16($fp) + lw $v0, -28($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 @@ -843,10 +710,10 @@ print_list_Main: sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_32 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 16($fp) + # assign (add here the expr.to_string) to t_38 + # calling the method out_string of type Complex + #load the variable t_35 + lw $v0, -28($fp) lw $v0, 0($v0) lw $v1, 24($v0) jal $v1 @@ -860,35 +727,22 @@ print_list_Main: sw $v0, -40($fp) - # assign (add here the expr.to_string) to t_33 - #load the variable l_21 - lw $v0, 12($fp) + # assign (add here the expr.to_string) to t_39 + #load the variable t_38 + lw $v0, -40($fp) sw $v0, -44($fp) - lw $v0, -44($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_34 - # calling the method tail of type List - #load the variable t_33 - lw $v0, -44($fp) - lw $v0, 0($v0) - lw $v1, 32($v0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - + # assign (add here the expr.to_string) to t_40 + lw $v1, 12($fp) + lw $v0, 8($v1) sw $v0, -48($fp) - # assign (add here the expr.to_string) to t_35 - #load the variable t_34 + # assign (add here the expr.to_string) to t_41 + #load the variable t_40 lw $v0, -48($fp) sw $v0, -52($fp) - lw $v0, 16($fp) + lw $v0, -44($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 @@ -898,12 +752,12 @@ print_list_Main: sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_36 - # calling the method print_list of type Main - #load the variable self_Main - lw $v0, 16($fp) + # assign (add here the expr.to_string) to t_42 + # calling the method out_int of type Complex + #load the variable t_39 + lw $v0, -44($fp) lw $v0, 0($v0) - lw $v1, 40($v0) + lw $v1, 28($v0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -915,43 +769,41 @@ print_list_Main: sw $v0, -56($fp) - # assign (add here the expr.to_string) to t_25 - #load the variable t_36 + # assign (add here the expr.to_string) to t_43 + #load the variable t_42 lw $v0, -56($fp) - sw $v0, -12($fp) + sw $v0, -60($fp) - j ifend_0 - then_0: - # assign (add here the expr.to_string) to t_37 - #load the string str_1 + # assign (add here the expr.to_string) to t_44 + #load the string str_3 li $a0, 8 li $v0, 9 syscall la $v1, String sw $v1, 0($v0) - la $v1, str_1 + la $v1, str_3 sw $v1, 4($v0) - sw $v0, -60($fp) - - # assign (add here the expr.to_string) to t_38 - #load the variable t_37 - lw $v0, -60($fp) sw $v0, -64($fp) - lw $v0, 16($fp) + # assign (add here the expr.to_string) to t_45 + #load the variable t_44 + lw $v0, -64($fp) + sw $v0, -68($fp) + + lw $v0, -60($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -64($fp) + lw $v0, -68($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_39 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 16($fp) + # assign (add here the expr.to_string) to t_46 + # calling the method out_string of type Complex + #load the variable t_43 + lw $v0, -60($fp) lw $v0, 0($v0) lw $v1, 24($v0) jal $v1 @@ -963,26 +815,70 @@ print_list_Main: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -68($fp) + sw $v0, -72($fp) - # assign (add here the expr.to_string) to t_25 - #load the variable t_39 - lw $v0, -68($fp) + # assign (add here the expr.to_string) to t_31 + #load the variable t_46 + lw $v0, -72($fp) sw $v0, -12($fp) - ifend_0: - # assign (add here the expr.to_string) to t_40 - #load the variable t_25 + j ifend_1 + then_1: + # assign (add here the expr.to_string) to t_47 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -76($fp) + + # assign (add here the expr.to_string) to t_48 + #load the variable t_47 + lw $v0, -76($fp) + sw $v0, -80($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -80($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_49 + # calling the method out_int of type Complex + #load the variable self_Complex + lw $v0, 12($fp) + lw $v0, 0($v0) + lw $v1, 28($v0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -84($fp) + + # assign (add here the expr.to_string) to t_31 + #load the variable t_49 + lw $v0, -84($fp) + sw $v0, -12($fp) + + ifend_1: + # assign (add here the expr.to_string) to t_50 + #load the variable t_31 lw $v0, -12($fp) - sw $v0, -72($fp) + sw $v0, -88($fp) # return the value of the function in the register $v0 - #load the variable t_40 - lw $v0, -72($fp) + #load the variable t_50 + lw $v0, -88($fp) move $v0, $v0 # restore the stack pointer, frame pointer y return address - addu $sp $sp 76 + addu $sp $sp 92 # pop the top of the stack to $fp addi $sp $sp 4 lw $fp, 0($sp) @@ -994,7 +890,7 @@ print_list_Main: jr $ra .text -main_Main: +reflect_0_Complex: # save the return address and frame pointer # push $ra to the stack sw $ra, 0($sp) @@ -1006,293 +902,623 @@ main_Main: # update the frame pointer and allocate the frame in the stack move $fp $sp - subu $sp $sp 112 + subu $sp $sp 44 - # assign (add here the expr.to_string) to t_41 - li $a0, 4 - li $v0, 9 - syscall - la $a0, List - sw $a0, 0($v0) + # assign (add here the expr.to_string) to t_51 + lw $v1, 12($fp) + lw $v0, 4($v1) sw $v0, -0($fp) - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_42 - # calling the method Init_List of type List - #load the variable t_41 - lw $v0, -0($fp) - lw $v0, 0($v0) - lw $v1, 8($v0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - + # assign (add here the expr.to_string) to t_52 + lw $v1, 12($fp) + lw $v0, 4($v1) sw $v0, -4($fp) - # assign (add here the expr.to_string) to t_43 - #load the variable t_42 + # assign (add here the expr.to_string) to t_53 + #load the variable t_52 lw $v0, -4($fp) sw $v0, -8($fp) - # assign (add here the expr.to_string) to t_44 - # Creating Int instance for atomic 1 + # assign (add here the expr.to_string) to t_54 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + # Creating Int instance for atomic 0 li $a0, 8 li $v0, 9 syscall la $t0, Int - li $t1, 1 + li $t1, 0 sw $t0, 0($v0) sw $t1, 4($v0) - sw $v0, -12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + #load the variable t_53 lw $v0, -8($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_55 + #load the variable t_51 + lw $v0, -0($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 + #load the variable t_54 lw $v0, -12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_45 - # calling the method cons of type List - #load the variable t_43 - lw $v0, -8($fp) - lw $v0, 0($v0) - lw $v1, 36($v0) - jal $v1 - # pop the top of the stack to $v1 + jal compare + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $v1, 0($sp) + lw $t0, 0($sp) - # pop the top of the stack to $v1 + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $v1, 0($sp) + lw $t0, 0($sp) sw $v0, -16($fp) - # assign (add here the expr.to_string) to t_46 - #load the variable t_45 - lw $v0, -16($fp) + # assign (add here the expr.to_string) to t_56 + lw $v1, 12($fp) + lw $v0, 8($v1) sw $v0, -20($fp) - # assign (add here the expr.to_string) to t_47 - # Creating Int instance for atomic 2 + # assign (add here the expr.to_string) to t_57 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_58 + #load the variable t_57 + lw $v0, -24($fp) + sw $v0, -28($fp) + + # assign (add here the expr.to_string) to t_59 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + # Creating Int instance for atomic 0 li $a0, 8 li $v0, 9 syscall la $t0, Int - li $t1, 2 + li $t1, 0 sw $t0, 0($v0) sw $t1, 4($v0) - sw $v0, -24($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_58 + lw $v0, -28($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -32($fp) + + # assign (add here the expr.to_string) to t_60 + #load the variable t_56 lw $v0, -20($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -24($fp) + #load the variable t_59 + lw $v0, -32($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_48 - # calling the method cons of type List - #load the variable t_46 + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_61 + #load the variable self_Complex + lw $v0, 12($fp) + sw $v0, -40($fp) + + # return the value of the function in the register $v0 + #load the variable t_61 + lw $v0, -40($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 44 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +reflect_X_Complex: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 24 + + # assign (add here the expr.to_string) to t_62 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_63 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_64 + #load the variable t_63 + lw $v0, -4($fp) + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_65 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_64 + lw $v0, -8($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_66 + #load the variable t_62 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_65 + lw $v0, -12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -16($fp) + + # assign (add here the expr.to_string) to t_67 + #load the variable self_Complex + lw $v0, 12($fp) + sw $v0, -20($fp) + + # return the value of the function in the register $v0 + #load the variable t_67 lw $v0, -20($fp) - lw $v0, 0($v0) - lw $v1, 36($v0) - jal $v1 - # pop the top of the stack to $v1 + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 24 + # pop the top of the stack to $fp addi $sp $sp 4 - lw $v1, 0($sp) + lw $fp, 0($sp) - # pop the top of the stack to $v1 + # pop the top of the stack to $ra addi $sp $sp 4 - lw $v1, 0($sp) + lw $ra, 0($sp) - sw $v0, -28($fp) + jr $ra - # assign (add here the expr.to_string) to t_49 - #load the variable t_48 - lw $v0, -28($fp) - sw $v0, -32($fp) + .text +reflect_Y_Complex: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 - # assign (add here the expr.to_string) to t_50 - # Creating Int instance for atomic 3 + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 24 + + # assign (add here the expr.to_string) to t_68 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_69 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_70 + #load the variable t_69 + lw $v0, -4($fp) + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_71 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + # Creating Int instance for atomic 0 li $a0, 8 li $v0, 9 syscall la $t0, Int - li $t1, 3 + li $t1, 0 sw $t0, 0($v0) sw $t1, 4($v0) - sw $v0, -36($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 - lw $v0, -32($fp) + #load the variable t_70 + lw $v0, -8($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_72 + #load the variable t_68 + lw $v0, -0($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -36($fp) + #load the variable t_71 + lw $v0, -12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_51 - # calling the method cons of type List - #load the variable t_49 - lw $v0, -32($fp) + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -16($fp) + + # assign (add here the expr.to_string) to t_73 + #load the variable self_Complex + lw $v0, 12($fp) + sw $v0, -20($fp) + + # return the value of the function in the register $v0 + #load the variable t_73 + lw $v0, -20($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 24 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +equal_Complex: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 64 + + # assign (add here the expr.to_string) to t_75 + lw $v1, 16($fp) + lw $v0, 4($v1) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_76 + #load the variable d_74 + lw $v0, 12($fp) + sw $v0, -4($fp) + + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_77 + # calling the method x_value of type Complex + #load the variable t_76 + lw $v0, -4($fp) lw $v0, 0($v0) - lw $v1, 36($v0) + lw $v1, 64($v0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - # pop the top of the stack to $v1 + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_78 + #load the variable t_75 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_77 + lw $v0, -8($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $v1, 0($sp) + lw $t0, 0($sp) - sw $v0, -40($fp) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) - # assign (add here the expr.to_string) to t_52 - #load the variable t_51 - lw $v0, -40($fp) - sw $v0, -44($fp) + sw $v0, -12($fp) - # assign (add here the expr.to_string) to t_53 - # Creating Int instance for atomic 4 + # assign (add here the expr.to_string) to t_79 + #load the variable t_78 + lw $v0, -12($fp) + sw $v0, -16($fp) + + lw $t1, -16($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_2 + # assign (add here the expr.to_string) to t_81 + # Creating Int instance for atomic 0 li $a0, 8 li $v0, 9 syscall la $t0, Int - li $t1, 4 + li $t1, 0 sw $t0, 0($v0) sw $t1, 4($v0) - sw $v0, -48($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) - lw $v0, -44($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -48($fp) + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_80 + #load the variable t_81 + lw $v0, -24($fp) + sw $v0, -20($fp) + + j ifend_2 + then_2: + # assign (add here the expr.to_string) to t_82 + lw $v1, 16($fp) + lw $v0, 8($v1) + sw $v0, -28($fp) + + # assign (add here the expr.to_string) to t_83 + #load the variable d_74 + lw $v0, 12($fp) + sw $v0, -32($fp) + + lw $v0, -32($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_84 + # calling the method y_value of type Complex + #load the variable t_83 + lw $v0, -32($fp) + lw $v0, 0($v0) + lw $v1, 68($v0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_85 + #load the variable t_82 + lw $v0, -28($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_84 + lw $v0, -36($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_54 - # calling the method cons of type List - #load the variable t_52 - lw $v0, -44($fp) - lw $v0, 0($v0) - lw $v1, 36($v0) - jal $v1 - # pop the top of the stack to $v1 + jal compare + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $v1, 0($sp) + lw $t0, 0($sp) - # pop the top of the stack to $v1 + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $v1, 0($sp) + lw $t0, 0($sp) - sw $v0, -52($fp) + sw $v0, -40($fp) - # assign (add here the expr.to_string) to t_55 - #load the variable t_54 - lw $v0, -52($fp) - sw $v0, -56($fp) + # assign (add here the expr.to_string) to t_86 + #load the variable t_85 + lw $v0, -40($fp) + sw $v0, -44($fp) - # assign (add here the expr.to_string) to t_56 - # Creating Int instance for atomic 5 + lw $t1, -44($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_3 + # assign (add here the expr.to_string) to t_88 + # Creating Int instance for atomic 0 li $a0, 8 li $v0, 9 syscall la $t0, Int - li $t1, 5 + li $t1, 0 sw $t0, 0($v0) sw $t1, 4($v0) - sw $v0, -60($fp) - - lw $v0, -56($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -60($fp) + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_57 - # calling the method cons of type List - #load the variable t_55 - lw $v0, -56($fp) - lw $v0, 0($v0) - lw $v1, 36($v0) - jal $v1 - # pop the top of the stack to $v1 + jal compare + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $v1, 0($sp) + lw $t0, 0($sp) - # pop the top of the stack to $v1 + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -64($fp) - - # Setting value of the attribute mylist in the instance self_Main to t_57 - #load the variable t_57 - lw $v0, -64($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 4($v1) - - while_0: - # assign (add here the expr.to_string) to t_58 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -68($fp) - - lw $v0, -68($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 + lw $t0, 0($sp) - # assign (add here the expr.to_string) to t_59 - # calling the method isNil of type List - #load the variable t_58 - lw $v0, -68($fp) - lw $v0, 0($v0) - lw $v1, 24($v0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) + sw $v0, -52($fp) - sw $v0, -72($fp) + # assign (add here the expr.to_string) to t_87 + #load the variable t_88 + lw $v0, -52($fp) + sw $v0, -48($fp) - # assign (add here the expr.to_string) to t_60 - #load the variable t_59 - lw $v0, -72($fp) - sw $v0, -76($fp) + j ifend_3 + then_3: + # assign (add here the expr.to_string) to t_89 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) - # assign (add here the expr.to_string) to t_61 - #load the variable t_60 - lw $v0, -76($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 @@ -1302,7 +1528,7 @@ main_Main: li $v0, 9 syscall la $t0, Int - li $t1, 1 + li $t1, 0 sw $t0, 0($v0) sw $t1, 4($v0) @@ -1319,104 +1545,116 @@ main_Main: addi $sp $sp 4 lw $t0, 0($sp) - lw $t0, 4($v0) - li $t1, 1 - xor $t0, $t0, $t1 - andi $t0, $t0, 0x01 - sw $t0, 4($v0) - sw $v0, -80($fp) + sw $v0, -56($fp) - # assign (add here the expr.to_string) to t_62 - #load the variable t_61 - lw $v0, -80($fp) - sw $v0, -84($fp) + # assign (add here the expr.to_string) to t_87 + #load the variable t_89 + lw $v0, -56($fp) + sw $v0, -48($fp) - lw $t1, -84($fp) - lw $t0, 4($t1) - bne $t0, $zero, body_0 - j pool_0 - body_0: - # assign (add here the expr.to_string) to t_64 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -92($fp) + ifend_3: + # assign (add here the expr.to_string) to t_80 + #load the variable t_87 + lw $v0, -48($fp) + sw $v0, -20($fp) - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 + ifend_2: + # assign (add here the expr.to_string) to t_90 + #load the variable t_80 + lw $v0, -20($fp) + sw $v0, -60($fp) - lw $v0, -92($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 + # return the value of the function in the register $v0 + #load the variable t_90 + lw $v0, -60($fp) + move $v0, $v0 - # assign (add here the expr.to_string) to t_65 - # calling the method print_list of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $v0, 0($v0) - lw $v1, 40($v0) - jal $v1 - # pop the top of the stack to $v1 + # restore the stack pointer, frame pointer y return address + addu $sp $sp 64 + # pop the top of the stack to $fp addi $sp $sp 4 - lw $v1, 0($sp) + lw $fp, 0($sp) - # pop the top of the stack to $v1 + # pop the top of the stack to $ra addi $sp $sp 4 - lw $v1, 0($sp) + lw $ra, 0($sp) - sw $v0, -96($fp) + jr $ra - # assign (add here the expr.to_string) to t_66 + .text +x_value_Complex: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 8 + + # assign (add here the expr.to_string) to t_91 lw $v1, 12($fp) lw $v0, 4($v1) - sw $v0, -100($fp) + sw $v0, -0($fp) - lw $v0, -100($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_92 + #load the variable t_91 + lw $v0, -0($fp) + sw $v0, -4($fp) - # assign (add here the expr.to_string) to t_67 - # calling the method tail of type List - #load the variable t_66 - lw $v0, -100($fp) - lw $v0, 0($v0) - lw $v1, 32($v0) - jal $v1 - # pop the top of the stack to $v1 + # return the value of the function in the register $v0 + #load the variable t_92 + lw $v0, -4($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 8 + # pop the top of the stack to $fp addi $sp $sp 4 - lw $v1, 0($sp) + lw $fp, 0($sp) - sw $v0, -104($fp) + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) - # Setting value of the attribute mylist in the instance self_Main to t_67 - #load the variable t_67 - lw $v0, -104($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 4($v1) + jr $ra - # assign (add here the expr.to_string) to t_63 - #load the variable t_67 - lw $v0, -104($fp) - sw $v0, -88($fp) + .text +y_value_Complex: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 - j while_0 - pool_0: - # assign (add here the expr.to_string) to t_68 - #load the variable t_63 - lw $v0, -88($fp) - sw $v0, -108($fp) + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 8 + + # assign (add here the expr.to_string) to t_93 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_94 + #load the variable t_93 + lw $v0, -0($fp) + sw $v0, -4($fp) # return the value of the function in the register $v0 - #load the variable t_68 - lw $v0, -108($fp) + #load the variable t_94 + lw $v0, -4($fp) move $v0, $v0 # restore the stack pointer, frame pointer y return address - addu $sp $sp 112 + addu $sp $sp 8 # pop the top of the stack to $fp addi $sp $sp 4 lw $fp, 0($sp) @@ -1428,7 +1666,7 @@ main_Main: jr $ra .text -Init_Main: +Init_Complex: # save the return address and frame pointer # push $ra to the stack sw $ra, 0($sp) @@ -1447,7 +1685,7 @@ Init_Main: sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to self + # assign (add here the expr.to_string) to self_Complex jal Init_IO # pop the top of the stack to $v1 addi $sp $sp 4 @@ -1456,7 +1694,7 @@ Init_Main: sw $v0, 12($fp) # return the value of the function in the register $v0 - #load the variable self + #load the variable self_Complex lw $v0, 12($fp) move $v0, $v0 @@ -1683,11 +1921,6 @@ abort_Object: lw $ra, 0($sp) jr $ra - - - - - @@ -1794,7 +2027,34 @@ in_string_IO: jr $ra +in_int_IO: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + li $v0, 5 + syscall + move $t0, $v0 + + li $v0, 9 + li $a0, 8 + syscall + + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra @@ -2075,6 +2335,16 @@ compare: jr $ra +concat_String: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + + From 47d5f128d6db7b391197ca35a6defdc1bcd2bc89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karla=20Olivera=20Hern=C3=A1ndez?= Date: Sun, 27 Feb 2022 23:22:24 -0500 Subject: [PATCH 58/81] Fix error in locals of init functions --- src/code_generator/generate_ast.py | 5 ++++- src/code_generator/utils.py | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 6a220719d..2ec36adb0 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -82,15 +82,18 @@ def visit(self, node): expr = self.visit(feature.expr) features.append((feature.id, feature.type, expr, self.scope.instructions.copy())) self.scope.instructions = [] - locals.extend(self.scope.all_locals.copy()) else: expr = None features.append((feature.id, feature.type, None, None)) + + locals.extend(self.scope.all_locals.copy()) else: function = self.visit(feature) self.scope.functions.append(function) + self.scope.locals = [{}] + self.scope.all_locals = [] init_class = self.scope.create_init_class(features, locals) self.scope.functions.append(init_class) diff --git a/src/code_generator/utils.py b/src/code_generator/utils.py index b714e41ad..376af8672 100644 --- a/src/code_generator/utils.py +++ b/src/code_generator/utils.py @@ -177,7 +177,7 @@ def create_init_class(self, attributes, locals): instructions.append(CILSetAttributeNode(CILVariableNode(f'self_{self.current_class}'), self.current_class, CILVariableNode(id), variable)) instructions.append(CILReturnNode(CILVariableNode(f'self_{self.current_class}'))) - + locals.extend(self.all_locals.copy()) return CILFuncNode(f'Init_{self.current_class}', [CILParamNode(f'self_{self.current_class}', None)], locals, instructions) From a0d7e91cbaab628c85c567ffeac7e9b83d828456 Mon Sep 17 00:00:00 2001 From: Amy Date: Mon, 28 Feb 2022 00:15:07 -0500 Subject: [PATCH 59/81] fix error in Dispatch --- src/code_generator/generate_ast.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 2ec36adb0..eed6849ab 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -145,6 +145,8 @@ def visit(self, node): else: name = self.scope.find_local(node.expr.lex) type = node.expr.computed_type.name + if node.type is not None: + type = node.type args = [] args.append(CILArgNode(CILVariableNode(name))) for arg in node.arg: From cff29005ee7ac3acd344b2cee257642d514742ad Mon Sep 17 00:00:00 2001 From: Amy Date: Mon, 28 Feb 2022 04:19:44 -0500 Subject: [PATCH 60/81] fix dispatch --- src/code_generator/generate_ast.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index eed6849ab..64cb6331e 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -32,8 +32,9 @@ def visit(self, node): self.scope.functions.append(CILFuncNode('main', [], locals, instructions)) self.scope.data.append(CILDataNode(f'str_empty', "\"\"")) - + self.table = bfs_init(self.scope.context) types_ts = get_ts(self.scope.context) + self.to = types_ts infos = self.scope.infos = {} for type in types_ts: t = TypeInfo() @@ -138,15 +139,10 @@ def visit(self, node): name = self.scope.add_new_local(node.expr.computed_type.name) instruction = CILAssignNode(CILVariableNode(name), expr) self.scope.instructions.append(instruction) - type = node.expr.computed_type.name elif node.expr.lex == 'self': name = f'self_{self.scope.current_class}' - type = self.scope.current_class else: name = self.scope.find_local(node.expr.lex) - type = node.expr.computed_type.name - if node.type is not None: - type = node.type args = [] args.append(CILArgNode(CILVariableNode(name))) for arg in node.arg: @@ -160,10 +156,10 @@ def visit(self, node): args.append(CILArgNode(CILVariableNode(expr.lex))) self.scope.instructions.extend(args) - if type is not None: - expression = CILVCallNode(type, node.id) + if node.type is not None: + expression = CILVCallNode(node.type, node.id) else: - expression = CILVCallNode(self.scope.current_class, node.id) + expression = CILVCallNode(None, node.id) type = self.scope.ret_type_of_method(node.id, type) new_var = self.scope.add_new_local(type) node_var = CILVariableNode(new_var) @@ -253,6 +249,7 @@ def visit(self, node): name_return = self.scope.add_new_local(node.computed_type.name) return_ = CILVariableNode(name_return) + for case, index in zip(node.cases,range(0, len(node.cases))): if index != 0: self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index-1}')) From 7c1347a652e6b95f167ee4edef20b63cdf766eff Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Mon, 28 Feb 2022 04:51:21 -0500 Subject: [PATCH 61/81] Fix dispatch code generation --- src/code_generator/ast_CIL.py | 3 +- src/code_generator/generate_ast.py | 14 +- src/code_generator/mips_built_in.txt | 128 ++ src/code_generator/spim_visitor.py | 59 +- src/cool.py | 4 +- src/output.cil | 1756 ++++++++++++++++++++------ src/program.cl | 487 +++++-- 7 files changed, 1934 insertions(+), 517 deletions(-) diff --git a/src/code_generator/ast_CIL.py b/src/code_generator/ast_CIL.py index 2b01896da..9f7082a35 100644 --- a/src/code_generator/ast_CIL.py +++ b/src/code_generator/ast_CIL.py @@ -270,9 +270,10 @@ def __str__(self): class CILVCallNode(CILExpressionNode): - def __init__(self, type, func): + def __init__(self, type, func, static=False): self.type = type self.func = func + self.static = static def __str__(self): text = "VCallNode:\n" diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 64cb6331e..17a2f0667 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -32,9 +32,8 @@ def visit(self, node): self.scope.functions.append(CILFuncNode('main', [], locals, instructions)) self.scope.data.append(CILDataNode(f'str_empty', "\"\"")) - self.table = bfs_init(self.scope.context) + #self.table = bfs_init(self.scope.context) types_ts = get_ts(self.scope.context) - self.to = types_ts infos = self.scope.infos = {} for type in types_ts: t = TypeInfo() @@ -139,10 +138,15 @@ def visit(self, node): name = self.scope.add_new_local(node.expr.computed_type.name) instruction = CILAssignNode(CILVariableNode(name), expr) self.scope.instructions.append(instruction) + type = node.expr.computed_type.name elif node.expr.lex == 'self': name = f'self_{self.scope.current_class}' + type = self.scope.current_class else: - name = self.scope.find_local(node.expr.lex) + name = self.scope.find_local(node.expr.lex) + type = node.expr.computed_type.name + if node.type is not None: + type = node.type args = [] args.append(CILArgNode(CILVariableNode(name))) for arg in node.arg: @@ -157,9 +161,9 @@ def visit(self, node): self.scope.instructions.extend(args) if node.type is not None: - expression = CILVCallNode(node.type, node.id) + expression = CILVCallNode(node.type, node.id, True) else: - expression = CILVCallNode(None, node.id) + expression = CILVCallNode(type, node.id) type = self.scope.ret_type_of_method(node.id, type) new_var = self.scope.add_new_local(type) node_var = CILVariableNode(new_var) diff --git a/src/code_generator/mips_built_in.txt b/src/code_generator/mips_built_in.txt index 54d97de40..68f98a02e 100644 --- a/src/code_generator/mips_built_in.txt +++ b/src/code_generator/mips_built_in.txt @@ -29,6 +29,40 @@ abort_Object: jr $ra +copy_Object: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + + lw $t7, 12($fp) # load the object address + lw $t6, 0($t7) # get the type info address + lw $t5, 0($t6) # get the size of the type + + move $a0, $t5 + li $v0, 9 + syscall + move $t6, $v0 +copy_Object_loop: + lw $t4, 0($t7) + sw $t4, 0($t6) + addu $t7, $t7, 4 + addu $t6, $t6, 4 + addu $t5, $t5, -4 + bgtz $t5, copy_Object_loop + + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + out_string_IO: @@ -390,6 +424,9 @@ compare: la $t4, Bool beq $t3, $t4, compare_branch1 + la $t4, type + beq $t3, $t4, compare_branch1 + la $t4, String beq $t3, $t4, compare_branch2 @@ -449,6 +486,97 @@ concat_String: sw $fp, 0($sp) addi $sp, $sp, -4 move $fp, $sp + + lw $t0, 16($fp) + lw $t0, 4($t0) # the value of the first String instance + + # call strlen with the string + sw $t0, 0($sp) + addi $sp, $sp, -4 + jal strlen + addi $sp, $sp, 4 + lw $t0, 0($sp) + + #save the lenght of the first string + sw $v0, 0($sp) + addi $sp, $sp, -4 + + + lw $t0, 16($fp) + lw $t0, 4($t0) # the value of the second String instance + + # call strlen with the string + sw $t0, 0($sp) + addi $sp, $sp, -4 + jal strlen + addi $sp, $sp, 4 + lw $t0, 0($sp) + + # pop the lenght of the first string from the stack + addi $sp, $sp, 4 + lw $t0, 0($sp) + + # get the total space for allocating the new string + addu $t0, $t0, $v0 + addi $t0, $t0, 1 + + move $a0, $t0 + li $v0, 9 + syscall # at $v0 is the result string + + lw $t0, 16($fp) + lw $t0, 4($t0) # the address of the value of the first String instance + move $t1, $v0 # the address of the value of the result string + concat_String_loop1: + lb $t3, 0($t0) + beq $t3, $zero, concat_String_eloop1 + sb $t3, 0($t1) + addi $t0, $t0, 1 + addi $t1, $t1, 1 + j concat_String_loop1 + + concat_String_eloop1: + + lw $t0, 12($fp) + lw $t0, 4($t0) + concat_String_loop2: + lb $t3, 0($t0) + beq $t3, $zero, concat_String_eloop2 + sb $t3, 0($t1) + addi $t0, $t0, 1 + addi $t1, $t1, 1 + j concat_String_loop2 + concat_String_eloop2: + sb $zero, 0($t1) + + la $t0, String + move $t1, $v0 + + li $a0, 8 + li $v0, 9 + syscall + + sw $t0, 0($v0) + sw $t1, 4($v0) + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + + + + + + + + + + + diff --git a/src/code_generator/spim_visitor.py b/src/code_generator/spim_visitor.py index 286675da9..6d0c7bcb9 100644 --- a/src/code_generator/spim_visitor.py +++ b/src/code_generator/spim_visitor.py @@ -37,6 +37,13 @@ def visit(self, node, frame): @visitor.when(CILProgramNode) def visit(self, node: CILProgramNode, frame): + + self.set_tabs(1) + self.add_line(".data") + self.add_line(".align 4") + self.set_tabs(0) + self.add_line("type: .word 8") + self.add_line('') for t in node.types: self.visit(t, frame) @@ -68,7 +75,7 @@ def visit(self, node: CILTypeNode, frame): t = self.scope.types[node.id] methods_str = ' '.join(m.function_id for m in node.methods) assert len(node.methods) == len(t.methods_offset) - self.add_line(f"_{node.id}: .asciiz \"{node.id}\"") + self.add_line(f"_{node.id}: .asciiz \"{node.id}\\n\"") self.add_line("\t.data") self.add_line("\t.align 4") self.add_line(f"{node.id}: .word {t.size} _{node.id} {methods_str}") @@ -229,13 +236,19 @@ def visit(self, node: CILAllocateNode, frame): @visitor.when(CILTypeOfNode) # Get the dynamic type of an instance def visit(self, node: CILTypeOfNode, frame): - register0 = '$v0' - register1 = '$v1' - var_addr = frame.get_addr(node.var.lex) - # register0 points to the heap - self.add_line(f'lw $t1, {var_addr}') - self.add_line('lw $v0, 0($t1)') - return register0 + self.add_line('li $a0, 8') + self.add_line('li $v0, 9') + self.add_line('syscall') + self.add_line('move $t0, $v0') # save the address of the allocated space + + self.visit(node.var, frame) + + self.add_line('la $t1, type') + self.add_line('lw $t2, 0($v0)') # get the type of the var + self.add_line('sw $t1, 0($t0)') + self.add_line('sw $t2, 4($t0)') + self.add_line('move $v0, $t0') + return '$v0' @visitor.when(CILCallNode) # I don't think this is necessary def visit(self, node: CILCallNode, frame): @@ -250,18 +263,21 @@ def visit(self, node: CILCallNode, frame): def visit(self, node: CILVCallNode, frame): # the instance of type T is always the first argument to be passed to the function self.add_line(f'# calling the method {node.func} of type {node.type}') - instance = frame.arg_queue[0] - instance_addr = self.visit(instance, frame) # load into a register the address of the instance in the heap - register0 = '$v0' - # register0 has the dynamic type address of the instance - # since every instance stores its type in the first word of the allocated memory - self.add_line(f'lw {register0}, 0({instance_addr})') + if node.static: + self.add_line(f'la $t0, {node.type}') + else: + instance = frame.arg_queue[0] + instance_addr = self.visit(instance, frame) # load into a register the address of the instance in the heap + + # register0 has the dynamic type address of the instance + # since every instance stores its type in the first word of the allocated memory + self.add_line(f'lw $t0, 0({instance_addr})') # use the information of the static type to get the location of the method in memory t = self.scope.types[node.type] try: - method_addr = t.get_method_addr(node.func, register0) + method_addr = t.get_method_addr(node.func, '$t0') except: print(node.func) print(t.id) @@ -312,6 +328,19 @@ def visit(self, node: CILVariableNode, frame): var_addr = frame.get_addr(node.lex) self.add_line(f'lw {register}, {var_addr}') return register + + @visitor.when(CILTypeConstantNode) + def visit(self, node: CILTypeConstantNode, frame): + print('here') + self.add_line('li $a0, 8') + self.add_line('li $v0, 9') + self.add_line('syscall') + + self.add_line('la $t0, type') + self.add_line(f'la $t1, {node.lex}') + self.add_line('sw $t0, 0($v0)') + self.add_line('sw $t1, 4($v0)') + return '$v0' @visitor.when(CILPlusNode) def visit(self, node: CILPlusNode, frame): diff --git a/src/cool.py b/src/cool.py index d8994e296..7044e4dd6 100644 --- a/src/cool.py +++ b/src/cool.py @@ -62,6 +62,6 @@ #print(mips_codegen.code) with open(f'output.out', 'w') as f: f.write(mips_codegen.code) -#with open(f'{input_file[:-3]}.mips', 'w') as f: -# f.write(mips_codegen.code) +# with open(f'{input_file[:-3]}.mips', 'w') as f: +# f.write(mips_codegen.code) exit(0) diff --git a/src/output.cil b/src/output.cil index d189e76e9..2352eec84 100644 --- a/src/output.cil +++ b/src/output.cil @@ -1,10 +1,58 @@ .TYPES -type Book { - attribute title; - attribute author; +type Graph { + attribute vertices; + attribute edges; - method Init_Book : Init_Book; + method Init_Graph : Init_Graph; + method abort : abort_Object; + method type_name : type_name_Object; + method copy : copy_Object; + method add_vertice : add_vertice_Graph; + method print_E : print_E_Graph; + method print_V : print_V_Graph; +} + +type Vertice { + attribute num; + attribute out; + + method Init_Vertice : Init_Vertice; + method abort : abort_Object; + method type_name : type_name_Object; + method copy : copy_Object; + method out_string : out_string_IO; + method out_int : out_int_IO; + method in_string : in_string_IO; + method in_int : in_int_IO; + method outgoing : outgoing_Vertice; + method number : number_Vertice; + method init : init_Vertice; + method add_out : add_out_Vertice; + method print : print_Vertice; +} + +type Edge { + attribute from; + attribute to; + attribute weight; + + method Init_Edge : Init_Edge; + method abort : abort_Object; + method type_name : type_name_Object; + method copy : copy_Object; + method out_string : out_string_IO; + method out_int : out_int_IO; + method in_string : in_string_IO; + method in_int : in_int_IO; + method init : init_Edge; + method print : print_Edge; +} + +type EList { + attribute car; + + method Init_EList : Init_EList; method abort : abort_Object; method type_name : type_name_Object; method copy : copy_Object; @@ -12,16 +60,19 @@ type Book { method out_int : out_int_IO; method in_string : in_string_IO; method in_int : in_int_IO; - method initBook : initBook_Book; - method print : print_Book; + method isNil : isNil_EList; + method head : head_EList; + method tail : tail_EList; + method cons : cons_EList; + method append : append_EList; + method print : print_EList; } -type Article { - attribute title; - attribute author; - attribute per_title; +type ECons { + attribute car; + attribute cdr; - method Init_Article : Init_Article; + method Init_ECons : Init_ECons; method abort : abort_Object; method type_name : type_name_Object; method copy : copy_Object; @@ -29,14 +80,19 @@ type Article { method out_int : out_int_IO; method in_string : in_string_IO; method in_int : in_int_IO; - method initBook : initBook_Book; - method print : print_Article; - method initArticle : initArticle_Article; + method isNil : isNil_ECons; + method head : head_ECons; + method tail : tail_ECons; + method cons : cons_EList; + method append : append_EList; + method print : print_ECons; + method init : init_ECons; } -type BookList { +type VList { + attribute car; - method Init_BookList : Init_BookList; + method Init_VList : Init_VList; method abort : abort_Object; method type_name : type_name_Object; method copy : copy_Object; @@ -44,18 +100,18 @@ type BookList { method out_int : out_int_IO; method in_string : in_string_IO; method in_int : in_int_IO; - method isNil : isNil_BookList; - method cons : cons_BookList; - method car : car_BookList; - method cdr : cdr_BookList; - method print_list : print_list_BookList; + method isNil : isNil_VList; + method head : head_VList; + method tail : tail_VList; + method cons : cons_VList; + method print : print_VList; } -type Cons { - attribute xcar; - attribute xcdr; +type VCons { + attribute car; + attribute cdr; - method Init_Cons : Init_Cons; + method Init_VCons : Init_VCons; method abort : abort_Object; method type_name : type_name_Object; method copy : copy_Object; @@ -63,17 +119,19 @@ type Cons { method out_int : out_int_IO; method in_string : in_string_IO; method in_int : in_int_IO; - method isNil : isNil_Cons; - method cons : cons_BookList; - method car : car_Cons; - method cdr : cdr_Cons; - method print_list : print_list_Cons; - method init : init_Cons; + method isNil : isNil_VCons; + method head : head_VCons; + method tail : tail_VCons; + method cons : cons_VList; + method print : print_VCons; + method init : init_VCons; } -type Nil { +type Parse { + attribute boolop; + attribute rest; - method Init_Nil : Init_Nil; + method Init_Parse : Init_Parse; method abort : abort_Object; method type_name : type_name_Object; method copy : copy_Object; @@ -81,23 +139,44 @@ type Nil { method out_int : out_int_IO; method in_string : in_string_IO; method in_int : in_int_IO; - method isNil : isNil_Nil; - method cons : cons_BookList; - method car : car_BookList; - method cdr : cdr_BookList; - method print_list : print_list_Nil; + method read_input : read_input_Parse; + method parse_line : parse_line_Parse; + method c2i : c2i_Parse; + method a2i : a2i_Parse; + method a2i_aux : a2i_aux_Parse; } type Main { - attribute books; + attribute boolop; + attribute rest; + attribute g; method Init_Main : Init_Main; method abort : abort_Object; method type_name : type_name_Object; method copy : copy_Object; + method out_string : out_string_IO; + method out_int : out_int_IO; + method in_string : in_string_IO; + method in_int : in_int_IO; + method read_input : read_input_Parse; + method parse_line : parse_line_Parse; + method c2i : c2i_Parse; + method a2i : a2i_Parse; + method a2i_aux : a2i_aux_Parse; method main : main_Main; } +type BoolOp { + + method Init_BoolOp : Init_BoolOp; + method abort : abort_Object; + method type_name : type_name_Object; + method copy : copy_Object; + method and : and_BoolOp; + method or : or_BoolOp; +} + type Object { method Init_Object : Init_Object; @@ -152,19 +231,29 @@ type IO { .DATA str_empty = ""; -str_0 = "title: "; -str_1 = "\n"; -str_2 = "author: "; +str_0 = " ("; +str_1 = ","; +str_2 = ")"; str_3 = "\n"; -str_4 = "periodical: "; +str_4 = "\n"; str_5 = "\n"; -str_6 = "- dynamic type was Book -\n"; -str_7 = "- dynamic type was Article -\n"; -str_8 = "Compilers, Principles, Techniques, and Tools"; -str_9 = "Aho, Sethi, and Ullman"; -str_10 = "The Top 100 CD_ROMs"; -str_11 = "Ulanoff"; -str_12 = "PC Magazine"; +str_6 = ""; +str_7 = "0"; +str_8 = "1"; +str_9 = "2"; +str_10 = "3"; +str_11 = "4"; +str_12 = "5"; +str_13 = "6"; +str_14 = "7"; +str_15 = "8"; +str_16 = "9"; +str_17 = "-"; +str_18 = " "; +str_19 = " "; +str_20 = ","; +str_21 = ""; +str_22 = ""; .CODE @@ -184,26 +273,10 @@ function main { } -function initBook_Book { - PARAM self_Book; - PARAM title_p_0; - PARAM author_p_1; - - LOCAL t_2; +function add_vertice_Graph { + PARAM self_Graph; + PARAM v_4; - SETATTR self_Book title title_p_0; - SETATTR self_Book author author_p_1; - t_2 = self_Book; - RETURN t_2; - -} - - -function print_Book { - PARAM self_Book; - - LOCAL t_3; - LOCAL t_4; LOCAL t_5; LOCAL t_6; LOCAL t_7; @@ -215,104 +288,152 @@ function print_Book { LOCAL t_13; LOCAL t_14; LOCAL t_15; + + t_5 = v_4; + ARG t_5; + t_6 = VCALL Vertice outgoing; + t_7 = t_6; + t_8 = GETATTR self_Graph edges; + t_9 = t_8; + ARG t_7; + ARG t_9; + t_10 = VCALL EList append; + SETATTR self_Graph edges t_10; + t_11 = GETATTR self_Graph vertices; + t_12 = t_11; + t_13 = v_4; + ARG t_12; + ARG t_13; + t_14 = VCALL VList cons; + SETATTR self_Graph vertices t_14; + t_15 = t_14; + RETURN t_15; + +} + + +function print_E_Graph { + PARAM self_Graph; + LOCAL t_16; LOCAL t_17; LOCAL t_18; LOCAL t_19; + + t_16 = GETATTR self_Graph edges; + t_17 = t_16; + ARG t_17; + t_18 = VCALL EList print; + t_19 = t_18; + RETURN t_19; + +} + + +function print_V_Graph { + PARAM self_Graph; + LOCAL t_20; LOCAL t_21; LOCAL t_22; LOCAL t_23; - LOCAL t_24; - LOCAL t_25; - LOCAL t_26; - LOCAL t_27; - t_3 = LOAD str_0; - t_4 = t_3; - ARG self_Book; - ARG t_4; - t_5 = VCALL Book out_string; - t_6 = t_5; - t_7 = GETATTR self_Book title; - t_8 = t_7; - ARG t_6; - ARG t_8; - t_9 = VCALL Book out_string; - t_10 = t_9; - t_11 = LOAD str_1; - t_12 = t_11; - ARG t_10; - ARG t_12; - t_13 = VCALL Book out_string; - t_14 = LOAD str_2; - t_15 = t_14; - ARG self_Book; - ARG t_15; - t_16 = VCALL Book out_string; - t_17 = t_16; - t_18 = GETATTR self_Book author; - t_19 = t_18; - ARG t_17; - ARG t_19; - t_20 = VCALL Book out_string; + t_20 = GETATTR self_Graph vertices; t_21 = t_20; - t_22 = LOAD str_3; - t_23 = t_22; ARG t_21; - ARG t_23; - t_24 = VCALL Book out_string; - t_25 = self_Book; - RETURN t_25; + t_22 = VCALL VList print; + t_23 = t_22; + RETURN t_23; + +} + + +function Init_Graph { + PARAM self_Graph; + + LOCAL t_0; + LOCAL t_1; + LOCAL t_2; + LOCAL t_3; + + t_0 = ALLOCATE VList; + ARG t_0; + t_1 = VCALL VList Init_VList; + SETATTR self_Graph vertices t_1; + t_2 = ALLOCATE EList; + ARG t_2; + t_3 = VCALL EList Init_EList; + SETATTR self_Graph edges t_3; + RETURN self_Graph; } -function Init_Book { - PARAM self_Book; +function outgoing_Vertice { + PARAM self_Vertice; + LOCAL t_26; + LOCAL t_27; - ARG self_Book; - self_Book = CALL Init_IO; - t_26 = LOAD str_empty; - SETATTR self_Book title t_26; - t_27 = LOAD str_empty; - SETATTR self_Book author t_27; - RETURN self_Book; + t_26 = GETATTR self_Vertice out; + t_27 = t_26; + RETURN t_27; } -function initArticle_Article { - PARAM self_Article; - PARAM title_p_28; - PARAM author_p_29; - PARAM per_title_p_30; +function number_Vertice { + PARAM self_Vertice; + + LOCAL t_28; + LOCAL t_29; + + t_28 = GETATTR self_Vertice num; + t_29 = t_28; + RETURN t_29; + +} + + +function init_Vertice { + PARAM self_Vertice; + PARAM n_30; LOCAL t_31; - LOCAL t_32; - LOCAL t_33; - LOCAL t_34; - t_31 = title_p_28; - t_32 = author_p_29; - ARG self_Article; - ARG t_31; - ARG t_32; - t_33 = VCALL Article initBook; - SETATTR self_Article per_title per_title_p_30; - t_34 = self_Article; - RETURN t_34; + SETATTR self_Vertice num n_30; + t_31 = self_Vertice; + RETURN t_31; } -function print_Article { - PARAM self_Article; +function add_out_Vertice { + PARAM self_Vertice; + PARAM s_32; + LOCAL t_33; + LOCAL t_34; LOCAL t_35; LOCAL t_36; LOCAL t_37; + + t_33 = GETATTR self_Vertice out; + t_34 = t_33; + t_35 = s_32; + ARG t_34; + ARG t_35; + t_36 = VCALL EList cons; + SETATTR self_Vertice out t_36; + t_37 = self_Vertice; + RETURN t_37; + +} + + +function print_Vertice { + PARAM self_Vertice; + LOCAL t_38; LOCAL t_39; LOCAL t_40; @@ -320,70 +441,65 @@ function print_Article { LOCAL t_42; LOCAL t_43; LOCAL t_44; - LOCAL t_45; - LOCAL t_46; - LOCAL t_47; - LOCAL t_48; - ARG self_Article; - t_35 = VCALL Article print; - t_36 = LOAD str_4; - t_37 = t_36; - ARG self_Article; - ARG t_37; - t_38 = VCALL Article out_string; + t_38 = GETATTR self_Vertice num; t_39 = t_38; - t_40 = GETATTR self_Article per_title; - t_41 = t_40; + ARG self_Vertice; ARG t_39; - ARG t_41; - t_42 = VCALL Article out_string; - t_43 = t_42; - t_44 = LOAD str_5; - t_45 = t_44; - ARG t_43; - ARG t_45; - t_46 = VCALL Article out_string; - t_47 = self_Article; - RETURN t_47; + t_40 = VCALL Vertice out_int; + t_41 = GETATTR self_Vertice out; + t_42 = t_41; + ARG t_42; + t_43 = VCALL EList print; + t_44 = t_43; + RETURN t_44; } -function Init_Article { - PARAM self_Article; +function Init_Vertice { + PARAM self_Vertice; + LOCAL t_24; + LOCAL t_25; - ARG self_Article; - self_Article = CALL Init_Book; - t_48 = LOAD str_empty; - SETATTR self_Article per_title t_48; - RETURN self_Article; + ARG self_Vertice; + self_Vertice = CALL Init_IO; + SETATTR self_Vertice num 0; + t_24 = ALLOCATE EList; + ARG t_24; + t_25 = VCALL EList Init_EList; + SETATTR self_Vertice out t_25; + RETURN self_Vertice; } -function isNil_BookList { - PARAM self_BookList; +function init_Edge { + PARAM self_Edge; + PARAM f_45; + PARAM t_46; + PARAM w_47; - LOCAL t_49; - LOCAL t_50; - LOCAL t_51; + LOCAL t_48; - ARG self_BookList; - t_49 = VCALL BookList abort; - t_50 = 0 == 0; - t_51 = t_50; - RETURN t_51; + SETATTR self_Edge from f_45; + SETATTR self_Edge to t_46; + SETATTR self_Edge weight w_47; + t_48 = self_Edge; + RETURN t_48; } -function cons_BookList { - PARAM self_BookList; - PARAM hd_52; +function print_Edge { + PARAM self_Edge; - LOCAL new_cell_53; + LOCAL t_49; + LOCAL t_50; + LOCAL t_51; + LOCAL t_52; + LOCAL t_53; LOCAL t_54; LOCAL t_55; LOCAL t_56; @@ -391,274 +507,348 @@ function cons_BookList { LOCAL t_58; LOCAL t_59; LOCAL t_60; - - t_54 = ALLOCATE Cons; - ARG t_54; - t_55 = VCALL Cons Init_Cons; - new_cell_53 = t_55; - t_56 = new_cell_53; - t_57 = hd_52; - t_58 = self_BookList; - ARG t_56; - ARG t_57; - ARG t_58; - t_59 = VCALL Cons init; - t_60 = t_59; - RETURN t_60; - -} - - -function car_BookList { - PARAM self_BookList; - LOCAL t_61; LOCAL t_62; LOCAL t_63; LOCAL t_64; - - ARG self_BookList; - t_61 = VCALL BookList abort; - t_62 = ALLOCATE Book; - ARG t_62; - t_63 = VCALL Book Init_Book; - t_64 = t_63; - RETURN t_64; - -} - - -function cdr_BookList { - PARAM self_BookList; - LOCAL t_65; LOCAL t_66; LOCAL t_67; - LOCAL t_68; - ARG self_BookList; - t_65 = VCALL BookList abort; - t_66 = ALLOCATE BookList; - ARG t_66; - t_67 = VCALL BookList Init_BookList; - t_68 = t_67; - RETURN t_68; + t_49 = LOAD str_0; + t_50 = t_49; + ARG self_Edge; + ARG t_50; + t_51 = VCALL Edge out_string; + t_52 = GETATTR self_Edge from; + t_53 = t_52; + ARG self_Edge; + ARG t_53; + t_54 = VCALL Edge out_int; + t_55 = LOAD str_1; + t_56 = t_55; + ARG self_Edge; + ARG t_56; + t_57 = VCALL Edge out_string; + t_58 = GETATTR self_Edge to; + t_59 = t_58; + ARG self_Edge; + ARG t_59; + t_60 = VCALL Edge out_int; + t_61 = LOAD str_2; + t_62 = t_61; + ARG self_Edge; + ARG t_62; + t_63 = VCALL Edge out_string; + t_64 = GETATTR self_Edge weight; + t_65 = t_64; + ARG self_Edge; + ARG t_65; + t_66 = VCALL Edge out_int; + t_67 = t_66; + RETURN t_67; } -function print_list_BookList { - PARAM self_BookList; +function Init_Edge { + PARAM self_Edge; - LOCAL t_69; - LOCAL t_70; - ARG self_BookList; - t_69 = VCALL BookList abort; - t_70 = t_69; - RETURN t_70; + ARG self_Edge; + self_Edge = CALL Init_IO; + SETATTR self_Edge from 0; + SETATTR self_Edge to 0; + SETATTR self_Edge weight 0; + RETURN self_Edge; } -function Init_BookList { - PARAM self_BookList; +function isNil_EList { + PARAM self_EList; + LOCAL t_68; + LOCAL t_69; - ARG self_BookList; - self_BookList = CALL Init_IO; - RETURN self_BookList; + t_68 = 0 == 0; + t_69 = t_68; + RETURN t_69; } -function isNil_Cons { - PARAM self_Cons; +function head_EList { + PARAM self_EList; + LOCAL t_70; LOCAL t_71; LOCAL t_72; - t_71 = 0 == 1; + ARG self_EList; + t_70 = VCALL EList abort; + t_71 = GETATTR self_EList car; t_72 = t_71; RETURN t_72; } -function init_Cons { - PARAM self_Cons; - PARAM hd_73; - PARAM tl_74; +function tail_EList { + PARAM self_EList; - LOCAL t_75; + LOCAL t_73; + LOCAL t_74; - SETATTR self_Cons xcar hd_73; - SETATTR self_Cons xcdr tl_74; - t_75 = self_Cons; - RETURN t_75; + ARG self_EList; + t_73 = VCALL EList abort; + t_74 = self_EList; + RETURN t_74; } -function car_Cons { - PARAM self_Cons; +function cons_EList { + PARAM self_EList; + PARAM e_75; LOCAL t_76; LOCAL t_77; - - t_76 = GETATTR self_Cons xcar; - t_77 = t_76; - RETURN t_77; - -} - - -function cdr_Cons { - PARAM self_Cons; - LOCAL t_78; LOCAL t_79; + LOCAL t_80; + LOCAL t_81; + LOCAL t_82; - t_78 = GETATTR self_Cons xcdr; - t_79 = t_78; - RETURN t_79; + t_76 = ALLOCATE ECons; + ARG t_76; + t_77 = VCALL ECons Init_ECons; + t_78 = t_77; + t_79 = e_75; + t_80 = self_EList; + ARG t_78; + ARG t_79; + ARG t_80; + t_81 = VCALL ECons init; + t_82 = t_81; + RETURN t_82; } -function print_list_Cons { - PARAM self_Cons; +function append_EList { + PARAM self_EList; + PARAM l_83; - LOCAL t_80; - LOCAL t_81; - LOCAL t_82; - LOCAL t_83; LOCAL t_84; LOCAL t_85; LOCAL t_86; - LOCAL dummy_87; + LOCAL t_87; LOCAL t_88; LOCAL t_89; LOCAL t_90; LOCAL t_91; - LOCAL dummy_92; + LOCAL t_92; LOCAL t_93; LOCAL t_94; LOCAL t_95; + + ARG self_EList; + t_84 = VCALL EList isNil; + t_85 = t_84; + IF t_85 GOTO then_0; + ARG self_EList; + t_87 = VCALL EList tail; + t_88 = t_87; + t_89 = l_83; + ARG t_88; + ARG t_89; + t_90 = VCALL EList append; + t_91 = t_90; + ARG self_EList; + t_92 = VCALL EList head; + t_93 = t_92; + ARG t_91; + ARG t_93; + t_94 = VCALL EList cons; + t_86 = t_94; + GOTO ifend_0; +then_0: + t_86 = l_83; +ifend_0: + t_95 = t_86; + RETURN t_95; + +} + + +function print_EList { + PARAM self_EList; + LOCAL t_96; LOCAL t_97; LOCAL t_98; LOCAL t_99; - t_80 = GETATTR self_Cons xcar; - t_81 = t_80; - ARG t_81; - t_82 = VCALL Book print; - t_83 = t_82; - t_84 = TYPEOF t_83; - t_86 = t_84 != Book; - IF t_86 GOTO branch_0_0; - dummy_87 = t_82; - t_88 = LOAD str_6; - t_89 = t_88; - ARG self_Cons; - ARG t_89; - t_90 = VCALL Cons out_string; - t_85 = t_90; - GOTO case_end0; -branch_0_0: - t_91 = t_84 != Article; - IF t_91 GOTO case_end0; - dummy_92 = t_82; - t_93 = LOAD str_7; - t_94 = t_93; - ARG self_Cons; - ARG t_94; - t_95 = VCALL Cons out_string; - t_85 = t_95; - GOTO case_end0; -case_end0: - t_96 = GETATTR self_Cons xcdr; + t_96 = LOAD str_3; t_97 = t_96; + ARG self_EList; ARG t_97; - t_98 = VCALL BookList print_list; + t_98 = VCALL EList out_string; t_99 = t_98; RETURN t_99; } -function Init_Cons { - PARAM self_Cons; +function Init_EList { + PARAM self_EList; - ARG self_Cons; - self_Cons = CALL Init_BookList; - RETURN self_Cons; + ARG self_EList; + self_EList = CALL Init_IO; + RETURN self_EList; } -function isNil_Nil { - PARAM self_Nil; +function isNil_ECons { + PARAM self_ECons; LOCAL t_100; LOCAL t_101; - t_100 = 0 == 0; + t_100 = 0 == 1; t_101 = t_100; RETURN t_101; } -function print_list_Nil { - PARAM self_Nil; +function head_ECons { + PARAM self_ECons; LOCAL t_102; LOCAL t_103; - t_102 = 0 == 0; + t_102 = GETATTR self_ECons car; t_103 = t_102; RETURN t_103; } -function Init_Nil { - PARAM self_Nil; +function tail_ECons { + PARAM self_ECons; + LOCAL t_104; + LOCAL t_105; - ARG self_Nil; - self_Nil = CALL Init_BookList; - RETURN self_Nil; + t_104 = GETATTR self_ECons cdr; + t_105 = t_104; + RETURN t_105; } -function main_Main { - PARAM self_Main; +function init_ECons { + PARAM self_ECons; + PARAM e_106; + PARAM rest_107; - LOCAL a_book_104; - LOCAL t_105; - LOCAL t_106; - LOCAL t_107; LOCAL t_108; + + SETATTR self_ECons car e_106; + SETATTR self_ECons cdr rest_107; + t_108 = self_ECons; + RETURN t_108; + +} + + +function print_ECons { + PARAM self_ECons; + LOCAL t_109; LOCAL t_110; LOCAL t_111; LOCAL t_112; - LOCAL an_article_113; + LOCAL t_113; LOCAL t_114; LOCAL t_115; + + t_109 = GETATTR self_ECons car; + t_110 = t_109; + ARG t_110; + t_111 = VCALL Edge print; + t_112 = GETATTR self_ECons cdr; + t_113 = t_112; + ARG t_113; + t_114 = VCALL EList print; + t_115 = t_114; + RETURN t_115; + +} + + +function Init_ECons { + PARAM self_ECons; + + + ARG self_ECons; + self_ECons = CALL Init_EList; + RETURN self_ECons; + +} + + +function isNil_VList { + PARAM self_VList; + LOCAL t_116; LOCAL t_117; + + t_116 = 0 == 0; + t_117 = t_116; + RETURN t_117; + +} + + +function head_VList { + PARAM self_VList; + LOCAL t_118; LOCAL t_119; LOCAL t_120; + + ARG self_VList; + t_118 = VCALL VList abort; + t_119 = GETATTR self_VList car; + t_120 = t_119; + RETURN t_120; + +} + + +function tail_VList { + PARAM self_VList; + LOCAL t_121; LOCAL t_122; - LOCAL t_123; + + ARG self_VList; + t_121 = VCALL VList abort; + t_122 = self_VList; + RETURN t_122; + +} + + +function cons_VList { + PARAM self_VList; + PARAM v_123; + LOCAL t_124; LOCAL t_125; LOCAL t_126; @@ -666,61 +856,814 @@ function main_Main { LOCAL t_128; LOCAL t_129; LOCAL t_130; + + t_124 = ALLOCATE VCons; + ARG t_124; + t_125 = VCALL VCons Init_VCons; + t_126 = t_125; + t_127 = v_123; + t_128 = self_VList; + ARG t_126; + ARG t_127; + ARG t_128; + t_129 = VCALL VCons init; + t_130 = t_129; + RETURN t_130; + +} + + +function print_VList { + PARAM self_VList; + LOCAL t_131; LOCAL t_132; LOCAL t_133; LOCAL t_134; + + t_131 = LOAD str_4; + t_132 = t_131; + ARG self_VList; + ARG t_132; + t_133 = VCALL VList out_string; + t_134 = t_133; + RETURN t_134; + +} + + +function Init_VList { + PARAM self_VList; + + + ARG self_VList; + self_VList = CALL Init_IO; + RETURN self_VList; + +} + + +function isNil_VCons { + PARAM self_VCons; + LOCAL t_135; + LOCAL t_136; - t_105 = ALLOCATE Book; - ARG t_105; - t_106 = VCALL Book Init_Book; - t_107 = t_106; - t_108 = LOAD str_8; - t_109 = t_108; - t_110 = LOAD str_9; - t_111 = t_110; - ARG t_107; - ARG t_109; - ARG t_111; - t_112 = VCALL Book initBook; - a_book_104 = t_112; - t_114 = ALLOCATE Article; - ARG t_114; - t_115 = VCALL Article Init_Article; - t_116 = t_115; - t_117 = LOAD str_10; - t_118 = t_117; - t_119 = LOAD str_11; - t_120 = t_119; - t_121 = LOAD str_12; - t_122 = t_121; - ARG t_116; - ARG t_118; - ARG t_120; - ARG t_122; - t_123 = VCALL Article initArticle; - an_article_113 = t_123; - t_124 = ALLOCATE Nil; - ARG t_124; - t_125 = VCALL Nil Init_Nil; - t_126 = t_125; - t_127 = a_book_104; - ARG t_126; - ARG t_127; - t_128 = VCALL Nil cons; - t_129 = t_128; - t_130 = an_article_113; - ARG t_129; - ARG t_130; - t_131 = VCALL Cons cons; - SETATTR self_Main books t_131; - t_132 = GETATTR self_Main books; - t_133 = t_132; - ARG t_133; - t_134 = VCALL BookList print_list; - t_135 = t_134; - RETURN t_135; + t_135 = 0 == 1; + t_136 = t_135; + RETURN t_136; + +} + + +function head_VCons { + PARAM self_VCons; + + LOCAL t_137; + LOCAL t_138; + + t_137 = GETATTR self_VCons car; + t_138 = t_137; + RETURN t_138; + +} + + +function tail_VCons { + PARAM self_VCons; + + LOCAL t_139; + LOCAL t_140; + + t_139 = GETATTR self_VCons cdr; + t_140 = t_139; + RETURN t_140; + +} + + +function init_VCons { + PARAM self_VCons; + PARAM v_141; + PARAM rest_142; + + LOCAL t_143; + + SETATTR self_VCons car v_141; + SETATTR self_VCons cdr rest_142; + t_143 = self_VCons; + RETURN t_143; + +} + + +function print_VCons { + PARAM self_VCons; + + LOCAL t_144; + LOCAL t_145; + LOCAL t_146; + LOCAL t_147; + LOCAL t_148; + LOCAL t_149; + LOCAL t_150; + + t_144 = GETATTR self_VCons car; + t_145 = t_144; + ARG t_145; + t_146 = VCALL Vertice print; + t_147 = GETATTR self_VCons cdr; + t_148 = t_147; + ARG t_148; + t_149 = VCALL VList print; + t_150 = t_149; + RETURN t_150; + +} + + +function Init_VCons { + PARAM self_VCons; + + + ARG self_VCons; + self_VCons = CALL Init_VList; + RETURN self_VCons; + +} + + +function read_input_Parse { + PARAM self_Parse; + + LOCAL g_153; + LOCAL t_154; + LOCAL t_155; + LOCAL line_156; + LOCAL t_157; + LOCAL t_158; + LOCAL t_159; + LOCAL t_160; + LOCAL t_161; + LOCAL t_162; + LOCAL t_163; + LOCAL t_164; + LOCAL t_165; + LOCAL t_166; + LOCAL t_167; + LOCAL t_168; + LOCAL t_169; + LOCAL t_170; + LOCAL t_171; + LOCAL t_172; + LOCAL t_173; + LOCAL t_174; + LOCAL t_175; + LOCAL t_176; + LOCAL t_177; + LOCAL t_178; + LOCAL t_179; + + t_154 = ALLOCATE Graph; + ARG t_154; + t_155 = VCALL Graph Init_Graph; + g_153 = t_155; + ARG self_Parse; + t_157 = VCALL Parse in_string; + line_156 = t_157; +while_0: + t_158 = GETATTR self_Parse boolop; + t_159 = t_158; + t_160 = LOAD str_5; + t_161 = line_156 == t_160; + t_162 = t_161; + t_163 = ; + t_164 = t_163; + t_165 = LOAD str_6; + t_166 = line_156 == t_165; + t_167 = t_166; + t_168 = ; + t_169 = t_168; + ARG t_159; + ARG t_164; + ARG t_169; + t_170 = VCALL BoolOp and; + t_171 = t_170; + IF t_171 GOTO body_0; + GOTO pool_0; +body_0: + t_173 = g_153; + t_174 = line_156; + ARG self_Parse; + ARG t_174; + t_175 = VCALL Parse parse_line; + t_176 = t_175; + ARG t_173; + ARG t_176; + t_177 = VCALL Graph add_vertice; + ARG self_Parse; + t_178 = VCALL Parse in_string; + line_156 = t_178; + t_172 = line_156; + GOTO while_0; +pool_0: + t_179 = g_153; + RETURN t_179; + +} + + +function parse_line_Parse { + PARAM self_Parse; + PARAM s_180; + + LOCAL v_181; + LOCAL t_182; + LOCAL t_183; + LOCAL t_184; + LOCAL t_185; + LOCAL t_186; + LOCAL t_187; + LOCAL t_188; + LOCAL t_189; + LOCAL t_190; + LOCAL t_191; + LOCAL t_192; + LOCAL t_193; + LOCAL t_194; + LOCAL t_195; + LOCAL t_196; + LOCAL succ_197; + LOCAL t_198; + LOCAL t_199; + LOCAL t_200; + LOCAL weight_201; + LOCAL t_202; + LOCAL t_203; + LOCAL t_204; + LOCAL t_205; + LOCAL t_206; + LOCAL t_207; + LOCAL t_208; + LOCAL t_209; + LOCAL t_210; + LOCAL t_211; + LOCAL t_212; + LOCAL t_213; + LOCAL t_214; + LOCAL t_215; + LOCAL t_216; + LOCAL t_217; + + t_182 = ALLOCATE Vertice; + ARG t_182; + t_183 = VCALL Vertice Init_Vertice; + t_184 = t_183; + t_185 = s_180; + ARG self_Parse; + ARG t_185; + t_186 = VCALL Parse a2i; + t_187 = t_186; + ARG t_184; + ARG t_187; + t_188 = VCALL Vertice init; + v_181 = t_188; +while_1: + t_189 = GETATTR self_Parse rest; + t_190 = t_189; + ARG t_190; + t_191 = VCALL String length; + t_192 = t_191 == 0; + t_193 = t_192; + t_194 = ; + t_195 = t_194; + IF t_195 GOTO body_1; + GOTO pool_1; +body_1: + t_198 = GETATTR self_Parse rest; + t_199 = t_198; + ARG self_Parse; + ARG t_199; + t_200 = VCALL Parse a2i; + succ_197 = t_200; + t_202 = GETATTR self_Parse rest; + t_203 = t_202; + ARG self_Parse; + ARG t_203; + t_204 = VCALL Parse a2i; + weight_201 = t_204; + t_205 = v_181; + t_206 = ALLOCATE Edge; + ARG t_206; + t_207 = VCALL Edge Init_Edge; + t_208 = t_207; + t_209 = v_181; + ARG t_209; + t_210 = VCALL Vertice number; + t_211 = t_210; + t_212 = succ_197; + t_213 = weight_201; + ARG t_208; + ARG t_211; + ARG t_212; + ARG t_213; + t_214 = VCALL Edge init; + t_215 = t_214; + ARG t_205; + ARG t_215; + t_216 = VCALL Vertice add_out; + t_196 = t_216; + GOTO while_1; +pool_1: + t_217 = v_181; + RETURN t_217; + +} + + +function c2i_Parse { + PARAM self_Parse; + PARAM char_218; + + LOCAL t_219; + LOCAL t_220; + LOCAL t_221; + LOCAL t_222; + LOCAL t_223; + LOCAL t_224; + LOCAL t_225; + LOCAL t_226; + LOCAL t_227; + LOCAL t_228; + LOCAL t_229; + LOCAL t_230; + LOCAL t_231; + LOCAL t_232; + LOCAL t_233; + LOCAL t_234; + LOCAL t_235; + LOCAL t_236; + LOCAL t_237; + LOCAL t_238; + LOCAL t_239; + LOCAL t_240; + LOCAL t_241; + LOCAL t_242; + LOCAL t_243; + LOCAL t_244; + LOCAL t_245; + LOCAL t_246; + LOCAL t_247; + LOCAL t_248; + LOCAL t_249; + LOCAL t_250; + LOCAL t_251; + LOCAL t_252; + LOCAL t_253; + LOCAL t_254; + LOCAL t_255; + LOCAL t_256; + LOCAL t_257; + LOCAL t_258; + LOCAL t_259; + LOCAL t_260; + + t_219 = LOAD str_7; + t_220 = char_218 == t_219; + t_221 = t_220; + IF t_221 GOTO then_1; + t_223 = LOAD str_8; + t_224 = char_218 == t_223; + t_225 = t_224; + IF t_225 GOTO then_2; + t_227 = LOAD str_9; + t_228 = char_218 == t_227; + t_229 = t_228; + IF t_229 GOTO then_3; + t_231 = LOAD str_10; + t_232 = char_218 == t_231; + t_233 = t_232; + IF t_233 GOTO then_4; + t_235 = LOAD str_11; + t_236 = char_218 == t_235; + t_237 = t_236; + IF t_237 GOTO then_5; + t_239 = LOAD str_12; + t_240 = char_218 == t_239; + t_241 = t_240; + IF t_241 GOTO then_6; + t_243 = LOAD str_13; + t_244 = char_218 == t_243; + t_245 = t_244; + IF t_245 GOTO then_7; + t_247 = LOAD str_14; + t_248 = char_218 == t_247; + t_249 = t_248; + IF t_249 GOTO then_8; + t_251 = LOAD str_15; + t_252 = char_218 == t_251; + t_253 = t_252; + IF t_253 GOTO then_9; + t_255 = LOAD str_16; + t_256 = char_218 == t_255; + t_257 = t_256; + IF t_257 GOTO then_10; + ARG self_Parse; + t_259 = VCALL Parse abort; + t_258 = 0; + GOTO ifend_10; +then_10: + t_258 = 9; +ifend_10: + t_254 = t_258; + GOTO ifend_9; +then_9: + t_254 = 8; +ifend_9: + t_250 = t_254; + GOTO ifend_8; +then_8: + t_250 = 7; +ifend_8: + t_246 = t_250; + GOTO ifend_7; +then_7: + t_246 = 6; +ifend_7: + t_242 = t_246; + GOTO ifend_6; +then_6: + t_242 = 5; +ifend_6: + t_238 = t_242; + GOTO ifend_5; +then_5: + t_238 = 4; +ifend_5: + t_234 = t_238; + GOTO ifend_4; +then_4: + t_234 = 3; +ifend_4: + t_230 = t_234; + GOTO ifend_3; +then_3: + t_230 = 2; +ifend_3: + t_226 = t_230; + GOTO ifend_2; +then_2: + t_226 = 1; +ifend_2: + t_222 = t_226; + GOTO ifend_1; +then_1: + t_222 = 0; +ifend_1: + t_260 = t_222; + RETURN t_260; + +} + + +function a2i_Parse { + PARAM self_Parse; + PARAM s_261; + + LOCAL t_262; + LOCAL t_263; + LOCAL t_264; + LOCAL t_265; + LOCAL t_266; + LOCAL t_267; + LOCAL t_268; + LOCAL t_269; + LOCAL t_270; + LOCAL t_271; + LOCAL t_272; + LOCAL t_273; + LOCAL t_274; + LOCAL t_275; + LOCAL t_276; + LOCAL t_277; + LOCAL t_278; + LOCAL t_279; + LOCAL t_280; + LOCAL t_281; + LOCAL t_282; + LOCAL t_283; + LOCAL t_284; + LOCAL t_285; + LOCAL t_286; + LOCAL t_287; + LOCAL t_288; + LOCAL t_289; + LOCAL t_290; + LOCAL t_291; + LOCAL t_292; + LOCAL t_293; + LOCAL t_294; + LOCAL t_295; + LOCAL t_296; + LOCAL t_297; + LOCAL t_298; + LOCAL t_299; + LOCAL t_300; + LOCAL t_301; + LOCAL t_302; + LOCAL t_303; + LOCAL t_304; + LOCAL t_305; + + t_262 = s_261; + ARG t_262; + t_263 = VCALL String length; + t_264 = t_263 == 0; + t_265 = t_264; + IF t_265 GOTO then_11; + t_267 = s_261; + t_268 = 0; + t_269 = 1; + ARG t_267; + ARG t_268; + ARG t_269; + t_270 = VCALL String substr; + t_271 = LOAD str_17; + t_272 = t_270 == t_271; + t_273 = t_272; + IF t_273 GOTO then_12; + t_275 = s_261; + t_276 = 0; + t_277 = 1; + ARG t_275; + ARG t_276; + ARG t_277; + t_278 = VCALL String substr; + t_279 = LOAD str_18; + t_280 = t_278 == t_279; + t_281 = t_280; + IF t_281 GOTO then_13; + t_283 = s_261; + ARG self_Parse; + ARG t_283; + t_284 = VCALL Parse a2i_aux; + t_282 = t_284; + GOTO ifend_13; +then_13: + t_285 = s_261; + t_286 = 1; + t_287 = s_261; + ARG t_287; + t_288 = VCALL String length; + t_289 = t_288 - 1; + t_290 = t_289; + ARG t_285; + ARG t_286; + ARG t_290; + t_291 = VCALL String substr; + t_292 = t_291; + ARG self_Parse; + ARG t_292; + t_293 = VCALL Parse a2i; + t_282 = t_293; +ifend_13: + t_274 = t_282; + GOTO ifend_12; +then_12: + t_294 = s_261; + t_295 = 1; + t_296 = s_261; + ARG t_296; + t_297 = VCALL String length; + t_298 = t_297 - 1; + t_299 = t_298; + ARG t_294; + ARG t_295; + ARG t_299; + t_300 = VCALL String substr; + t_301 = t_300; + ARG self_Parse; + ARG t_301; + t_302 = VCALL Parse a2i_aux; + t_303 = t_302; + t_304 = 0 - t_303; + t_274 = t_304; +ifend_12: + t_266 = t_274; + GOTO ifend_11; +then_11: + t_266 = 0; +ifend_11: + t_305 = t_266; + RETURN t_305; + +} + + +function a2i_aux_Parse { + PARAM self_Parse; + PARAM s_306; + + LOCAL int_307; + LOCAL j_308; + LOCAL t_309; + LOCAL t_310; + LOCAL i_311; + LOCAL t_312; + LOCAL t_313; + LOCAL t_314; + LOCAL c_315; + LOCAL t_316; + LOCAL t_317; + LOCAL t_318; + LOCAL t_319; + LOCAL t_320; + LOCAL t_321; + LOCAL t_322; + LOCAL t_323; + LOCAL t_324; + LOCAL t_325; + LOCAL t_326; + LOCAL t_327; + LOCAL t_328; + LOCAL t_329; + LOCAL t_330; + LOCAL t_331; + LOCAL t_332; + LOCAL t_333; + LOCAL t_334; + LOCAL t_335; + LOCAL t_336; + LOCAL t_337; + LOCAL t_338; + LOCAL t_339; + LOCAL t_340; + LOCAL t_341; + LOCAL t_342; + LOCAL t_343; + LOCAL t_344; + LOCAL t_345; + LOCAL t_346; + LOCAL t_347; + LOCAL t_348; + LOCAL t_349; + LOCAL t_350; + LOCAL t_351; + LOCAL t_352; + LOCAL t_353; + LOCAL t_354; + LOCAL t_355; + LOCAL t_356; + LOCAL t_357; + LOCAL t_358; + LOCAL t_359; + LOCAL t_360; + + int_307 = 0; + t_309 = s_306; + ARG t_309; + t_310 = VCALL String length; + j_308 = t_310; + i_311 = 0; +while_2: + t_312 = i_311 < j_308; + t_313 = t_312; + IF t_313 GOTO body_2; + GOTO pool_2; +body_2: + t_316 = s_306; + t_317 = i_311; + t_318 = 1; + ARG t_316; + ARG t_317; + ARG t_318; + t_319 = VCALL String substr; + c_315 = t_319; + t_320 = LOAD str_19; + t_321 = c_315 == t_320; + t_322 = t_321; + IF t_322 GOTO then_14; + t_324 = LOAD str_20; + t_325 = c_315 == t_324; + t_326 = t_325; + IF t_326 GOTO then_15; + t_328 = int_307 * 10; + t_329 = s_306; + t_330 = i_311; + t_331 = 1; + ARG t_329; + ARG t_330; + ARG t_331; + t_332 = VCALL String substr; + t_333 = t_332; + ARG self_Parse; + ARG t_333; + t_334 = VCALL Parse c2i; + t_335 = t_328 + t_334; + int_307 = t_335; + t_336 = i_311 + 1; + i_311 = t_336; + t_337 = i_311 == j_308; + t_338 = t_337; + IF t_338 GOTO then_16; + t_340 = LOAD str_21; + t_339 = t_340; + GOTO ifend_16; +then_16: + t_341 = LOAD str_22; + SETATTR self_Parse rest t_341; + t_339 = t_341; +ifend_16: + t_327 = t_339; + GOTO ifend_15; +then_15: + t_342 = s_306; + t_343 = i_311 + 1; + t_344 = t_343; + t_345 = s_306; + ARG t_345; + t_346 = VCALL String length; + t_347 = t_346 - i_311; + t_348 = t_347 - 1; + t_349 = t_348; + ARG t_342; + ARG t_344; + ARG t_349; + t_350 = VCALL String substr; + SETATTR self_Parse rest t_350; + i_311 = j_308; + t_327 = i_311; +ifend_15: + t_323 = t_327; + GOTO ifend_14; +then_14: + t_351 = s_306; + t_352 = i_311 + 1; + t_353 = t_352; + t_354 = s_306; + ARG t_354; + t_355 = VCALL String length; + t_356 = t_355 - i_311; + t_357 = t_356 - 1; + t_358 = t_357; + ARG t_351; + ARG t_353; + ARG t_358; + t_359 = VCALL String substr; + SETATTR self_Parse rest t_359; + i_311 = j_308; + t_323 = i_311; +ifend_14: + t_314 = t_323; + GOTO while_2; +pool_2: + t_360 = int_307; + RETURN t_360; + +} + + +function Init_Parse { + PARAM self_Parse; + + LOCAL t_151; + LOCAL t_152; + LOCAL t_361; + + ARG self_Parse; + self_Parse = CALL Init_IO; + t_151 = ALLOCATE BoolOp; + ARG t_151; + t_152 = VCALL BoolOp Init_BoolOp; + SETATTR self_Parse boolop t_152; + t_361 = LOAD str_empty; + SETATTR self_Parse rest t_361; + RETURN self_Parse; + +} + + +function main_Main { + PARAM self_Main; + + LOCAL t_363; + LOCAL t_364; + LOCAL t_365; + LOCAL t_366; + LOCAL t_367; + LOCAL t_368; + LOCAL t_369; + + t_363 = GETATTR self_Main g; + t_364 = t_363; + ARG t_364; + t_365 = VCALL Graph print_V; + t_366 = GETATTR self_Main g; + t_367 = t_366; + ARG t_367; + t_368 = VCALL Graph print_E; + t_369 = t_368; + RETURN t_369; } @@ -728,12 +1671,75 @@ function main_Main { function Init_Main { PARAM self_Main; + LOCAL t_362; + ARG self_Main; + self_Main = CALL Init_Parse; + ARG self_Main; + t_362 = VCALL Main read_input; + SETATTR self_Main g t_362; RETURN self_Main; } +function and_BoolOp { + PARAM self_BoolOp; + PARAM b1_370; + PARAM b2_371; + + LOCAL t_372; + LOCAL t_373; + LOCAL t_374; + LOCAL t_375; + + t_372 = b1_370; + IF t_372 GOTO then_17; + t_374 = 0 == 1; + t_373 = t_374; + GOTO ifend_17; +then_17: + t_373 = b2_371; +ifend_17: + t_375 = t_373; + RETURN t_375; + +} + + +function or_BoolOp { + PARAM self_BoolOp; + PARAM b1_376; + PARAM b2_377; + + LOCAL t_378; + LOCAL t_379; + LOCAL t_380; + LOCAL t_381; + + t_378 = b1_376; + IF t_378 GOTO then_18; + t_379 = b2_377; + GOTO ifend_18; +then_18: + t_380 = 0 == 0; + t_379 = t_380; +ifend_18: + t_381 = t_379; + RETURN t_381; + +} + + +function Init_BoolOp { + PARAM self_BoolOp; + + + RETURN self_BoolOp; + +} + + function Init_Object { PARAM self; diff --git a/src/program.cl b/src/program.cl index 025ea1695..8e511358c 100644 --- a/src/program.cl +++ b/src/program.cl @@ -1,132 +1,381 @@ --- example of static and dynamic type differing for a dispatch - -Class Book inherits IO { - title : String; - author : String; - - initBook(title_p : String, author_p : String) : Book { - { - title <- title_p; - author <- author_p; - self; - } - }; - - print() : Book { - { - out_string("title: ").out_string(title).out_string("\n"); - out_string("author: ").out_string(author).out_string("\n"); - self; - } - }; +(* + * Cool program reading descriptions of weighted directed graphs + * from stdin. It builds up a graph objects with a list of vertices + * and a list of edges. Every vertice has a list of outgoing edges. + * + * INPUT FORMAT + * Every line has the form vertice successor* + * Where vertice is an int, and successor is vertice,weight + * + * An empty line or EOF terminates the input. + * + * The list of vertices and the edge list is printed out by the Main + * class. + * + * TEST + * Once compiled, the file g1.graph can be fed to the program. + * The output should look like this: + +nautilus.CS.Berkeley.EDU 53# spim -file graph.s out_string("- dynamic type was Book -\n"); - dummy : Article => out_string("- dynamic type was Article -\n"); - esac; - xcdr.print_list(); - } - }; + + + +class VList inherits IO { + -- Define operations on empty lists of vertices. + + car : Vertice; + + isNil() : Bool { true }; + + head() : Vertice { { abort(); car; } }; + + tail() : VList { { abort(); self; } }; + + -- When we cons and element onto the empty list we get a non-empty + -- list. The (new Cons) expression creates a new list cell of class + -- ECons, which is initialized by a dispatch to init(). + -- The result of init() is an element of class Cons, but it + -- conforms to the return type List, because Cons is a subclass of + -- List. + + cons(v : Vertice) : VList { + (new VCons).init(v, self) + }; + + print() : Object { out_string("\n") }; + }; -Class Nil inherits BookList { - isNil() : Bool { true }; - print_list() : Object { true }; +class VCons inherits VList { + + cdr : VList; -- The rest of the list + + isNil() : Bool { false }; + + head() : Vertice { car }; + + tail() : VList { cdr }; + + init(v : Vertice, rest : VList) : VList { + { + car <- v; + cdr <- rest; + self; + } + }; + + print() : Object { + { + car.print(); + cdr.print(); + } + }; + }; -Class Main { - - books : BookList; - - main() : Object { - (let a_book : Book <- - (new Book).initBook("Compilers, Principles, Techniques, and Tools", - "Aho, Sethi, and Ullman") - in - (let an_article : Article <- - (new Article).initArticle("The Top 100 CD_ROMs", - "Ulanoff", - "PC Magazine") - in - { - books <- (new Nil).cons(a_book).cons(an_article); - books.print_list(); - } - ) -- end let an_article - ) -- end let a_book - }; +class Parse inherits IO { + + + boolop : BoolOp <- new BoolOp; + + -- Reads the input and parses the fields + + read_input() : Graph { + + (let g : Graph <- new Graph in { + (let line : String <- in_string() in + while (boolop.and(not line="\n", not line="")) loop { + -- out_string(line); + -- out_string("\n"); + g.add_vertice(parse_line(line)); + line <- in_string(); + } pool + ); + g; + } ) + }; + + + parse_line(s : String) : Vertice { + (let v : Vertice <- (new Vertice).init(a2i(s)) in { + while (not rest.length() = 0) loop { + -- out_string(rest); + -- out_string("\n"); + (let succ : Int <- a2i(rest) in (let + weight : Int <- a2i(rest) + in + v.add_out(new Edge.init(v.number(), + succ, + weight)) + ) ); + } pool; + v; + } + ) + }; + + c2i(char : String) : Int { + if char = "0" then 0 else + if char = "1" then 1 else + if char = "2" then 2 else + if char = "3" then 3 else + if char = "4" then 4 else + if char = "5" then 5 else + if char = "6" then 6 else + if char = "7" then 7 else + if char = "8" then 8 else + if char = "9" then 9 else + { abort(); 0; } -- the 0 is needed to satisfy the typchecker + fi fi fi fi fi fi fi fi fi fi + }; + + rest : String; + + a2i(s : String) : Int { + if s.length() = 0 then 0 else + if s.substr(0,1) = "-" then ~a2i_aux(s.substr(1,s.length()-1)) else + if s.substr(0,1) = " " then a2i(s.substr(1,s.length()-1)) else + a2i_aux(s) + fi fi fi + }; + +(* + a2i_aux converts the usigned portion of the string. As a programming +example, this method is written iteratively. + The conversion stops at a space or comma. + As a side effect, r is set to the remaining string (without the comma). +*) + a2i_aux(s : String) : Int { + (let int : Int <- 0 in + { + (let j : Int <- s.length() in + (let i : Int <- 0 in + while i < j loop + (let c : String <- s.substr(i,1) in + if (c = " ") then + { + rest <- s.substr(i+1,s.length()-i-1); + i <- j; + } + else if (c = ",") then + { + rest <- s.substr(i+1, s.length()-i-1); + i <- j; + } + else + { + int <- int * 10 + c2i(s.substr(i,1)); + i <- i + 1; + if i=j then rest <- "" else "" fi; + } + fi fi + ) + pool + ) + ); + int; + } + ) + }; + +}; + + +class Main inherits Parse { + + g : Graph <- read_input(); + + main() : Object { + { + g.print_V(); + g.print_E(); + } + }; + +}; + +class BoolOp { + + and(b1 : Bool, b2 : Bool) : Bool { + if b1 then b2 else false fi + }; + + + or(b1 : Bool, b2 : Bool) : Bool { + if b1 then true else b2 fi + }; + }; From fe8ea402f64e6c00c334efa8716767260b388fed Mon Sep 17 00:00:00 2001 From: Amy Date: Mon, 28 Feb 2022 08:46:28 -0500 Subject: [PATCH 62/81] first part of implementation of new case --- src/code_generator/generate_ast.py | 33 +++++++++-- src/code_generator/utils.py | 90 +++++++++++++++++++++++++++++- 2 files changed, 116 insertions(+), 7 deletions(-) diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 17a2f0667..85f177873 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -1,10 +1,13 @@ from cmath import exp +from copy import copy from parsing.ast import * from .ast_CIL import * from .utils import * from cmp.semantic import IOType, IntType, StringType, BoolType, ObjectType import cmp.visitor as visitor - +from itertools import chain +from collections import OrderedDict + class CIL: def __init__(self, context): @@ -32,8 +35,10 @@ def visit(self, node): self.scope.functions.append(CILFuncNode('main', [], locals, instructions)) self.scope.data.append(CILDataNode(f'str_empty', "\"\"")) - #self.table = bfs_init(self.scope.context) + table_ = bfs_init(self.scope.context) + self.table = table(table_) types_ts = get_ts(self.scope.context) + self.to = types_ts infos = self.scope.infos = {} for type in types_ts: t = TypeInfo() @@ -253,17 +258,35 @@ def visit(self, node): name_return = self.scope.add_new_local(node.computed_type.name) return_ = CILVariableNode(name_return) - + order = order_case_branc_to(node.cases,self.to) + valid = valid_case(self.table,order) + s = list(valid.values()) + iterator = chain(*s) + l = list(iterator) + m = list(OrderedDict.fromkeys(l)) + print(m) + for case, index in zip(node.cases,range(0, len(node.cases))): if index != 0: self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index-1}')) + + case_expr_type_of = CILTypeConstantNode(case.type) - case_expr_type_of = CILTypeConstantNode(case.type) + #index = 0 + #for case in node.cases: + #s = m + #for new_branch in m : + # try: + # if new_branch in valid[case.type]: + #if index != 0: + #self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index-1}')) name_var_condition = self.scope.add_new_local(None) var_condition = CILVariableNode(name_var_condition) + case_expr_type_of = CILTypeConstantNode(case.type) self.scope.instructions.append(CILAssignNode(var_condition, CILNotEqualsNode(CILVariableNode(name_type_expr),case_expr_type_of))) + if index == len(node.cases) - 1: - self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'case_end{self.scope.case_count}'))) + self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'case_end{self.scope.case_count}'))) else: self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'branch_{self.scope.case_count}_{index}'))) diff --git a/src/code_generator/utils.py b/src/code_generator/utils.py index 376af8672..beab40e47 100644 --- a/src/code_generator/utils.py +++ b/src/code_generator/utils.py @@ -1,6 +1,7 @@ from cmp.semantic import IntType, ObjectType, StringType, BoolType from .ast_CIL import * - +from collections import deque +import numpy as np class CILScope: def __init__(self, context): @@ -207,4 +208,89 @@ def dfs_visit_ts(context, u, list, visited): if u.parent is not None and u.parent not in visited: dfs_visit_ts(context, u.parent, list, visited) - list.append(u) \ No newline at end of file + list.append(u) + + +def bfs_init (context) : + table = {} + d = {} + d = init(context, d) + for c in context.types.values(): + list = deque() + list.append(c) + visit = [] + m = bfs( list, d.copy() , c,{}) + + table [c.name] = m + return table + +def bfs ( list, d ,s , m ): + d[s.name] = 0 + while (len(list) > 0): + u = list.pop() + if u.parent is not None: + v = u.parent + else : + v = None + while v is not None: + if d[v.name] == np.inf: + d[v.name] = d[s.name] + 1 + s = v + list.append(v) + + v = v.parent + return d + +def init (context,d): + for c in context.types.values(): + d [c.name] = np.inf + return d + +def table (table): + d = {} + for k in (table.keys()): + value = table[k] + for c in value.keys(): + if table[k][c] != np.inf and table[k][c] != 0: + + try: + d [c].append((k,table[k][c])) + except: + d [c] = [(k,table[k][c])] + return d + + +def order_case_branc_to(branchs, to): + d = {} + string = [] + list = [branch.type for branch in branchs] + for s in to : + string.append(s.name) + for s in string: + try: + d[s] = list.index(s) + except: + pass + return d + + +def valid_case (table, branchs): + valid = {} + for key in branchs.keys(): + try: + s = table[key] + except: + continue + order = sorted(s, key=lambda tu : tu[1]) + for m in order: + try: + valid[key].append(m[0]) + except: + valid[key] = [m[0]] + return valid + + + + + + \ No newline at end of file From c5a388b28f311e321b8ef9b0b25f58327e15ff17 Mon Sep 17 00:00:00 2001 From: Amy Date: Mon, 28 Feb 2022 10:21:03 -0500 Subject: [PATCH 63/81] unfinished second part of the case --- src/code_generator/ast_CIL.py | 6 ++- src/code_generator/cil_codegen.py | 4 ++ src/code_generator/generate_ast.py | 78 +++++++++++++++++++----------- src/code_generator/utils.py | 13 ++++- 4 files changed, 70 insertions(+), 31 deletions(-) diff --git a/src/code_generator/ast_CIL.py b/src/code_generator/ast_CIL.py index 9f7082a35..25d97a5b5 100644 --- a/src/code_generator/ast_CIL.py +++ b/src/code_generator/ast_CIL.py @@ -303,9 +303,11 @@ def __str__(self): class CILVariableNode(CILAtomicNode): - pass - + pass +class CILExceptionNode(CILAtomicNode): + pass + class CILTypeConstantNode(CILAtomicNode): pass diff --git a/src/code_generator/cil_codegen.py b/src/code_generator/cil_codegen.py index 59a5d4158..f82a09beb 100644 --- a/src/code_generator/cil_codegen.py +++ b/src/code_generator/cil_codegen.py @@ -159,6 +159,10 @@ def visit(self, node): def visit(self, node): return f'{node.lex}' + @visitor.when(CILExceptionNode) + def visit(self, node): + return f'{node.lex}' + @visitor.when(CILPlusNode) def visit(self, node: CILPlusNode): l = self.visit(node.left) diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 85f177873..1b09859cb 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -5,8 +5,7 @@ from .utils import * from cmp.semantic import IOType, IntType, StringType, BoolType, ObjectType import cmp.visitor as visitor -from itertools import chain -from collections import OrderedDict + class CIL: @@ -248,53 +247,76 @@ def visit(self, node): def visit(self, node): expr = self.visit(node.expr) self.expression_var_case = expr + + list, valid = return_list_valid_case(node,self.to,self.table) name = self.scope.add_new_local(node.expr.computed_type.name) var = CILVariableNode(name) + self.scope.instructions.append(CILAssignNode(var, expr)) expr_type_of = CILTypeOfNode(var) name_type_expr = self.scope.add_new_local(node.expr.computed_type.name) self.scope.instructions.append(CILAssignNode(CILVariableNode(name_type_expr), expr_type_of)) + name_return = self.scope.add_new_local(node.computed_type.name) return_ = CILVariableNode(name_return) + print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") + print("Listt: ------") + print(list) + print("valid-----") + print(valid) + print("node_casess----------") + for case in node.cases: + print(case.type) + keys = [branch.type for branch in node.cases] + #for case, index in zip(node.cases,range(0, len(node.cases))): + # if index != 0: + # self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index-1}')) - order = order_case_branc_to(node.cases,self.to) - valid = valid_case(self.table,order) - s = list(valid.values()) - iterator = chain(*s) - l = list(iterator) - m = list(OrderedDict.fromkeys(l)) - print(m) - - for case, index in zip(node.cases,range(0, len(node.cases))): - if index != 0: - self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index-1}')) - - case_expr_type_of = CILTypeConstantNode(case.type) - - #index = 0 - #for case in node.cases: - #s = m - #for new_branch in m : - # try: - # if new_branch in valid[case.type]: - #if index != 0: - #self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index-1}')) + #case_expr_type_of = CILTypeConstantNode(case.type) + index = 0 + for case in node.cases: + print("FORrrrrrrrrrrrrrrrrrrrrrrrrrrr") + print(case.type) + s = list name_var_condition = self.scope.add_new_local(None) var_condition = CILVariableNode(name_var_condition) + + if index != 0: + self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index - 1}')) case_expr_type_of = CILTypeConstantNode(case.type) self.scope.instructions.append(CILAssignNode(var_condition, CILNotEqualsNode(CILVariableNode(name_type_expr),case_expr_type_of))) + expr_attr = self.visit(case) + if index == len(node.cases) - 1: self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'case_end{self.scope.case_count}'))) else: self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'branch_{self.scope.case_count}_{index}'))) - - expr_attr = self.visit(case) - + self.scope.instructions.append(CILAssignNode(return_, expr_attr)) self.scope.instructions.append(CILGotoNode(CILLabelNode(f'case_end{self.scope.case_count}'))) - + index += 1 + for new_branch in s : + print("lolllllllllllllllllllllllllllllll") + print(new_branch) + try: + if new_branch not in keys and new_branch in valid[case.type]: + print("entrooooo") + print(new_branch) + case_expr_type_of = CILTypeConstantNode(new_branch) + self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index-1}')) + index +=1 + list.remove(new_branch) + if index == len(node.cases) - 1: + self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'case_end{self.scope.case_count}'))) + else: + self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'branch_{self.scope.case_count}_{index}'))) + self.scope.instructions.append(CILAssignNode(return_, expr_attr)) + self.scope.instructions.append(CILGotoNode(CILLabelNode(f'case_end{self.scope.case_count}'))) + except : + pass + self.scope.instructions.append(CILAssignNode(return_,CILExceptionNode("Exception in case "))) self.scope.instructions.append(CILLabelNode(f'case_end{ self.scope.case_count}')) self.scope.case_count += 1 return return_ diff --git a/src/code_generator/utils.py b/src/code_generator/utils.py index beab40e47..baeab7d7a 100644 --- a/src/code_generator/utils.py +++ b/src/code_generator/utils.py @@ -2,6 +2,8 @@ from .ast_CIL import * from collections import deque import numpy as np +from itertools import chain +from collections import OrderedDict class CILScope: def __init__(self, context): @@ -287,7 +289,16 @@ def valid_case (table, branchs): valid[key].append(m[0]) except: valid[key] = [m[0]] - return valid + return valid + +def return_list_valid_case(node, to, table ): + order = order_case_branc_to(node.cases,to) + valid = valid_case(table,order) + s = list(valid.values()) + iterator = chain(*s) + l = list(iterator) + m = list(OrderedDict.fromkeys(l)) + return m, valid From 2229ce9bdea0993e0fc560641baa28ab5210643a Mon Sep 17 00:00:00 2001 From: Amy Date: Mon, 28 Feb 2022 13:50:11 -0500 Subject: [PATCH 64/81] fix error --- src/code_generator/generate_ast.py | 61 ++++++++++++--------------- src/code_generator/spim_visitor.py | 1 - src/code_generator/utils.py | 4 +- src/test6.txt | 68 ++++++++++++++++++++++++++++++ 4 files changed, 97 insertions(+), 37 deletions(-) create mode 100644 src/test6.txt diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 1b09859cb..83260c338 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -247,8 +247,12 @@ def visit(self, node): def visit(self, node): expr = self.visit(node.expr) self.expression_var_case = expr - - list, valid = return_list_valid_case(node,self.to,self.table) + print("lolllllllllllllllllllllllllllllll") + order = order_case_branc_to(node.cases,self.to) + valid = valid_case(self.table,order) + print(valid) + print("lolllllllllllllllllllllllllllllll") + #list, valid = return_list_valid_case(node,self.to,self.table) name = self.scope.add_new_local(node.expr.computed_type.name) var = CILVariableNode(name) @@ -260,15 +264,7 @@ def visit(self, node): name_return = self.scope.add_new_local(node.computed_type.name) return_ = CILVariableNode(name_return) - print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") - print("Listt: ------") - print(list) - print("valid-----") - print(valid) - print("node_casess----------") - for case in node.cases: - print(case.type) - keys = [branch.type for branch in node.cases] + #for case, index in zip(node.cases,range(0, len(node.cases))): # if index != 0: # self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index-1}')) @@ -276,9 +272,6 @@ def visit(self, node): #case_expr_type_of = CILTypeConstantNode(case.type) index = 0 for case in node.cases: - print("FORrrrrrrrrrrrrrrrrrrrrrrrrrrr") - print(case.type) - s = list name_var_condition = self.scope.add_new_local(None) var_condition = CILVariableNode(name_var_condition) @@ -297,26 +290,26 @@ def visit(self, node): self.scope.instructions.append(CILAssignNode(return_, expr_attr)) self.scope.instructions.append(CILGotoNode(CILLabelNode(f'case_end{self.scope.case_count}'))) index += 1 - for new_branch in s : - print("lolllllllllllllllllllllllllllllll") - print(new_branch) - try: - if new_branch not in keys and new_branch in valid[case.type]: - print("entrooooo") - print(new_branch) - case_expr_type_of = CILTypeConstantNode(new_branch) - self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index-1}')) - index +=1 - list.remove(new_branch) - if index == len(node.cases) - 1: - self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'case_end{self.scope.case_count}'))) - else: - self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'branch_{self.scope.case_count}_{index}'))) - self.scope.instructions.append(CILAssignNode(return_, expr_attr)) - self.scope.instructions.append(CILGotoNode(CILLabelNode(f'case_end{self.scope.case_count}'))) - except : - pass - self.scope.instructions.append(CILAssignNode(return_,CILExceptionNode("Exception in case "))) + # for new_branch in s : + # print("lolllllllllllllllllllllllllllllll") + # print(new_branch) + # try: + # if new_branch not in keys and new_branch in valid[case.type]: + # print("entrooooo") + # print(new_branch) + # case_expr_type_of = CILTypeConstantNode(new_branch) + # self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index-1}')) + # index +=1 + # list.remove(new_branch) + # if index == len(node.cases) - 1: + # self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'case_end{self.scope.case_count}'))) + # else: + # self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'branch_{self.scope.case_count}_{index}'))) + # self.scope.instructions.append(CILAssignNode(return_, expr_attr)) + # self.scope.instructions.append(CILGotoNode(CILLabelNode(f'case_end{self.scope.case_count}'))) + # except : + # pass + #self.scope.instructions.append(CILAssignNode(return_,CILExceptionNode("Exception in case "))) self.scope.instructions.append(CILLabelNode(f'case_end{ self.scope.case_count}')) self.scope.case_count += 1 return return_ diff --git a/src/code_generator/spim_visitor.py b/src/code_generator/spim_visitor.py index 6d0c7bcb9..f17eb96e0 100644 --- a/src/code_generator/spim_visitor.py +++ b/src/code_generator/spim_visitor.py @@ -331,7 +331,6 @@ def visit(self, node: CILVariableNode, frame): @visitor.when(CILTypeConstantNode) def visit(self, node: CILTypeConstantNode, frame): - print('here') self.add_line('li $a0, 8') self.add_line('li $v0, 9') self.add_line('syscall') diff --git a/src/code_generator/utils.py b/src/code_generator/utils.py index baeab7d7a..3c560c516 100644 --- a/src/code_generator/utils.py +++ b/src/code_generator/utils.py @@ -286,9 +286,9 @@ def valid_case (table, branchs): order = sorted(s, key=lambda tu : tu[1]) for m in order: try: - valid[key].append(m[0]) + valid[key].append(m) except: - valid[key] = [m[0]] + valid[key] = [m] return valid def return_list_valid_case(node, to, table ): diff --git a/src/test6.txt b/src/test6.txt new file mode 100644 index 000000000..196512b72 --- /dev/null +++ b/src/test6.txt @@ -0,0 +1,68 @@ +(* hairy . . .*) + +class Foo inherits Bazz { + a : Razz <- case self of + n : Razz => (new Bar); + n : Foo => (new Razz); + n : Bar => n; + esac; + + b : Int <- a.doh() + g.doh() + doh() + printh(); + + doh() : Int { (let i : Int <- h in { h <- h + 2; i; } ) }; + +}; + +class Bar inherits Razz { + + c : Int <- doh(); + + d : Object <- printh(); +}; + + +class Razz inherits Foo { + + e : Bar <- case self of + n : Razz => (new Bar); + n : Bar => n; + esac; + + f : Int <- a@Bazz.doh() + g.doh() + e.doh() + doh() + printh(); + +}; + +class Bazz inherits IO { + + h : Int <- 1; + + g : Foo <- case self of + n : Bazz => (new Foo); + n : Razz => (new Bar); + n : Foo => (new Razz); + n : Bar => n; + esac; + + i : Object <- printh(); + + printh() : Int { { out_int(h); 0; } }; + + doh() : Int { (let i: Int <- h in { h <- h + 1; i; } ) }; +}; + +(* scary . . . *) +class Main { + a : Bazz <- new Bazz; + b : Foo <- new Foo; + c : Razz <- new Razz; + d : Bar <- new Bar; + + main(): String { "do nothing" }; + +}; + + + + + + From 1d31f02a6e13ca4b5c116c65d96ed05c12836671 Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Mon, 28 Feb 2022 17:08:53 -0500 Subject: [PATCH 65/81] Fix bugs with code generation for comparison operators and fix substr and in_string built in functions --- src/code_generator/mips_built_in.txt | 22 +- src/code_generator/saved.txt | 282 +- src/code_generator/spim_visitor.py | 5 +- src/code_generator/utils.py | 9 +- src/cool.py | 4 +- src/output.cil | 1664 +---- src/program.mips | 7621 ++++++++++++++++++++ src/result.s | 9866 +++++++++++++++++++++++--- 8 files changed, 16652 insertions(+), 2821 deletions(-) create mode 100644 src/program.mips diff --git a/src/code_generator/mips_built_in.txt b/src/code_generator/mips_built_in.txt index 68f98a02e..f5d866647 100644 --- a/src/code_generator/mips_built_in.txt +++ b/src/code_generator/mips_built_in.txt @@ -128,7 +128,7 @@ in_string_IO: la $t0, IO_Buffer sw $t0, 0($sp) addi $sp, $sp, -4 - jal strlen + jal strlen addi $sp, $sp, 4 lw $t0, 0($sp) # the length is now in $v0 @@ -146,9 +146,14 @@ in_string_IO: addi $t2, $t2, 1 bgtz $t3, in_string_IO_loop addi $t2, $t2, -2 + + li $t4, 10 + lb $t5, 0($t2) + bne $t5, $t4, in_string_IO_end li $t3, 0 sb $t3, 0($t2) + in_string_IO_end: move $t0, $v0 li $a0, 8 @@ -252,8 +257,9 @@ substr_String: lw $t7, 12($fp) # get the length perameter Int instance address lw $t2, 4($t7) # get the value of the Int - + move $a0, $t2 + addi $a0, $a0, 1 li $v0, 9 syscall # allocate memory for the substring value @@ -282,7 +288,7 @@ substr_String: j substr_String_loop2 substr_String_eloop2: - + sb $zero, 0($t4) move $t0, $v0 la $t1, String @@ -346,7 +352,7 @@ strlen: lw $a0, 12($fp) li $t0, 0 strlen_loop: - lb $t1, 0($a0) + lbu $t1, 0($a0) beqz $t1, strlen_exit addu $a0, $a0, 1 addu $t0, $t0, 1 @@ -445,8 +451,8 @@ compare: lw $t0, 4($t0) lw $t1, 4($t1) compare_str_loop: - lb $t3, 0($t0) - lb $t4, 0($t1) + lbu $t3, 0($t0) + lbu $t4, 0($t1) bne $t3, $t4, compare_false beq $t3, $zero, compare_true addi $t0, $t0, 1 @@ -528,7 +534,7 @@ concat_String: lw $t0, 4($t0) # the address of the value of the first String instance move $t1, $v0 # the address of the value of the result string concat_String_loop1: - lb $t3, 0($t0) + lbu $t3, 0($t0) beq $t3, $zero, concat_String_eloop1 sb $t3, 0($t1) addi $t0, $t0, 1 @@ -540,7 +546,7 @@ concat_String: lw $t0, 12($fp) lw $t0, 4($t0) concat_String_loop2: - lb $t3, 0($t0) + lbu $t3, 0($t0) beq $t3, $zero, concat_String_eloop2 sb $t3, 0($t1) addi $t0, $t0, 1 diff --git a/src/code_generator/saved.txt b/src/code_generator/saved.txt index bc97fec9b..8eae30c85 100644 --- a/src/code_generator/saved.txt +++ b/src/code_generator/saved.txt @@ -1,259 +1,57 @@ -abort_Object: - addu $sp, $sp, -4 +in_string_IO: + # calling conventions sw $ra, 0($sp) - - addu $sp, $sp, -4 - sw $fp, 0($sp) - - move $fp, $sp - - li $v0, 55 - la $a0, ObjectErrorMessage - li $a1, 0 - syscall - - li $v0, 17 - li $a0, 1 - syscall - - - lw $fp, 0($sp) - addu $sp, $sp, 4 - lw $ra, 0($sp) - addu $sp, $sp, 4 - jr $ra - -typename_Object: - addu $sp, $sp, -4 - sw $ra, 0($sp) - addu $sp, $sp, -4 + addi $sp, $sp, -4 sw $fp, 0($sp) + addi $sp, $sp, -4 move $fp, $sp - lw $t7, 12($fp) - lw $t6, 0($t7) - - lw $a0, 4($t6) - li $v0, 4 + # Read the string to the buffer + la $a0, IO_Buffer + li $a1, 1000 + li $v0, 8 syscall - - lw $fp, 0($sp) - addu $sp, $sp, 4 - lw $ra, 0($sp) - addu $sp, $sp, 4 - jr $ra - -copy_Object: - addu $sp, $sp, -4 - sw $ra, 0($sp) - addu $sp, $sp, -4 - sw $fp, 0($sp) - move $fp, $sp - - - lw $t7, 12($fp) # load the object address - lw $t6, 0($t7) # get the type info address - lw $t5, 0($t6) # get the size of the type + # get the length of the string to allocate the memory + la $t0, IO_Buffer + sw $t0, 0($sp) + addi $sp, $sp, -4 + jal strlen + addi $sp, $sp, 4 + lw $t0, 0($sp) # the length is now in $v0 - move $a0, $t5 + addi $v0, $v0, 1 + move $a0, $v0 li $v0, 9 - syscall - move $t6, $v0 -copy_Object_loop: - lw $t4, 0($t7) - sw $t4, 0($t6) - addu $t7, $t7, 4 - addu $t6, $t6, 4 - addu $t5, $t5, -4 - bgtz $t5, copy_Object_loop - - - lw $fp, 0($sp) - addu $sp, $sp, 4 - lw $ra, 0($sp) - addu $sp, $sp, 4 - jr $ra - -out_int_IO: - addu $sp, $sp, -4 - sw $ra, 0($sp) - addu $sp, $sp, -4 - sw $fp, 0($sp) - move $fp, $sp - - - lw $v1, 12($fp) - lw $a0, 4($v1) - li $v0, 1 - syscall - - - lw $fp, 0($sp) - addu $sp, $sp, 4 - lw $ra, 0($sp) - addu $sp, $sp, 4 - jr $ra - - - -strlen_String: - sw $ra, 0($sp) - addu $sp, $sp, -4 - sw $fp, 0($sp) - addu $sp, $sp, -4 - move $fp, $sp - - - lw $a0, 12($fp) - li $t0, 0 -srtlen_String_loop: - lb $t1, 0($a0) - beqz $t1, strlen_String_exit - addu $a0, $a0, 1 - addu $t0, $t0, 1 - j strlen_String_loop - strlen_String_exit: - move $v0, $t0 - - - lw $fp, 0($sp) - addu $sp, $sp, 4 - lw $ra, 0($sp) - addu $sp, $sp, 4 - jr $ra - -strcopy_String: - sw $ra, 0($sp) - addu $sp, $sp, -4 - sw $fp, 0($sp) - addu $sp, $sp, -4 - move $fp, $sp - - - lw $a0, 12($fp) - - sw $a0, 0($sp) # pass the string address as a parameter - addu $sp, $sp, -4 - jal strlen_String # len of the string at v0 - - # push v0 to stack and save the len - sw $v0, 0($sp) - addu $sp, $sp, -4 - - move $a0, $v0 # pass as argument the size to alloc - li $v0, 9 - syscall # v0 location of the dst string - - lw $v1, 12($fp) # load the source string address - move $t2, $v0 # copy the dst string address - -strcopy_String_loop: - lb $t0, 0($v1) # load the next char - sb $t0, 0($t2) # copy the char - addu $v1, $v1, 1 - addu $t2, $t2, 1 - bgtz $t0, strcopy_String_loop - - - lw $fp, 0($sp) - addu $sp, $sp, 4 - lw $ra, 0($sp) - addu $sp, $sp, 4 - jr $ra - -length_String: - sw $ra, 0($sp) - addu $sp, $sp, -4 - sw $fp, 0($sp) - addu $sp, $sp, -4 - move $fp, $sp - - lw $v0, 12($fp) # get the string instance address - lw $v1, 4($fp) # get the string value address - - sw $v1, 0($sp) - addu $sp, $sp, -4 - jal strlen_String # length at v0 - - - lw $fp, 0($sp) - addu $sp, $sp, 4 - lw $ra, 0($sp) - addu $sp, $sp, 4 - - jr $ra - -concat_String: - sw $ra, 0($sp) - addu $sp, $sp, -4 - sw $fp, 0($sp) - addu $sp, $sp, -4 - move $fp, $sp - - lw $v0, 16($fp) # first str instance address - sw $v0, 0($sp) # pass the instance - addu $sp, $sp, -4 - jal length_String - - sw $v0, 0($sp) # save the length of the first string - addu $sp, $sp, -4 - - lw $v0, 12($fp) # second str instance address - sw $v0, 0($sp) # pass the instance - addu $sp, $sp, -4 - jal length_String # second str lenght in $v0 - - lw $v1, 0($sp) # load the length of the first string - addu $sp, $sp, 4 - - addu $a0, $v1, $v0 - addu $a0, $a0, 1 - li $v0, 9 - syscall # allocate memory for the new string - - # the new string is at $v0 - lw $v1, 16($fp) + syscall # in $v0 is the address of the value string + + la $t1, IO_Buffer # copy the string value from the buffer to the heap move $t2, $v0 + in_string_IO_loop: + lb $t3, 0($t1) + sb $t3, 0($t2) + addi $t1, $t1, 1 + addi $t2, $t2, 1 + bgtz $t3, in_string_IO_loop + addi $t2, $t2, -2 + li $t3, 0 + sb $t3, 0($t2) + + move $t0, $v0 -concat_String_loop1: # copy the first string - lb $t0, 0($v1) # load the next char - beq $t0, $zero, concat_String_eloop1 - sb $t0, 0($t2) # copy the char - addu $v1, $v1, 1 - addu $t2, $t2, 1 - j concat_String_loop1 - -concat_String_eloop1: - lw $v1, 12($fp) - -concat_String_loop2: # copy the second string - lb $t0, 0($v1) # load the next char - sb $t0, 0($t2) # copy the char - addu $v1, $v1, 1 - addu $t2, $t2, 1 - bgtz $t0, concat_String_loop2 - - sw $v0, 0($sp) # save the address of the result string - addu $sp, $sp, -4 - - # allocate space for an String intance - li $v0, 9 li $a0, 8 - syscall # v0 is the address for the instance + li $v0, 9 + syscall - la $v1, String - sw $v1, 0($v0) # copy type info - - lw $v1, 0($sp) # load the address of the result string - addu $sp, $sp, 4 + la $t1, String + sw $t0, 4($v0) + sw $t1, 0($v0) - sw $v1, 4($v0) # copy value + # calling conventions + addi $sp, $sp, 4 lw $fp, 0($sp) - addu $sp, $sp, 4 + addi $sp, $sp, 4 lw $ra, 0($sp) - addu $sp, $sp, 4 + jr $ra - -substr_String: diff --git a/src/code_generator/spim_visitor.py b/src/code_generator/spim_visitor.py index f17eb96e0..8dfc8c14d 100644 --- a/src/code_generator/spim_visitor.py +++ b/src/code_generator/spim_visitor.py @@ -425,8 +425,9 @@ def visit(self, node: CILLessNode, frame): self.visit(node.left, frame) self.add_line(f'move $t1, $v0') # get the address to the left Int instance self.add_line(f'lw $t1, 4($t1)') # get the value of the instance - + self.gen_push('$t1') self.visit(node.right, frame) + self.gen_pop('$t1') self.add_line(f'move $t2, $v0') # get the address to the right Int instance self.add_line(f'lw $t2, 4($t2)') # get the value of the instance @@ -447,7 +448,9 @@ def visit(self, node: CILElessNode, frame): self.add_line(f'move $t1, $v0') # get the address to the left Int instance self.add_line(f'lw $t1, 4($t1)') # get the value of the instance + self.gen_push('$t1') self.visit(node.right, frame) + self.gen_pop('$t1') self.add_line(f'move $t2, $v0') # get the address to the right Int instance self.add_line(f'lw $t2, 4($t2)') # get the value of the instance diff --git a/src/code_generator/utils.py b/src/code_generator/utils.py index 3c560c516..f5f75f6d7 100644 --- a/src/code_generator/utils.py +++ b/src/code_generator/utils.py @@ -1,7 +1,6 @@ from cmp.semantic import IntType, ObjectType, StringType, BoolType from .ast_CIL import * from collections import deque -import numpy as np from itertools import chain from collections import OrderedDict @@ -235,7 +234,7 @@ def bfs ( list, d ,s , m ): else : v = None while v is not None: - if d[v.name] == np.inf: + if d[v.name] == -1: d[v.name] = d[s.name] + 1 s = v list.append(v) @@ -245,7 +244,7 @@ def bfs ( list, d ,s , m ): def init (context,d): for c in context.types.values(): - d [c.name] = np.inf + d [c.name] = -1 return d def table (table): @@ -253,7 +252,7 @@ def table (table): for k in (table.keys()): value = table[k] for c in value.keys(): - if table[k][c] != np.inf and table[k][c] != 0: + if table[k][c] != -1 and table[k][c] != 0: try: d [c].append((k,table[k][c])) @@ -304,4 +303,4 @@ def return_list_valid_case(node, to, table ): - \ No newline at end of file + diff --git a/src/cool.py b/src/cool.py index 7044e4dd6..dc164ddc5 100644 --- a/src/cool.py +++ b/src/cool.py @@ -62,6 +62,6 @@ #print(mips_codegen.code) with open(f'output.out', 'w') as f: f.write(mips_codegen.code) -# with open(f'{input_file[:-3]}.mips', 'w') as f: -# f.write(mips_codegen.code) +with open(f'{input_file[:-3]}.mips', 'w') as f: + f.write(mips_codegen.code) exit(0) diff --git a/src/output.cil b/src/output.cil index 2352eec84..bfa574fb0 100644 --- a/src/output.cil +++ b/src/output.cil @@ -1,155 +1,6 @@ .TYPES -type Graph { - attribute vertices; - attribute edges; - - method Init_Graph : Init_Graph; - method abort : abort_Object; - method type_name : type_name_Object; - method copy : copy_Object; - method add_vertice : add_vertice_Graph; - method print_E : print_E_Graph; - method print_V : print_V_Graph; -} - -type Vertice { - attribute num; - attribute out; - - method Init_Vertice : Init_Vertice; - method abort : abort_Object; - method type_name : type_name_Object; - method copy : copy_Object; - method out_string : out_string_IO; - method out_int : out_int_IO; - method in_string : in_string_IO; - method in_int : in_int_IO; - method outgoing : outgoing_Vertice; - method number : number_Vertice; - method init : init_Vertice; - method add_out : add_out_Vertice; - method print : print_Vertice; -} - -type Edge { - attribute from; - attribute to; - attribute weight; - - method Init_Edge : Init_Edge; - method abort : abort_Object; - method type_name : type_name_Object; - method copy : copy_Object; - method out_string : out_string_IO; - method out_int : out_int_IO; - method in_string : in_string_IO; - method in_int : in_int_IO; - method init : init_Edge; - method print : print_Edge; -} - -type EList { - attribute car; - - method Init_EList : Init_EList; - method abort : abort_Object; - method type_name : type_name_Object; - method copy : copy_Object; - method out_string : out_string_IO; - method out_int : out_int_IO; - method in_string : in_string_IO; - method in_int : in_int_IO; - method isNil : isNil_EList; - method head : head_EList; - method tail : tail_EList; - method cons : cons_EList; - method append : append_EList; - method print : print_EList; -} - -type ECons { - attribute car; - attribute cdr; - - method Init_ECons : Init_ECons; - method abort : abort_Object; - method type_name : type_name_Object; - method copy : copy_Object; - method out_string : out_string_IO; - method out_int : out_int_IO; - method in_string : in_string_IO; - method in_int : in_int_IO; - method isNil : isNil_ECons; - method head : head_ECons; - method tail : tail_ECons; - method cons : cons_EList; - method append : append_EList; - method print : print_ECons; - method init : init_ECons; -} - -type VList { - attribute car; - - method Init_VList : Init_VList; - method abort : abort_Object; - method type_name : type_name_Object; - method copy : copy_Object; - method out_string : out_string_IO; - method out_int : out_int_IO; - method in_string : in_string_IO; - method in_int : in_int_IO; - method isNil : isNil_VList; - method head : head_VList; - method tail : tail_VList; - method cons : cons_VList; - method print : print_VList; -} - -type VCons { - attribute car; - attribute cdr; - - method Init_VCons : Init_VCons; - method abort : abort_Object; - method type_name : type_name_Object; - method copy : copy_Object; - method out_string : out_string_IO; - method out_int : out_int_IO; - method in_string : in_string_IO; - method in_int : in_int_IO; - method isNil : isNil_VCons; - method head : head_VCons; - method tail : tail_VCons; - method cons : cons_VList; - method print : print_VCons; - method init : init_VCons; -} - -type Parse { - attribute boolop; - attribute rest; - - method Init_Parse : Init_Parse; - method abort : abort_Object; - method type_name : type_name_Object; - method copy : copy_Object; - method out_string : out_string_IO; - method out_int : out_int_IO; - method in_string : in_string_IO; - method in_int : in_int_IO; - method read_input : read_input_Parse; - method parse_line : parse_line_Parse; - method c2i : c2i_Parse; - method a2i : a2i_Parse; - method a2i_aux : a2i_aux_Parse; -} - type Main { - attribute boolop; - attribute rest; - attribute g; method Init_Main : Init_Main; method abort : abort_Object; @@ -159,22 +10,8 @@ type Main { method out_int : out_int_IO; method in_string : in_string_IO; method in_int : in_int_IO; - method read_input : read_input_Parse; - method parse_line : parse_line_Parse; - method c2i : c2i_Parse; - method a2i : a2i_Parse; - method a2i_aux : a2i_aux_Parse; method main : main_Main; -} - -type BoolOp { - - method Init_BoolOp : Init_BoolOp; - method abort : abort_Object; - method type_name : type_name_Object; - method copy : copy_Object; - method and : and_BoolOp; - method or : or_BoolOp; + method fib : fib_Main; } type Object { @@ -231,29 +68,8 @@ type IO { .DATA str_empty = ""; -str_0 = " ("; -str_1 = ","; -str_2 = ")"; -str_3 = "\n"; -str_4 = "\n"; -str_5 = "\n"; -str_6 = ""; -str_7 = "0"; -str_8 = "1"; -str_9 = "2"; -str_10 = "3"; -str_11 = "4"; -str_12 = "5"; -str_13 = "6"; -str_14 = "7"; -str_15 = "8"; -str_16 = "9"; -str_17 = "-"; -str_18 = " "; -str_19 = " "; -str_20 = ","; -str_21 = ""; -str_22 = ""; +str_0 = "Enter n to find nth fibonacci number!\n"; +str_1 = "\n"; .CODE @@ -273,10 +89,14 @@ function main { } -function add_vertice_Graph { - PARAM self_Graph; - PARAM v_4; +function main_Main { + PARAM self_Main; + LOCAL t_0; + LOCAL t_1; + LOCAL t_2; + LOCAL t_3; + LOCAL t_4; LOCAL t_5; LOCAL t_6; LOCAL t_7; @@ -284,1386 +104,71 @@ function add_vertice_Graph { LOCAL t_9; LOCAL t_10; LOCAL t_11; - LOCAL t_12; - LOCAL t_13; - LOCAL t_14; - LOCAL t_15; - t_5 = v_4; - ARG t_5; - t_6 = VCALL Vertice outgoing; - t_7 = t_6; - t_8 = GETATTR self_Graph edges; + t_0 = LOAD str_0; + t_1 = t_0; + ARG self_Main; + ARG t_1; + t_2 = VCALL Main out_string; + ARG self_Main; + t_3 = VCALL Main in_int; + t_4 = t_3; + ARG self_Main; + ARG t_4; + t_5 = VCALL Main fib; + t_6 = t_5; + ARG self_Main; + ARG t_6; + t_7 = VCALL Main out_int; + t_8 = LOAD str_1; t_9 = t_8; - ARG t_7; + ARG self_Main; ARG t_9; - t_10 = VCALL EList append; - SETATTR self_Graph edges t_10; - t_11 = GETATTR self_Graph vertices; - t_12 = t_11; - t_13 = v_4; - ARG t_12; - ARG t_13; - t_14 = VCALL VList cons; - SETATTR self_Graph vertices t_14; - t_15 = t_14; - RETURN t_15; + t_10 = VCALL Main out_string; + t_11 = t_10; + RETURN t_11; } -function print_E_Graph { - PARAM self_Graph; +function fib_Main { + PARAM self_Main; + PARAM i_12; + LOCAL a_13; + LOCAL b_14; + LOCAL c_15; LOCAL t_16; LOCAL t_17; LOCAL t_18; LOCAL t_19; - - t_16 = GETATTR self_Graph edges; - t_17 = t_16; - ARG t_17; - t_18 = VCALL EList print; - t_19 = t_18; - RETURN t_19; - -} - - -function print_V_Graph { - PARAM self_Graph; - LOCAL t_20; LOCAL t_21; LOCAL t_22; LOCAL t_23; - t_20 = GETATTR self_Graph vertices; - t_21 = t_20; - ARG t_21; - t_22 = VCALL VList print; - t_23 = t_22; - RETURN t_23; - -} - - -function Init_Graph { - PARAM self_Graph; - - LOCAL t_0; - LOCAL t_1; - LOCAL t_2; - LOCAL t_3; - - t_0 = ALLOCATE VList; - ARG t_0; - t_1 = VCALL VList Init_VList; - SETATTR self_Graph vertices t_1; - t_2 = ALLOCATE EList; - ARG t_2; - t_3 = VCALL EList Init_EList; - SETATTR self_Graph edges t_3; - RETURN self_Graph; - -} - - -function outgoing_Vertice { - PARAM self_Vertice; - - LOCAL t_26; - LOCAL t_27; - - t_26 = GETATTR self_Vertice out; - t_27 = t_26; - RETURN t_27; - -} - - -function number_Vertice { - PARAM self_Vertice; - - LOCAL t_28; - LOCAL t_29; - - t_28 = GETATTR self_Vertice num; - t_29 = t_28; - RETURN t_29; - -} - - -function init_Vertice { - PARAM self_Vertice; - PARAM n_30; - - LOCAL t_31; - - SETATTR self_Vertice num n_30; - t_31 = self_Vertice; - RETURN t_31; - -} - - -function add_out_Vertice { - PARAM self_Vertice; - PARAM s_32; - - LOCAL t_33; - LOCAL t_34; - LOCAL t_35; - LOCAL t_36; - LOCAL t_37; - - t_33 = GETATTR self_Vertice out; - t_34 = t_33; - t_35 = s_32; - ARG t_34; - ARG t_35; - t_36 = VCALL EList cons; - SETATTR self_Vertice out t_36; - t_37 = self_Vertice; - RETURN t_37; - -} - - -function print_Vertice { - PARAM self_Vertice; - - LOCAL t_38; - LOCAL t_39; - LOCAL t_40; - LOCAL t_41; - LOCAL t_42; - LOCAL t_43; - LOCAL t_44; - - t_38 = GETATTR self_Vertice num; - t_39 = t_38; - ARG self_Vertice; - ARG t_39; - t_40 = VCALL Vertice out_int; - t_41 = GETATTR self_Vertice out; - t_42 = t_41; - ARG t_42; - t_43 = VCALL EList print; - t_44 = t_43; - RETURN t_44; - -} - - -function Init_Vertice { - PARAM self_Vertice; - - LOCAL t_24; - LOCAL t_25; - - ARG self_Vertice; - self_Vertice = CALL Init_IO; - SETATTR self_Vertice num 0; - t_24 = ALLOCATE EList; - ARG t_24; - t_25 = VCALL EList Init_EList; - SETATTR self_Vertice out t_25; - RETURN self_Vertice; - -} - - -function init_Edge { - PARAM self_Edge; - PARAM f_45; - PARAM t_46; - PARAM w_47; - - LOCAL t_48; - - SETATTR self_Edge from f_45; - SETATTR self_Edge to t_46; - SETATTR self_Edge weight w_47; - t_48 = self_Edge; - RETURN t_48; - -} - - -function print_Edge { - PARAM self_Edge; - - LOCAL t_49; - LOCAL t_50; - LOCAL t_51; - LOCAL t_52; - LOCAL t_53; - LOCAL t_54; - LOCAL t_55; - LOCAL t_56; - LOCAL t_57; - LOCAL t_58; - LOCAL t_59; - LOCAL t_60; - LOCAL t_61; - LOCAL t_62; - LOCAL t_63; - LOCAL t_64; - LOCAL t_65; - LOCAL t_66; - LOCAL t_67; - - t_49 = LOAD str_0; - t_50 = t_49; - ARG self_Edge; - ARG t_50; - t_51 = VCALL Edge out_string; - t_52 = GETATTR self_Edge from; - t_53 = t_52; - ARG self_Edge; - ARG t_53; - t_54 = VCALL Edge out_int; - t_55 = LOAD str_1; - t_56 = t_55; - ARG self_Edge; - ARG t_56; - t_57 = VCALL Edge out_string; - t_58 = GETATTR self_Edge to; - t_59 = t_58; - ARG self_Edge; - ARG t_59; - t_60 = VCALL Edge out_int; - t_61 = LOAD str_2; - t_62 = t_61; - ARG self_Edge; - ARG t_62; - t_63 = VCALL Edge out_string; - t_64 = GETATTR self_Edge weight; - t_65 = t_64; - ARG self_Edge; - ARG t_65; - t_66 = VCALL Edge out_int; - t_67 = t_66; - RETURN t_67; - -} - - -function Init_Edge { - PARAM self_Edge; - - - ARG self_Edge; - self_Edge = CALL Init_IO; - SETATTR self_Edge from 0; - SETATTR self_Edge to 0; - SETATTR self_Edge weight 0; - RETURN self_Edge; - -} - - -function isNil_EList { - PARAM self_EList; - - LOCAL t_68; - LOCAL t_69; - - t_68 = 0 == 0; - t_69 = t_68; - RETURN t_69; - -} - - -function head_EList { - PARAM self_EList; - - LOCAL t_70; - LOCAL t_71; - LOCAL t_72; - - ARG self_EList; - t_70 = VCALL EList abort; - t_71 = GETATTR self_EList car; - t_72 = t_71; - RETURN t_72; - -} - - -function tail_EList { - PARAM self_EList; - - LOCAL t_73; - LOCAL t_74; - - ARG self_EList; - t_73 = VCALL EList abort; - t_74 = self_EList; - RETURN t_74; - -} - - -function cons_EList { - PARAM self_EList; - PARAM e_75; - - LOCAL t_76; - LOCAL t_77; - LOCAL t_78; - LOCAL t_79; - LOCAL t_80; - LOCAL t_81; - LOCAL t_82; - - t_76 = ALLOCATE ECons; - ARG t_76; - t_77 = VCALL ECons Init_ECons; - t_78 = t_77; - t_79 = e_75; - t_80 = self_EList; - ARG t_78; - ARG t_79; - ARG t_80; - t_81 = VCALL ECons init; - t_82 = t_81; - RETURN t_82; - -} - - -function append_EList { - PARAM self_EList; - PARAM l_83; - - LOCAL t_84; - LOCAL t_85; - LOCAL t_86; - LOCAL t_87; - LOCAL t_88; - LOCAL t_89; - LOCAL t_90; - LOCAL t_91; - LOCAL t_92; - LOCAL t_93; - LOCAL t_94; - LOCAL t_95; - - ARG self_EList; - t_84 = VCALL EList isNil; - t_85 = t_84; - IF t_85 GOTO then_0; - ARG self_EList; - t_87 = VCALL EList tail; - t_88 = t_87; - t_89 = l_83; - ARG t_88; - ARG t_89; - t_90 = VCALL EList append; - t_91 = t_90; - ARG self_EList; - t_92 = VCALL EList head; - t_93 = t_92; - ARG t_91; - ARG t_93; - t_94 = VCALL EList cons; - t_86 = t_94; - GOTO ifend_0; -then_0: - t_86 = l_83; -ifend_0: - t_95 = t_86; - RETURN t_95; - -} - - -function print_EList { - PARAM self_EList; - - LOCAL t_96; - LOCAL t_97; - LOCAL t_98; - LOCAL t_99; - - t_96 = LOAD str_3; - t_97 = t_96; - ARG self_EList; - ARG t_97; - t_98 = VCALL EList out_string; - t_99 = t_98; - RETURN t_99; - -} - - -function Init_EList { - PARAM self_EList; - - - ARG self_EList; - self_EList = CALL Init_IO; - RETURN self_EList; - -} - - -function isNil_ECons { - PARAM self_ECons; - - LOCAL t_100; - LOCAL t_101; - - t_100 = 0 == 1; - t_101 = t_100; - RETURN t_101; - -} - - -function head_ECons { - PARAM self_ECons; - - LOCAL t_102; - LOCAL t_103; - - t_102 = GETATTR self_ECons car; - t_103 = t_102; - RETURN t_103; - -} - - -function tail_ECons { - PARAM self_ECons; - - LOCAL t_104; - LOCAL t_105; - - t_104 = GETATTR self_ECons cdr; - t_105 = t_104; - RETURN t_105; - -} - - -function init_ECons { - PARAM self_ECons; - PARAM e_106; - PARAM rest_107; - - LOCAL t_108; - - SETATTR self_ECons car e_106; - SETATTR self_ECons cdr rest_107; - t_108 = self_ECons; - RETURN t_108; - -} - - -function print_ECons { - PARAM self_ECons; - - LOCAL t_109; - LOCAL t_110; - LOCAL t_111; - LOCAL t_112; - LOCAL t_113; - LOCAL t_114; - LOCAL t_115; - - t_109 = GETATTR self_ECons car; - t_110 = t_109; - ARG t_110; - t_111 = VCALL Edge print; - t_112 = GETATTR self_ECons cdr; - t_113 = t_112; - ARG t_113; - t_114 = VCALL EList print; - t_115 = t_114; - RETURN t_115; - -} - - -function Init_ECons { - PARAM self_ECons; - - - ARG self_ECons; - self_ECons = CALL Init_EList; - RETURN self_ECons; - -} - - -function isNil_VList { - PARAM self_VList; - - LOCAL t_116; - LOCAL t_117; - - t_116 = 0 == 0; - t_117 = t_116; - RETURN t_117; - -} - - -function head_VList { - PARAM self_VList; - - LOCAL t_118; - LOCAL t_119; - LOCAL t_120; - - ARG self_VList; - t_118 = VCALL VList abort; - t_119 = GETATTR self_VList car; - t_120 = t_119; - RETURN t_120; - -} - - -function tail_VList { - PARAM self_VList; - - LOCAL t_121; - LOCAL t_122; - - ARG self_VList; - t_121 = VCALL VList abort; - t_122 = self_VList; - RETURN t_122; - -} - - -function cons_VList { - PARAM self_VList; - PARAM v_123; - - LOCAL t_124; - LOCAL t_125; - LOCAL t_126; - LOCAL t_127; - LOCAL t_128; - LOCAL t_129; - LOCAL t_130; - - t_124 = ALLOCATE VCons; - ARG t_124; - t_125 = VCALL VCons Init_VCons; - t_126 = t_125; - t_127 = v_123; - t_128 = self_VList; - ARG t_126; - ARG t_127; - ARG t_128; - t_129 = VCALL VCons init; - t_130 = t_129; - RETURN t_130; - -} - - -function print_VList { - PARAM self_VList; - - LOCAL t_131; - LOCAL t_132; - LOCAL t_133; - LOCAL t_134; - - t_131 = LOAD str_4; - t_132 = t_131; - ARG self_VList; - ARG t_132; - t_133 = VCALL VList out_string; - t_134 = t_133; - RETURN t_134; - -} - - -function Init_VList { - PARAM self_VList; - - - ARG self_VList; - self_VList = CALL Init_IO; - RETURN self_VList; - -} - - -function isNil_VCons { - PARAM self_VCons; - - LOCAL t_135; - LOCAL t_136; - - t_135 = 0 == 1; - t_136 = t_135; - RETURN t_136; - -} - - -function head_VCons { - PARAM self_VCons; - - LOCAL t_137; - LOCAL t_138; - - t_137 = GETATTR self_VCons car; - t_138 = t_137; - RETURN t_138; - -} - - -function tail_VCons { - PARAM self_VCons; - - LOCAL t_139; - LOCAL t_140; - - t_139 = GETATTR self_VCons cdr; - t_140 = t_139; - RETURN t_140; - -} - - -function init_VCons { - PARAM self_VCons; - PARAM v_141; - PARAM rest_142; - - LOCAL t_143; - - SETATTR self_VCons car v_141; - SETATTR self_VCons cdr rest_142; - t_143 = self_VCons; - RETURN t_143; - -} - - -function print_VCons { - PARAM self_VCons; - - LOCAL t_144; - LOCAL t_145; - LOCAL t_146; - LOCAL t_147; - LOCAL t_148; - LOCAL t_149; - LOCAL t_150; - - t_144 = GETATTR self_VCons car; - t_145 = t_144; - ARG t_145; - t_146 = VCALL Vertice print; - t_147 = GETATTR self_VCons cdr; - t_148 = t_147; - ARG t_148; - t_149 = VCALL VList print; - t_150 = t_149; - RETURN t_150; - -} - - -function Init_VCons { - PARAM self_VCons; - - - ARG self_VCons; - self_VCons = CALL Init_VList; - RETURN self_VCons; - -} - - -function read_input_Parse { - PARAM self_Parse; - - LOCAL g_153; - LOCAL t_154; - LOCAL t_155; - LOCAL line_156; - LOCAL t_157; - LOCAL t_158; - LOCAL t_159; - LOCAL t_160; - LOCAL t_161; - LOCAL t_162; - LOCAL t_163; - LOCAL t_164; - LOCAL t_165; - LOCAL t_166; - LOCAL t_167; - LOCAL t_168; - LOCAL t_169; - LOCAL t_170; - LOCAL t_171; - LOCAL t_172; - LOCAL t_173; - LOCAL t_174; - LOCAL t_175; - LOCAL t_176; - LOCAL t_177; - LOCAL t_178; - LOCAL t_179; - - t_154 = ALLOCATE Graph; - ARG t_154; - t_155 = VCALL Graph Init_Graph; - g_153 = t_155; - ARG self_Parse; - t_157 = VCALL Parse in_string; - line_156 = t_157; + a_13 = 1; + b_14 = 0; + c_15 = 0; while_0: - t_158 = GETATTR self_Parse boolop; - t_159 = t_158; - t_160 = LOAD str_5; - t_161 = line_156 == t_160; - t_162 = t_161; - t_163 = ; - t_164 = t_163; - t_165 = LOAD str_6; - t_166 = line_156 == t_165; - t_167 = t_166; - t_168 = ; - t_169 = t_168; - ARG t_159; - ARG t_164; - ARG t_169; - t_170 = VCALL BoolOp and; - t_171 = t_170; - IF t_171 GOTO body_0; + t_16 = i_12 == 0; + t_17 = t_16; + t_18 = ; + t_19 = t_18; + IF t_19 GOTO body_0; GOTO pool_0; body_0: - t_173 = g_153; - t_174 = line_156; - ARG self_Parse; - ARG t_174; - t_175 = VCALL Parse parse_line; - t_176 = t_175; - ARG t_173; - ARG t_176; - t_177 = VCALL Graph add_vertice; - ARG self_Parse; - t_178 = VCALL Parse in_string; - line_156 = t_178; - t_172 = line_156; + t_21 = a_13 + b_14; + c_15 = t_21; + t_22 = i_12 - 1; + i_12 = t_22; + b_14 = a_13; + a_13 = c_15; + t_20 = a_13; GOTO while_0; pool_0: - t_179 = g_153; - RETURN t_179; - -} - - -function parse_line_Parse { - PARAM self_Parse; - PARAM s_180; - - LOCAL v_181; - LOCAL t_182; - LOCAL t_183; - LOCAL t_184; - LOCAL t_185; - LOCAL t_186; - LOCAL t_187; - LOCAL t_188; - LOCAL t_189; - LOCAL t_190; - LOCAL t_191; - LOCAL t_192; - LOCAL t_193; - LOCAL t_194; - LOCAL t_195; - LOCAL t_196; - LOCAL succ_197; - LOCAL t_198; - LOCAL t_199; - LOCAL t_200; - LOCAL weight_201; - LOCAL t_202; - LOCAL t_203; - LOCAL t_204; - LOCAL t_205; - LOCAL t_206; - LOCAL t_207; - LOCAL t_208; - LOCAL t_209; - LOCAL t_210; - LOCAL t_211; - LOCAL t_212; - LOCAL t_213; - LOCAL t_214; - LOCAL t_215; - LOCAL t_216; - LOCAL t_217; - - t_182 = ALLOCATE Vertice; - ARG t_182; - t_183 = VCALL Vertice Init_Vertice; - t_184 = t_183; - t_185 = s_180; - ARG self_Parse; - ARG t_185; - t_186 = VCALL Parse a2i; - t_187 = t_186; - ARG t_184; - ARG t_187; - t_188 = VCALL Vertice init; - v_181 = t_188; -while_1: - t_189 = GETATTR self_Parse rest; - t_190 = t_189; - ARG t_190; - t_191 = VCALL String length; - t_192 = t_191 == 0; - t_193 = t_192; - t_194 = ; - t_195 = t_194; - IF t_195 GOTO body_1; - GOTO pool_1; -body_1: - t_198 = GETATTR self_Parse rest; - t_199 = t_198; - ARG self_Parse; - ARG t_199; - t_200 = VCALL Parse a2i; - succ_197 = t_200; - t_202 = GETATTR self_Parse rest; - t_203 = t_202; - ARG self_Parse; - ARG t_203; - t_204 = VCALL Parse a2i; - weight_201 = t_204; - t_205 = v_181; - t_206 = ALLOCATE Edge; - ARG t_206; - t_207 = VCALL Edge Init_Edge; - t_208 = t_207; - t_209 = v_181; - ARG t_209; - t_210 = VCALL Vertice number; - t_211 = t_210; - t_212 = succ_197; - t_213 = weight_201; - ARG t_208; - ARG t_211; - ARG t_212; - ARG t_213; - t_214 = VCALL Edge init; - t_215 = t_214; - ARG t_205; - ARG t_215; - t_216 = VCALL Vertice add_out; - t_196 = t_216; - GOTO while_1; -pool_1: - t_217 = v_181; - RETURN t_217; - -} - - -function c2i_Parse { - PARAM self_Parse; - PARAM char_218; - - LOCAL t_219; - LOCAL t_220; - LOCAL t_221; - LOCAL t_222; - LOCAL t_223; - LOCAL t_224; - LOCAL t_225; - LOCAL t_226; - LOCAL t_227; - LOCAL t_228; - LOCAL t_229; - LOCAL t_230; - LOCAL t_231; - LOCAL t_232; - LOCAL t_233; - LOCAL t_234; - LOCAL t_235; - LOCAL t_236; - LOCAL t_237; - LOCAL t_238; - LOCAL t_239; - LOCAL t_240; - LOCAL t_241; - LOCAL t_242; - LOCAL t_243; - LOCAL t_244; - LOCAL t_245; - LOCAL t_246; - LOCAL t_247; - LOCAL t_248; - LOCAL t_249; - LOCAL t_250; - LOCAL t_251; - LOCAL t_252; - LOCAL t_253; - LOCAL t_254; - LOCAL t_255; - LOCAL t_256; - LOCAL t_257; - LOCAL t_258; - LOCAL t_259; - LOCAL t_260; - - t_219 = LOAD str_7; - t_220 = char_218 == t_219; - t_221 = t_220; - IF t_221 GOTO then_1; - t_223 = LOAD str_8; - t_224 = char_218 == t_223; - t_225 = t_224; - IF t_225 GOTO then_2; - t_227 = LOAD str_9; - t_228 = char_218 == t_227; - t_229 = t_228; - IF t_229 GOTO then_3; - t_231 = LOAD str_10; - t_232 = char_218 == t_231; - t_233 = t_232; - IF t_233 GOTO then_4; - t_235 = LOAD str_11; - t_236 = char_218 == t_235; - t_237 = t_236; - IF t_237 GOTO then_5; - t_239 = LOAD str_12; - t_240 = char_218 == t_239; - t_241 = t_240; - IF t_241 GOTO then_6; - t_243 = LOAD str_13; - t_244 = char_218 == t_243; - t_245 = t_244; - IF t_245 GOTO then_7; - t_247 = LOAD str_14; - t_248 = char_218 == t_247; - t_249 = t_248; - IF t_249 GOTO then_8; - t_251 = LOAD str_15; - t_252 = char_218 == t_251; - t_253 = t_252; - IF t_253 GOTO then_9; - t_255 = LOAD str_16; - t_256 = char_218 == t_255; - t_257 = t_256; - IF t_257 GOTO then_10; - ARG self_Parse; - t_259 = VCALL Parse abort; - t_258 = 0; - GOTO ifend_10; -then_10: - t_258 = 9; -ifend_10: - t_254 = t_258; - GOTO ifend_9; -then_9: - t_254 = 8; -ifend_9: - t_250 = t_254; - GOTO ifend_8; -then_8: - t_250 = 7; -ifend_8: - t_246 = t_250; - GOTO ifend_7; -then_7: - t_246 = 6; -ifend_7: - t_242 = t_246; - GOTO ifend_6; -then_6: - t_242 = 5; -ifend_6: - t_238 = t_242; - GOTO ifend_5; -then_5: - t_238 = 4; -ifend_5: - t_234 = t_238; - GOTO ifend_4; -then_4: - t_234 = 3; -ifend_4: - t_230 = t_234; - GOTO ifend_3; -then_3: - t_230 = 2; -ifend_3: - t_226 = t_230; - GOTO ifend_2; -then_2: - t_226 = 1; -ifend_2: - t_222 = t_226; - GOTO ifend_1; -then_1: - t_222 = 0; -ifend_1: - t_260 = t_222; - RETURN t_260; - -} - - -function a2i_Parse { - PARAM self_Parse; - PARAM s_261; - - LOCAL t_262; - LOCAL t_263; - LOCAL t_264; - LOCAL t_265; - LOCAL t_266; - LOCAL t_267; - LOCAL t_268; - LOCAL t_269; - LOCAL t_270; - LOCAL t_271; - LOCAL t_272; - LOCAL t_273; - LOCAL t_274; - LOCAL t_275; - LOCAL t_276; - LOCAL t_277; - LOCAL t_278; - LOCAL t_279; - LOCAL t_280; - LOCAL t_281; - LOCAL t_282; - LOCAL t_283; - LOCAL t_284; - LOCAL t_285; - LOCAL t_286; - LOCAL t_287; - LOCAL t_288; - LOCAL t_289; - LOCAL t_290; - LOCAL t_291; - LOCAL t_292; - LOCAL t_293; - LOCAL t_294; - LOCAL t_295; - LOCAL t_296; - LOCAL t_297; - LOCAL t_298; - LOCAL t_299; - LOCAL t_300; - LOCAL t_301; - LOCAL t_302; - LOCAL t_303; - LOCAL t_304; - LOCAL t_305; - - t_262 = s_261; - ARG t_262; - t_263 = VCALL String length; - t_264 = t_263 == 0; - t_265 = t_264; - IF t_265 GOTO then_11; - t_267 = s_261; - t_268 = 0; - t_269 = 1; - ARG t_267; - ARG t_268; - ARG t_269; - t_270 = VCALL String substr; - t_271 = LOAD str_17; - t_272 = t_270 == t_271; - t_273 = t_272; - IF t_273 GOTO then_12; - t_275 = s_261; - t_276 = 0; - t_277 = 1; - ARG t_275; - ARG t_276; - ARG t_277; - t_278 = VCALL String substr; - t_279 = LOAD str_18; - t_280 = t_278 == t_279; - t_281 = t_280; - IF t_281 GOTO then_13; - t_283 = s_261; - ARG self_Parse; - ARG t_283; - t_284 = VCALL Parse a2i_aux; - t_282 = t_284; - GOTO ifend_13; -then_13: - t_285 = s_261; - t_286 = 1; - t_287 = s_261; - ARG t_287; - t_288 = VCALL String length; - t_289 = t_288 - 1; - t_290 = t_289; - ARG t_285; - ARG t_286; - ARG t_290; - t_291 = VCALL String substr; - t_292 = t_291; - ARG self_Parse; - ARG t_292; - t_293 = VCALL Parse a2i; - t_282 = t_293; -ifend_13: - t_274 = t_282; - GOTO ifend_12; -then_12: - t_294 = s_261; - t_295 = 1; - t_296 = s_261; - ARG t_296; - t_297 = VCALL String length; - t_298 = t_297 - 1; - t_299 = t_298; - ARG t_294; - ARG t_295; - ARG t_299; - t_300 = VCALL String substr; - t_301 = t_300; - ARG self_Parse; - ARG t_301; - t_302 = VCALL Parse a2i_aux; - t_303 = t_302; - t_304 = 0 - t_303; - t_274 = t_304; -ifend_12: - t_266 = t_274; - GOTO ifend_11; -then_11: - t_266 = 0; -ifend_11: - t_305 = t_266; - RETURN t_305; - -} - - -function a2i_aux_Parse { - PARAM self_Parse; - PARAM s_306; - - LOCAL int_307; - LOCAL j_308; - LOCAL t_309; - LOCAL t_310; - LOCAL i_311; - LOCAL t_312; - LOCAL t_313; - LOCAL t_314; - LOCAL c_315; - LOCAL t_316; - LOCAL t_317; - LOCAL t_318; - LOCAL t_319; - LOCAL t_320; - LOCAL t_321; - LOCAL t_322; - LOCAL t_323; - LOCAL t_324; - LOCAL t_325; - LOCAL t_326; - LOCAL t_327; - LOCAL t_328; - LOCAL t_329; - LOCAL t_330; - LOCAL t_331; - LOCAL t_332; - LOCAL t_333; - LOCAL t_334; - LOCAL t_335; - LOCAL t_336; - LOCAL t_337; - LOCAL t_338; - LOCAL t_339; - LOCAL t_340; - LOCAL t_341; - LOCAL t_342; - LOCAL t_343; - LOCAL t_344; - LOCAL t_345; - LOCAL t_346; - LOCAL t_347; - LOCAL t_348; - LOCAL t_349; - LOCAL t_350; - LOCAL t_351; - LOCAL t_352; - LOCAL t_353; - LOCAL t_354; - LOCAL t_355; - LOCAL t_356; - LOCAL t_357; - LOCAL t_358; - LOCAL t_359; - LOCAL t_360; - - int_307 = 0; - t_309 = s_306; - ARG t_309; - t_310 = VCALL String length; - j_308 = t_310; - i_311 = 0; -while_2: - t_312 = i_311 < j_308; - t_313 = t_312; - IF t_313 GOTO body_2; - GOTO pool_2; -body_2: - t_316 = s_306; - t_317 = i_311; - t_318 = 1; - ARG t_316; - ARG t_317; - ARG t_318; - t_319 = VCALL String substr; - c_315 = t_319; - t_320 = LOAD str_19; - t_321 = c_315 == t_320; - t_322 = t_321; - IF t_322 GOTO then_14; - t_324 = LOAD str_20; - t_325 = c_315 == t_324; - t_326 = t_325; - IF t_326 GOTO then_15; - t_328 = int_307 * 10; - t_329 = s_306; - t_330 = i_311; - t_331 = 1; - ARG t_329; - ARG t_330; - ARG t_331; - t_332 = VCALL String substr; - t_333 = t_332; - ARG self_Parse; - ARG t_333; - t_334 = VCALL Parse c2i; - t_335 = t_328 + t_334; - int_307 = t_335; - t_336 = i_311 + 1; - i_311 = t_336; - t_337 = i_311 == j_308; - t_338 = t_337; - IF t_338 GOTO then_16; - t_340 = LOAD str_21; - t_339 = t_340; - GOTO ifend_16; -then_16: - t_341 = LOAD str_22; - SETATTR self_Parse rest t_341; - t_339 = t_341; -ifend_16: - t_327 = t_339; - GOTO ifend_15; -then_15: - t_342 = s_306; - t_343 = i_311 + 1; - t_344 = t_343; - t_345 = s_306; - ARG t_345; - t_346 = VCALL String length; - t_347 = t_346 - i_311; - t_348 = t_347 - 1; - t_349 = t_348; - ARG t_342; - ARG t_344; - ARG t_349; - t_350 = VCALL String substr; - SETATTR self_Parse rest t_350; - i_311 = j_308; - t_327 = i_311; -ifend_15: - t_323 = t_327; - GOTO ifend_14; -then_14: - t_351 = s_306; - t_352 = i_311 + 1; - t_353 = t_352; - t_354 = s_306; - ARG t_354; - t_355 = VCALL String length; - t_356 = t_355 - i_311; - t_357 = t_356 - 1; - t_358 = t_357; - ARG t_351; - ARG t_353; - ARG t_358; - t_359 = VCALL String substr; - SETATTR self_Parse rest t_359; - i_311 = j_308; - t_323 = i_311; -ifend_14: - t_314 = t_323; - GOTO while_2; -pool_2: - t_360 = int_307; - RETURN t_360; - -} - - -function Init_Parse { - PARAM self_Parse; - - LOCAL t_151; - LOCAL t_152; - LOCAL t_361; - - ARG self_Parse; - self_Parse = CALL Init_IO; - t_151 = ALLOCATE BoolOp; - ARG t_151; - t_152 = VCALL BoolOp Init_BoolOp; - SETATTR self_Parse boolop t_152; - t_361 = LOAD str_empty; - SETATTR self_Parse rest t_361; - RETURN self_Parse; - -} - - -function main_Main { - PARAM self_Main; - - LOCAL t_363; - LOCAL t_364; - LOCAL t_365; - LOCAL t_366; - LOCAL t_367; - LOCAL t_368; - LOCAL t_369; - - t_363 = GETATTR self_Main g; - t_364 = t_363; - ARG t_364; - t_365 = VCALL Graph print_V; - t_366 = GETATTR self_Main g; - t_367 = t_366; - ARG t_367; - t_368 = VCALL Graph print_E; - t_369 = t_368; - RETURN t_369; + t_23 = c_15; + RETURN t_23; } @@ -1671,75 +176,14 @@ function main_Main { function Init_Main { PARAM self_Main; - LOCAL t_362; ARG self_Main; - self_Main = CALL Init_Parse; - ARG self_Main; - t_362 = VCALL Main read_input; - SETATTR self_Main g t_362; + self_Main = CALL Init_IO; RETURN self_Main; } -function and_BoolOp { - PARAM self_BoolOp; - PARAM b1_370; - PARAM b2_371; - - LOCAL t_372; - LOCAL t_373; - LOCAL t_374; - LOCAL t_375; - - t_372 = b1_370; - IF t_372 GOTO then_17; - t_374 = 0 == 1; - t_373 = t_374; - GOTO ifend_17; -then_17: - t_373 = b2_371; -ifend_17: - t_375 = t_373; - RETURN t_375; - -} - - -function or_BoolOp { - PARAM self_BoolOp; - PARAM b1_376; - PARAM b2_377; - - LOCAL t_378; - LOCAL t_379; - LOCAL t_380; - LOCAL t_381; - - t_378 = b1_376; - IF t_378 GOTO then_18; - t_379 = b2_377; - GOTO ifend_18; -then_18: - t_380 = 0 == 0; - t_379 = t_380; -ifend_18: - t_381 = t_379; - RETURN t_381; - -} - - -function Init_BoolOp { - PARAM self_BoolOp; - - - RETURN self_BoolOp; - -} - - function Init_Object { PARAM self; diff --git a/src/program.mips b/src/program.mips new file mode 100644 index 000000000..6d839418f --- /dev/null +++ b/src/program.mips @@ -0,0 +1,7621 @@ + .data + .align 4 +type: .word 8 + + .data +_Graph: .asciiz "Graph\n" + .data + .align 4 +Graph: .word 12 _Graph Init_Graph abort_Object type_name_Object copy_Object add_vertice_Graph print_E_Graph print_V_Graph + + .data +_Vertice: .asciiz "Vertice\n" + .data + .align 4 +Vertice: .word 12 _Vertice Init_Vertice abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO outgoing_Vertice number_Vertice init_Vertice add_out_Vertice print_Vertice + + .data +_Edge: .asciiz "Edge\n" + .data + .align 4 +Edge: .word 16 _Edge Init_Edge abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO init_Edge print_Edge + + .data +_EList: .asciiz "EList\n" + .data + .align 4 +EList: .word 8 _EList Init_EList abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO isNil_EList head_EList tail_EList cons_EList append_EList print_EList + + .data +_ECons: .asciiz "ECons\n" + .data + .align 4 +ECons: .word 12 _ECons Init_ECons abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO isNil_ECons head_ECons tail_ECons cons_EList append_EList print_ECons init_ECons + + .data +_VList: .asciiz "VList\n" + .data + .align 4 +VList: .word 8 _VList Init_VList abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO isNil_VList head_VList tail_VList cons_VList print_VList + + .data +_VCons: .asciiz "VCons\n" + .data + .align 4 +VCons: .word 12 _VCons Init_VCons abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO isNil_VCons head_VCons tail_VCons cons_VList print_VCons init_VCons + + .data +_Parse: .asciiz "Parse\n" + .data + .align 4 +Parse: .word 12 _Parse Init_Parse abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO read_input_Parse parse_line_Parse c2i_Parse a2i_Parse a2i_aux_Parse + + .data +_Main: .asciiz "Main\n" + .data + .align 4 +Main: .word 16 _Main Init_Main abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO read_input_Parse parse_line_Parse c2i_Parse a2i_Parse a2i_aux_Parse main_Main + + .data +_BoolOp: .asciiz "BoolOp\n" + .data + .align 4 +BoolOp: .word 4 _BoolOp Init_BoolOp abort_Object type_name_Object copy_Object and_BoolOp or_BoolOp + + .data +_Object: .asciiz "Object\n" + .data + .align 4 +Object: .word 4 _Object Init_Object abort_Object type_name_Object copy_Object + + .data +_Int: .asciiz "Int\n" + .data + .align 4 +Int: .word 8 _Int Init_Int abort_Object type_name_Object copy_Object + + .data +_String: .asciiz "String\n" + .data + .align 4 +String: .word 8 _String Init_String abort_Object type_name_Object copy_Object length_String concat_String substr_String + + .data +_Bool: .asciiz "Bool\n" + .data + .align 4 +Bool: .word 8 _Bool Init_Bool abort_Object type_name_Object copy_Object + + .data +_IO: .asciiz "IO\n" + .data + .align 4 +IO: .word 4 _IO Init_IO abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO + + .data +ObjectAbortMessage : .asciiz "Abort called from class " + .data +IO_Buffer : .space 1001 + .data +str_empty: .asciiz "" + + .data +str_0: .asciiz " (" + + .data +str_1: .asciiz "," + + .data +str_2: .asciiz ")" + + .data +str_3: .asciiz "\n" + + .data +str_4: .asciiz "\n" + + .data +str_5: .asciiz "\n" + + .data +str_6: .asciiz "" + + .data +str_7: .asciiz "0" + + .data +str_8: .asciiz "1" + + .data +str_9: .asciiz "2" + + .data +str_10: .asciiz "3" + + .data +str_11: .asciiz "4" + + .data +str_12: .asciiz "5" + + .data +str_13: .asciiz "6" + + .data +str_14: .asciiz "7" + + .data +str_15: .asciiz "8" + + .data +str_16: .asciiz "9" + + .data +str_17: .asciiz "-" + + .data +str_18: .asciiz " " + + .data +str_19: .asciiz " " + + .data +str_20: .asciiz "," + + .data +str_21: .asciiz "" + + .data +str_22: .asciiz "" + + .text +main: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 12 + + # assign (add here the expr.to_string) to m0 + li $a0, 16 + li $v0, 9 + syscall + la $a0, Main + sw $a0, 0($v0) + sw $v0, -0($fp) + + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to m1 + # calling the method Init_Main of type Main + #load the variable m0 + lw $v0, -0($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -4($fp) + + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to m2 + # calling the method main of type Main + #load the variable m1 + lw $v0, -4($fp) + lw $t0, 0($v0) + lw $v1, 60($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -8($fp) + + # return the value of the function in the register $v0 + #load the variable m2 + lw $v0, -8($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 12 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + li $v0, 10 + syscall + + .text +add_vertice_Graph: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 44 + + # assign (add here the expr.to_string) to t_5 + #load the variable v_4 + lw $v0, 12($fp) + sw $v0, -0($fp) + + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_6 + # calling the method outgoing of type Vertice + #load the variable t_5 + lw $v0, -0($fp) + lw $t0, 0($v0) + lw $v1, 40($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_7 + #load the variable t_6 + lw $v0, -4($fp) + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_8 + lw $v1, 16($fp) + lw $v0, 8($v1) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_9 + #load the variable t_8 + lw $v0, -12($fp) + sw $v0, -16($fp) + + lw $v0, -8($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_10 + # calling the method append of type EList + #load the variable t_7 + lw $v0, -8($fp) + lw $t0, 0($v0) + lw $v1, 56($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -20($fp) + + # Setting value of the attribute edges in the instance self_Graph to t_10 + #load the variable t_10 + lw $v0, -20($fp) + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 8($v1) + + # assign (add here the expr.to_string) to t_11 + lw $v1, 16($fp) + lw $v0, 4($v1) + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_12 + #load the variable t_11 + lw $v0, -24($fp) + sw $v0, -28($fp) + + # assign (add here the expr.to_string) to t_13 + #load the variable v_4 + lw $v0, 12($fp) + sw $v0, -32($fp) + + lw $v0, -28($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -32($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_14 + # calling the method cons of type VList + #load the variable t_12 + lw $v0, -28($fp) + lw $t0, 0($v0) + lw $v1, 52($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -36($fp) + + # Setting value of the attribute vertices in the instance self_Graph to t_14 + #load the variable t_14 + lw $v0, -36($fp) + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 4($v1) + + # assign (add here the expr.to_string) to t_15 + #load the variable t_14 + lw $v0, -36($fp) + sw $v0, -40($fp) + + # return the value of the function in the register $v0 + #load the variable t_15 + lw $v0, -40($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 44 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +print_E_Graph: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 16 + + # assign (add here the expr.to_string) to t_16 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_17 + #load the variable t_16 + lw $v0, -0($fp) + sw $v0, -4($fp) + + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_18 + # calling the method print of type EList + #load the variable t_17 + lw $v0, -4($fp) + lw $t0, 0($v0) + lw $v1, 60($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_19 + #load the variable t_18 + lw $v0, -8($fp) + sw $v0, -12($fp) + + # return the value of the function in the register $v0 + #load the variable t_19 + lw $v0, -12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 16 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +print_V_Graph: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 16 + + # assign (add here the expr.to_string) to t_20 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_21 + #load the variable t_20 + lw $v0, -0($fp) + sw $v0, -4($fp) + + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_22 + # calling the method print of type VList + #load the variable t_21 + lw $v0, -4($fp) + lw $t0, 0($v0) + lw $v1, 56($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_23 + #load the variable t_22 + lw $v0, -8($fp) + sw $v0, -12($fp) + + # return the value of the function in the register $v0 + #load the variable t_23 + lw $v0, -12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 16 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_Graph: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 16 + + # assign (add here the expr.to_string) to t_0 + li $a0, 8 + li $v0, 9 + syscall + la $a0, VList + sw $a0, 0($v0) + sw $v0, -0($fp) + + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_1 + # calling the method Init_VList of type VList + #load the variable t_0 + lw $v0, -0($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -4($fp) + + # Setting value of the attribute vertices in the instance self_Graph to t_1 + #load the variable t_1 + lw $v0, -4($fp) + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 4($v1) + + # assign (add here the expr.to_string) to t_2 + li $a0, 8 + li $v0, 9 + syscall + la $a0, EList + sw $a0, 0($v0) + sw $v0, -8($fp) + + lw $v0, -8($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_3 + # calling the method Init_EList of type EList + #load the variable t_2 + lw $v0, -8($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -12($fp) + + # Setting value of the attribute edges in the instance self_Graph to t_3 + #load the variable t_3 + lw $v0, -12($fp) + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 8($v1) + + # return the value of the function in the register $v0 + #load the variable self_Graph + lw $v0, 12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 16 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +outgoing_Vertice: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 8 + + # assign (add here the expr.to_string) to t_26 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_27 + #load the variable t_26 + lw $v0, -0($fp) + sw $v0, -4($fp) + + # return the value of the function in the register $v0 + #load the variable t_27 + lw $v0, -4($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 8 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +number_Vertice: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 8 + + # assign (add here the expr.to_string) to t_28 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_29 + #load the variable t_28 + lw $v0, -0($fp) + sw $v0, -4($fp) + + # return the value of the function in the register $v0 + #load the variable t_29 + lw $v0, -4($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 8 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +init_Vertice: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 4 + + # Setting value of the attribute num in the instance self_Vertice to n_30 + #load the variable n_30 + lw $v0, 12($fp) + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 4($v1) + + # assign (add here the expr.to_string) to t_31 + #load the variable self_Vertice + lw $v0, 16($fp) + sw $v0, -0($fp) + + # return the value of the function in the register $v0 + #load the variable t_31 + lw $v0, -0($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 4 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +add_out_Vertice: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 20 + + # assign (add here the expr.to_string) to t_33 + lw $v1, 16($fp) + lw $v0, 8($v1) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_34 + #load the variable t_33 + lw $v0, -0($fp) + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_35 + #load the variable s_32 + lw $v0, 12($fp) + sw $v0, -8($fp) + + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -8($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_36 + # calling the method cons of type EList + #load the variable t_34 + lw $v0, -4($fp) + lw $t0, 0($v0) + lw $v1, 52($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -12($fp) + + # Setting value of the attribute out in the instance self_Vertice to t_36 + #load the variable t_36 + lw $v0, -12($fp) + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 8($v1) + + # assign (add here the expr.to_string) to t_37 + #load the variable self_Vertice + lw $v0, 16($fp) + sw $v0, -16($fp) + + # return the value of the function in the register $v0 + #load the variable t_37 + lw $v0, -16($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 20 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +print_Vertice: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 28 + + # assign (add here the expr.to_string) to t_38 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_39 + #load the variable t_38 + lw $v0, -0($fp) + sw $v0, -4($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_40 + # calling the method out_int of type Vertice + #load the variable self_Vertice + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 28($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_41 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_42 + #load the variable t_41 + lw $v0, -12($fp) + sw $v0, -16($fp) + + lw $v0, -16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_43 + # calling the method print of type EList + #load the variable t_42 + lw $v0, -16($fp) + lw $t0, 0($v0) + lw $v1, 60($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_44 + #load the variable t_43 + lw $v0, -20($fp) + sw $v0, -24($fp) + + # return the value of the function in the register $v0 + #load the variable t_44 + lw $v0, -24($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 28 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_Vertice: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 8 + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to self_Vertice + jal Init_IO + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, 12($fp) + + # Setting value of the attribute num in the instance self_Vertice to 0 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 4($v1) + + # assign (add here the expr.to_string) to t_24 + li $a0, 8 + li $v0, 9 + syscall + la $a0, EList + sw $a0, 0($v0) + sw $v0, -0($fp) + + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_25 + # calling the method Init_EList of type EList + #load the variable t_24 + lw $v0, -0($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -4($fp) + + # Setting value of the attribute out in the instance self_Vertice to t_25 + #load the variable t_25 + lw $v0, -4($fp) + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 8($v1) + + # return the value of the function in the register $v0 + #load the variable self_Vertice + lw $v0, 12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 8 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +init_Edge: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 4 + + # Setting value of the attribute from in the instance self_Edge to f_45 + #load the variable f_45 + lw $v0, 20($fp) + move $s2, $v0 + lw $v1, 24($fp) + sw $s2, 4($v1) + + # Setting value of the attribute to in the instance self_Edge to t_46 + #load the variable t_46 + lw $v0, 16($fp) + move $s2, $v0 + lw $v1, 24($fp) + sw $s2, 8($v1) + + # Setting value of the attribute weight in the instance self_Edge to w_47 + #load the variable w_47 + lw $v0, 12($fp) + move $s2, $v0 + lw $v1, 24($fp) + sw $s2, 12($v1) + + # assign (add here the expr.to_string) to t_48 + #load the variable self_Edge + lw $v0, 24($fp) + sw $v0, -0($fp) + + # return the value of the function in the register $v0 + #load the variable t_48 + lw $v0, -0($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 4 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +print_Edge: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 76 + + # assign (add here the expr.to_string) to t_49 + #load the string str_0 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_0 + sw $v1, 4($v0) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_50 + #load the variable t_49 + lw $v0, -0($fp) + sw $v0, -4($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_51 + # calling the method out_string of type Edge + #load the variable self_Edge + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_52 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_53 + #load the variable t_52 + lw $v0, -12($fp) + sw $v0, -16($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_54 + # calling the method out_int of type Edge + #load the variable self_Edge + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 28($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_55 + #load the string str_1 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_1 + sw $v1, 4($v0) + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_56 + #load the variable t_55 + lw $v0, -24($fp) + sw $v0, -28($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -28($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_57 + # calling the method out_string of type Edge + #load the variable self_Edge + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -32($fp) + + # assign (add here the expr.to_string) to t_58 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_59 + #load the variable t_58 + lw $v0, -36($fp) + sw $v0, -40($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -40($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_60 + # calling the method out_int of type Edge + #load the variable self_Edge + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 28($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -44($fp) + + # assign (add here the expr.to_string) to t_61 + #load the string str_2 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_2 + sw $v1, 4($v0) + sw $v0, -48($fp) + + # assign (add here the expr.to_string) to t_62 + #load the variable t_61 + lw $v0, -48($fp) + sw $v0, -52($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -52($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_63 + # calling the method out_string of type Edge + #load the variable self_Edge + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -56($fp) + + # assign (add here the expr.to_string) to t_64 + lw $v1, 12($fp) + lw $v0, 12($v1) + sw $v0, -60($fp) + + # assign (add here the expr.to_string) to t_65 + #load the variable t_64 + lw $v0, -60($fp) + sw $v0, -64($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -64($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_66 + # calling the method out_int of type Edge + #load the variable self_Edge + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 28($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -68($fp) + + # assign (add here the expr.to_string) to t_67 + #load the variable t_66 + lw $v0, -68($fp) + sw $v0, -72($fp) + + # return the value of the function in the register $v0 + #load the variable t_67 + lw $v0, -72($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 76 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_Edge: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 0 + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to self_Edge + jal Init_IO + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, 12($fp) + + # Setting value of the attribute from in the instance self_Edge to 0 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 4($v1) + + # Setting value of the attribute to in the instance self_Edge to 0 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 8($v1) + + # Setting value of the attribute weight in the instance self_Edge to 0 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 12($v1) + + # return the value of the function in the register $v0 + #load the variable self_Edge + lw $v0, 12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 0 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +isNil_EList: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 8 + + # assign (add here the expr.to_string) to t_68 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_69 + #load the variable t_68 + lw $v0, -0($fp) + sw $v0, -4($fp) + + # return the value of the function in the register $v0 + #load the variable t_69 + lw $v0, -4($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 8 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +head_EList: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 12 + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_70 + # calling the method abort of type EList + #load the variable self_EList + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 12($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_71 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_72 + #load the variable t_71 + lw $v0, -4($fp) + sw $v0, -8($fp) + + # return the value of the function in the register $v0 + #load the variable t_72 + lw $v0, -8($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 12 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +tail_EList: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 8 + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_73 + # calling the method abort of type EList + #load the variable self_EList + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 12($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_74 + #load the variable self_EList + lw $v0, 12($fp) + sw $v0, -4($fp) + + # return the value of the function in the register $v0 + #load the variable t_74 + lw $v0, -4($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 8 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +cons_EList: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 28 + + # assign (add here the expr.to_string) to t_76 + li $a0, 12 + li $v0, 9 + syscall + la $a0, ECons + sw $a0, 0($v0) + sw $v0, -0($fp) + + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_77 + # calling the method Init_ECons of type ECons + #load the variable t_76 + lw $v0, -0($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_78 + #load the variable t_77 + lw $v0, -4($fp) + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_79 + #load the variable e_75 + lw $v0, 12($fp) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_80 + #load the variable self_EList + lw $v0, 16($fp) + sw $v0, -16($fp) + + lw $v0, -8($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_81 + # calling the method init of type ECons + #load the variable t_78 + lw $v0, -8($fp) + lw $t0, 0($v0) + lw $v1, 64($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_82 + #load the variable t_81 + lw $v0, -20($fp) + sw $v0, -24($fp) + + # return the value of the function in the register $v0 + #load the variable t_82 + lw $v0, -24($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 28 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +append_EList: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 48 + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_84 + # calling the method isNil of type EList + #load the variable self_EList + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 40($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_85 + #load the variable t_84 + lw $v0, -0($fp) + sw $v0, -4($fp) + + lw $t1, -4($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_0 + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_87 + # calling the method tail of type EList + #load the variable self_EList + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 48($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_88 + #load the variable t_87 + lw $v0, -12($fp) + sw $v0, -16($fp) + + # assign (add here the expr.to_string) to t_89 + #load the variable l_83 + lw $v0, 12($fp) + sw $v0, -20($fp) + + lw $v0, -16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -20($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_90 + # calling the method append of type EList + #load the variable t_88 + lw $v0, -16($fp) + lw $t0, 0($v0) + lw $v1, 56($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_91 + #load the variable t_90 + lw $v0, -24($fp) + sw $v0, -28($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_92 + # calling the method head of type EList + #load the variable self_EList + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 44($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -32($fp) + + # assign (add here the expr.to_string) to t_93 + #load the variable t_92 + lw $v0, -32($fp) + sw $v0, -36($fp) + + lw $v0, -28($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -36($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_94 + # calling the method cons of type EList + #load the variable t_91 + lw $v0, -28($fp) + lw $t0, 0($v0) + lw $v1, 52($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -40($fp) + + # assign (add here the expr.to_string) to t_86 + #load the variable t_94 + lw $v0, -40($fp) + sw $v0, -8($fp) + + j ifend_0 + then_0: + # assign (add here the expr.to_string) to t_86 + #load the variable l_83 + lw $v0, 12($fp) + sw $v0, -8($fp) + + ifend_0: + # assign (add here the expr.to_string) to t_95 + #load the variable t_86 + lw $v0, -8($fp) + sw $v0, -44($fp) + + # return the value of the function in the register $v0 + #load the variable t_95 + lw $v0, -44($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 48 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +print_EList: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 16 + + # assign (add here the expr.to_string) to t_96 + #load the string str_3 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_3 + sw $v1, 4($v0) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_97 + #load the variable t_96 + lw $v0, -0($fp) + sw $v0, -4($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_98 + # calling the method out_string of type EList + #load the variable self_EList + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_99 + #load the variable t_98 + lw $v0, -8($fp) + sw $v0, -12($fp) + + # return the value of the function in the register $v0 + #load the variable t_99 + lw $v0, -12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 16 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_EList: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 0 + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to self_EList + jal Init_IO + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, 12($fp) + + # return the value of the function in the register $v0 + #load the variable self_EList + lw $v0, 12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 0 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +isNil_ECons: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 8 + + # assign (add here the expr.to_string) to t_100 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_101 + #load the variable t_100 + lw $v0, -0($fp) + sw $v0, -4($fp) + + # return the value of the function in the register $v0 + #load the variable t_101 + lw $v0, -4($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 8 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +head_ECons: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 8 + + # assign (add here the expr.to_string) to t_102 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_103 + #load the variable t_102 + lw $v0, -0($fp) + sw $v0, -4($fp) + + # return the value of the function in the register $v0 + #load the variable t_103 + lw $v0, -4($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 8 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +tail_ECons: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 8 + + # assign (add here the expr.to_string) to t_104 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_105 + #load the variable t_104 + lw $v0, -0($fp) + sw $v0, -4($fp) + + # return the value of the function in the register $v0 + #load the variable t_105 + lw $v0, -4($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 8 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +init_ECons: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 4 + + # Setting value of the attribute car in the instance self_ECons to e_106 + #load the variable e_106 + lw $v0, 16($fp) + move $s2, $v0 + lw $v1, 20($fp) + sw $s2, 4($v1) + + # Setting value of the attribute cdr in the instance self_ECons to rest_107 + #load the variable rest_107 + lw $v0, 12($fp) + move $s2, $v0 + lw $v1, 20($fp) + sw $s2, 8($v1) + + # assign (add here the expr.to_string) to t_108 + #load the variable self_ECons + lw $v0, 20($fp) + sw $v0, -0($fp) + + # return the value of the function in the register $v0 + #load the variable t_108 + lw $v0, -0($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 4 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +print_ECons: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 28 + + # assign (add here the expr.to_string) to t_109 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_110 + #load the variable t_109 + lw $v0, -0($fp) + sw $v0, -4($fp) + + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_111 + # calling the method print of type Edge + #load the variable t_110 + lw $v0, -4($fp) + lw $t0, 0($v0) + lw $v1, 44($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_112 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_113 + #load the variable t_112 + lw $v0, -12($fp) + sw $v0, -16($fp) + + lw $v0, -16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_114 + # calling the method print of type EList + #load the variable t_113 + lw $v0, -16($fp) + lw $t0, 0($v0) + lw $v1, 60($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_115 + #load the variable t_114 + lw $v0, -20($fp) + sw $v0, -24($fp) + + # return the value of the function in the register $v0 + #load the variable t_115 + lw $v0, -24($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 28 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_ECons: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 0 + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to self_ECons + jal Init_EList + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, 12($fp) + + # return the value of the function in the register $v0 + #load the variable self_ECons + lw $v0, 12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 0 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +isNil_VList: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 8 + + # assign (add here the expr.to_string) to t_116 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_117 + #load the variable t_116 + lw $v0, -0($fp) + sw $v0, -4($fp) + + # return the value of the function in the register $v0 + #load the variable t_117 + lw $v0, -4($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 8 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +head_VList: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 12 + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_118 + # calling the method abort of type VList + #load the variable self_VList + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 12($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_119 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_120 + #load the variable t_119 + lw $v0, -4($fp) + sw $v0, -8($fp) + + # return the value of the function in the register $v0 + #load the variable t_120 + lw $v0, -8($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 12 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +tail_VList: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 8 + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_121 + # calling the method abort of type VList + #load the variable self_VList + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 12($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_122 + #load the variable self_VList + lw $v0, 12($fp) + sw $v0, -4($fp) + + # return the value of the function in the register $v0 + #load the variable t_122 + lw $v0, -4($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 8 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +cons_VList: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 28 + + # assign (add here the expr.to_string) to t_124 + li $a0, 12 + li $v0, 9 + syscall + la $a0, VCons + sw $a0, 0($v0) + sw $v0, -0($fp) + + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_125 + # calling the method Init_VCons of type VCons + #load the variable t_124 + lw $v0, -0($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_126 + #load the variable t_125 + lw $v0, -4($fp) + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_127 + #load the variable v_123 + lw $v0, 12($fp) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_128 + #load the variable self_VList + lw $v0, 16($fp) + sw $v0, -16($fp) + + lw $v0, -8($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_129 + # calling the method init of type VCons + #load the variable t_126 + lw $v0, -8($fp) + lw $t0, 0($v0) + lw $v1, 60($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_130 + #load the variable t_129 + lw $v0, -20($fp) + sw $v0, -24($fp) + + # return the value of the function in the register $v0 + #load the variable t_130 + lw $v0, -24($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 28 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +print_VList: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 16 + + # assign (add here the expr.to_string) to t_131 + #load the string str_4 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_4 + sw $v1, 4($v0) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_132 + #load the variable t_131 + lw $v0, -0($fp) + sw $v0, -4($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_133 + # calling the method out_string of type VList + #load the variable self_VList + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_134 + #load the variable t_133 + lw $v0, -8($fp) + sw $v0, -12($fp) + + # return the value of the function in the register $v0 + #load the variable t_134 + lw $v0, -12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 16 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_VList: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 0 + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to self_VList + jal Init_IO + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, 12($fp) + + # return the value of the function in the register $v0 + #load the variable self_VList + lw $v0, 12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 0 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +isNil_VCons: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 8 + + # assign (add here the expr.to_string) to t_135 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_136 + #load the variable t_135 + lw $v0, -0($fp) + sw $v0, -4($fp) + + # return the value of the function in the register $v0 + #load the variable t_136 + lw $v0, -4($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 8 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +head_VCons: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 8 + + # assign (add here the expr.to_string) to t_137 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_138 + #load the variable t_137 + lw $v0, -0($fp) + sw $v0, -4($fp) + + # return the value of the function in the register $v0 + #load the variable t_138 + lw $v0, -4($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 8 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +tail_VCons: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 8 + + # assign (add here the expr.to_string) to t_139 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_140 + #load the variable t_139 + lw $v0, -0($fp) + sw $v0, -4($fp) + + # return the value of the function in the register $v0 + #load the variable t_140 + lw $v0, -4($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 8 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +init_VCons: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 4 + + # Setting value of the attribute car in the instance self_VCons to v_141 + #load the variable v_141 + lw $v0, 16($fp) + move $s2, $v0 + lw $v1, 20($fp) + sw $s2, 4($v1) + + # Setting value of the attribute cdr in the instance self_VCons to rest_142 + #load the variable rest_142 + lw $v0, 12($fp) + move $s2, $v0 + lw $v1, 20($fp) + sw $s2, 8($v1) + + # assign (add here the expr.to_string) to t_143 + #load the variable self_VCons + lw $v0, 20($fp) + sw $v0, -0($fp) + + # return the value of the function in the register $v0 + #load the variable t_143 + lw $v0, -0($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 4 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +print_VCons: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 28 + + # assign (add here the expr.to_string) to t_144 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_145 + #load the variable t_144 + lw $v0, -0($fp) + sw $v0, -4($fp) + + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_146 + # calling the method print of type Vertice + #load the variable t_145 + lw $v0, -4($fp) + lw $t0, 0($v0) + lw $v1, 56($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_147 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_148 + #load the variable t_147 + lw $v0, -12($fp) + sw $v0, -16($fp) + + lw $v0, -16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_149 + # calling the method print of type VList + #load the variable t_148 + lw $v0, -16($fp) + lw $t0, 0($v0) + lw $v1, 56($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_150 + #load the variable t_149 + lw $v0, -20($fp) + sw $v0, -24($fp) + + # return the value of the function in the register $v0 + #load the variable t_150 + lw $v0, -24($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 28 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_VCons: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 0 + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to self_VCons + jal Init_VList + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, 12($fp) + + # return the value of the function in the register $v0 + #load the variable self_VCons + lw $v0, 12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 0 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +read_input_Parse: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 108 + + # assign (add here the expr.to_string) to t_154 + li $a0, 12 + li $v0, 9 + syscall + la $a0, Graph + sw $a0, 0($v0) + sw $v0, -4($fp) + + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_155 + # calling the method Init_Graph of type Graph + #load the variable t_154 + lw $v0, -4($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to g_153 + #load the variable t_155 + lw $v0, -8($fp) + sw $v0, -0($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_157 + # calling the method in_string of type Parse + #load the variable self_Parse + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 32($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -16($fp) + + # assign (add here the expr.to_string) to line_156 + #load the variable t_157 + lw $v0, -16($fp) + sw $v0, -12($fp) + + while_0: + # assign (add here the expr.to_string) to t_158 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_159 + #load the variable t_158 + lw $v0, -20($fp) + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_160 + #load the string str_5 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_5 + sw $v1, 4($v0) + sw $v0, -28($fp) + + # assign (add here the expr.to_string) to t_161 + #load the variable line_156 + lw $v0, -12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_160 + lw $v0, -28($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -32($fp) + + # assign (add here the expr.to_string) to t_162 + #load the variable t_161 + lw $v0, -32($fp) + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_163 + #load the variable t_162 + lw $v0, -36($fp) + lw $t0, 4($v0) + li $t1, 1 + xor $t0, $t0, $t1 + andi $t0, $t0, 0x01 + sw $t0, 4($v0) + sw $v0, -40($fp) + + # assign (add here the expr.to_string) to t_164 + #load the variable t_163 + lw $v0, -40($fp) + sw $v0, -44($fp) + + # assign (add here the expr.to_string) to t_165 + #load the string str_6 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_6 + sw $v1, 4($v0) + sw $v0, -48($fp) + + # assign (add here the expr.to_string) to t_166 + #load the variable line_156 + lw $v0, -12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_165 + lw $v0, -48($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -52($fp) + + # assign (add here the expr.to_string) to t_167 + #load the variable t_166 + lw $v0, -52($fp) + sw $v0, -56($fp) + + # assign (add here the expr.to_string) to t_168 + #load the variable t_167 + lw $v0, -56($fp) + lw $t0, 4($v0) + li $t1, 1 + xor $t0, $t0, $t1 + andi $t0, $t0, 0x01 + sw $t0, 4($v0) + sw $v0, -60($fp) + + # assign (add here the expr.to_string) to t_169 + #load the variable t_168 + lw $v0, -60($fp) + sw $v0, -64($fp) + + lw $v0, -24($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -44($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -64($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_170 + # calling the method and of type BoolOp + #load the variable t_159 + lw $v0, -24($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -68($fp) + + # assign (add here the expr.to_string) to t_171 + #load the variable t_170 + lw $v0, -68($fp) + sw $v0, -72($fp) + + lw $t1, -72($fp) + lw $t0, 4($t1) + bne $t0, $zero, body_0 + j pool_0 + body_0: + # assign (add here the expr.to_string) to t_173 + #load the variable g_153 + lw $v0, -0($fp) + sw $v0, -80($fp) + + # assign (add here the expr.to_string) to t_174 + #load the variable line_156 + lw $v0, -12($fp) + sw $v0, -84($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -84($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_175 + # calling the method parse_line of type Parse + #load the variable self_Parse + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 44($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -88($fp) + + # assign (add here the expr.to_string) to t_176 + #load the variable t_175 + lw $v0, -88($fp) + sw $v0, -92($fp) + + lw $v0, -80($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -92($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_177 + # calling the method add_vertice of type Graph + #load the variable t_173 + lw $v0, -80($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -96($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_178 + # calling the method in_string of type Parse + #load the variable self_Parse + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 32($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -100($fp) + + # assign (add here the expr.to_string) to line_156 + #load the variable t_178 + lw $v0, -100($fp) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_172 + #load the variable line_156 + lw $v0, -12($fp) + sw $v0, -76($fp) + + j while_0 + pool_0: + # assign (add here the expr.to_string) to t_179 + #load the variable g_153 + lw $v0, -0($fp) + sw $v0, -104($fp) + + # return the value of the function in the register $v0 + #load the variable t_179 + lw $v0, -104($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 108 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +parse_line_Parse: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 148 + + # assign (add here the expr.to_string) to t_182 + li $a0, 12 + li $v0, 9 + syscall + la $a0, Vertice + sw $a0, 0($v0) + sw $v0, -4($fp) + + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_183 + # calling the method Init_Vertice of type Vertice + #load the variable t_182 + lw $v0, -4($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_184 + #load the variable t_183 + lw $v0, -8($fp) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_185 + #load the variable s_180 + lw $v0, 12($fp) + sw $v0, -16($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_186 + # calling the method a2i of type Parse + #load the variable self_Parse + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 52($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_187 + #load the variable t_186 + lw $v0, -20($fp) + sw $v0, -24($fp) + + lw $v0, -12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -24($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_188 + # calling the method init of type Vertice + #load the variable t_184 + lw $v0, -12($fp) + lw $t0, 0($v0) + lw $v1, 48($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -28($fp) + + # assign (add here the expr.to_string) to v_181 + #load the variable t_188 + lw $v0, -28($fp) + sw $v0, -0($fp) + + while_1: + # assign (add here the expr.to_string) to t_189 + lw $v1, 16($fp) + lw $v0, 8($v1) + sw $v0, -32($fp) + + # assign (add here the expr.to_string) to t_190 + #load the variable t_189 + lw $v0, -32($fp) + sw $v0, -36($fp) + + lw $v0, -36($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_191 + # calling the method length of type String + #load the variable t_190 + lw $v0, -36($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -40($fp) + + # assign (add here the expr.to_string) to t_192 + #load the variable t_191 + lw $v0, -40($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -44($fp) + + # assign (add here the expr.to_string) to t_193 + #load the variable t_192 + lw $v0, -44($fp) + sw $v0, -48($fp) + + # assign (add here the expr.to_string) to t_194 + #load the variable t_193 + lw $v0, -48($fp) + lw $t0, 4($v0) + li $t1, 1 + xor $t0, $t0, $t1 + andi $t0, $t0, 0x01 + sw $t0, 4($v0) + sw $v0, -52($fp) + + # assign (add here the expr.to_string) to t_195 + #load the variable t_194 + lw $v0, -52($fp) + sw $v0, -56($fp) + + lw $t1, -56($fp) + lw $t0, 4($t1) + bne $t0, $zero, body_1 + j pool_1 + body_1: + # assign (add here the expr.to_string) to t_198 + lw $v1, 16($fp) + lw $v0, 8($v1) + sw $v0, -68($fp) + + # assign (add here the expr.to_string) to t_199 + #load the variable t_198 + lw $v0, -68($fp) + sw $v0, -72($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -72($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_200 + # calling the method a2i of type Parse + #load the variable self_Parse + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 52($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -76($fp) + + # assign (add here the expr.to_string) to succ_197 + #load the variable t_200 + lw $v0, -76($fp) + sw $v0, -64($fp) + + # assign (add here the expr.to_string) to t_202 + lw $v1, 16($fp) + lw $v0, 8($v1) + sw $v0, -84($fp) + + # assign (add here the expr.to_string) to t_203 + #load the variable t_202 + lw $v0, -84($fp) + sw $v0, -88($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -88($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_204 + # calling the method a2i of type Parse + #load the variable self_Parse + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 52($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -92($fp) + + # assign (add here the expr.to_string) to weight_201 + #load the variable t_204 + lw $v0, -92($fp) + sw $v0, -80($fp) + + # assign (add here the expr.to_string) to t_205 + #load the variable v_181 + lw $v0, -0($fp) + sw $v0, -96($fp) + + # assign (add here the expr.to_string) to t_206 + li $a0, 16 + li $v0, 9 + syscall + la $a0, Edge + sw $a0, 0($v0) + sw $v0, -100($fp) + + lw $v0, -100($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_207 + # calling the method Init_Edge of type Edge + #load the variable t_206 + lw $v0, -100($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -104($fp) + + # assign (add here the expr.to_string) to t_208 + #load the variable t_207 + lw $v0, -104($fp) + sw $v0, -108($fp) + + # assign (add here the expr.to_string) to t_209 + #load the variable v_181 + lw $v0, -0($fp) + sw $v0, -112($fp) + + lw $v0, -112($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_210 + # calling the method number of type Vertice + #load the variable t_209 + lw $v0, -112($fp) + lw $t0, 0($v0) + lw $v1, 44($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -116($fp) + + # assign (add here the expr.to_string) to t_211 + #load the variable t_210 + lw $v0, -116($fp) + sw $v0, -120($fp) + + # assign (add here the expr.to_string) to t_212 + #load the variable succ_197 + lw $v0, -64($fp) + sw $v0, -124($fp) + + # assign (add here the expr.to_string) to t_213 + #load the variable weight_201 + lw $v0, -80($fp) + sw $v0, -128($fp) + + lw $v0, -108($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -120($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -124($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -128($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_214 + # calling the method init of type Edge + #load the variable t_208 + lw $v0, -108($fp) + lw $t0, 0($v0) + lw $v1, 40($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -132($fp) + + # assign (add here the expr.to_string) to t_215 + #load the variable t_214 + lw $v0, -132($fp) + sw $v0, -136($fp) + + lw $v0, -96($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -136($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_216 + # calling the method add_out of type Vertice + #load the variable t_205 + lw $v0, -96($fp) + lw $t0, 0($v0) + lw $v1, 52($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -140($fp) + + # assign (add here the expr.to_string) to t_196 + #load the variable t_216 + lw $v0, -140($fp) + sw $v0, -60($fp) + + j while_1 + pool_1: + # assign (add here the expr.to_string) to t_217 + #load the variable v_181 + lw $v0, -0($fp) + sw $v0, -144($fp) + + # return the value of the function in the register $v0 + #load the variable t_217 + lw $v0, -144($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 148 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +c2i_Parse: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 168 + + # assign (add here the expr.to_string) to t_219 + #load the string str_7 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_7 + sw $v1, 4($v0) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_220 + #load the variable char_218 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_219 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_221 + #load the variable t_220 + lw $v0, -4($fp) + sw $v0, -8($fp) + + lw $t1, -8($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_1 + # assign (add here the expr.to_string) to t_223 + #load the string str_8 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_8 + sw $v1, 4($v0) + sw $v0, -16($fp) + + # assign (add here the expr.to_string) to t_224 + #load the variable char_218 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_223 + lw $v0, -16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_225 + #load the variable t_224 + lw $v0, -20($fp) + sw $v0, -24($fp) + + lw $t1, -24($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_2 + # assign (add here the expr.to_string) to t_227 + #load the string str_9 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_9 + sw $v1, 4($v0) + sw $v0, -32($fp) + + # assign (add here the expr.to_string) to t_228 + #load the variable char_218 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_227 + lw $v0, -32($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_229 + #load the variable t_228 + lw $v0, -36($fp) + sw $v0, -40($fp) + + lw $t1, -40($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_3 + # assign (add here the expr.to_string) to t_231 + #load the string str_10 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_10 + sw $v1, 4($v0) + sw $v0, -48($fp) + + # assign (add here the expr.to_string) to t_232 + #load the variable char_218 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_231 + lw $v0, -48($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -52($fp) + + # assign (add here the expr.to_string) to t_233 + #load the variable t_232 + lw $v0, -52($fp) + sw $v0, -56($fp) + + lw $t1, -56($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_4 + # assign (add here the expr.to_string) to t_235 + #load the string str_11 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_11 + sw $v1, 4($v0) + sw $v0, -64($fp) + + # assign (add here the expr.to_string) to t_236 + #load the variable char_218 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_235 + lw $v0, -64($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -68($fp) + + # assign (add here the expr.to_string) to t_237 + #load the variable t_236 + lw $v0, -68($fp) + sw $v0, -72($fp) + + lw $t1, -72($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_5 + # assign (add here the expr.to_string) to t_239 + #load the string str_12 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_12 + sw $v1, 4($v0) + sw $v0, -80($fp) + + # assign (add here the expr.to_string) to t_240 + #load the variable char_218 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_239 + lw $v0, -80($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -84($fp) + + # assign (add here the expr.to_string) to t_241 + #load the variable t_240 + lw $v0, -84($fp) + sw $v0, -88($fp) + + lw $t1, -88($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_6 + # assign (add here the expr.to_string) to t_243 + #load the string str_13 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_13 + sw $v1, 4($v0) + sw $v0, -96($fp) + + # assign (add here the expr.to_string) to t_244 + #load the variable char_218 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_243 + lw $v0, -96($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -100($fp) + + # assign (add here the expr.to_string) to t_245 + #load the variable t_244 + lw $v0, -100($fp) + sw $v0, -104($fp) + + lw $t1, -104($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_7 + # assign (add here the expr.to_string) to t_247 + #load the string str_14 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_14 + sw $v1, 4($v0) + sw $v0, -112($fp) + + # assign (add here the expr.to_string) to t_248 + #load the variable char_218 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_247 + lw $v0, -112($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -116($fp) + + # assign (add here the expr.to_string) to t_249 + #load the variable t_248 + lw $v0, -116($fp) + sw $v0, -120($fp) + + lw $t1, -120($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_8 + # assign (add here the expr.to_string) to t_251 + #load the string str_15 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_15 + sw $v1, 4($v0) + sw $v0, -128($fp) + + # assign (add here the expr.to_string) to t_252 + #load the variable char_218 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_251 + lw $v0, -128($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -132($fp) + + # assign (add here the expr.to_string) to t_253 + #load the variable t_252 + lw $v0, -132($fp) + sw $v0, -136($fp) + + lw $t1, -136($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_9 + # assign (add here the expr.to_string) to t_255 + #load the string str_16 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_16 + sw $v1, 4($v0) + sw $v0, -144($fp) + + # assign (add here the expr.to_string) to t_256 + #load the variable char_218 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_255 + lw $v0, -144($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -148($fp) + + # assign (add here the expr.to_string) to t_257 + #load the variable t_256 + lw $v0, -148($fp) + sw $v0, -152($fp) + + lw $t1, -152($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_10 + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_259 + # calling the method abort of type Parse + #load the variable self_Parse + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 12($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -160($fp) + + # assign (add here the expr.to_string) to t_258 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -156($fp) + + j ifend_10 + then_10: + # assign (add here the expr.to_string) to t_258 + # Creating Int instance for atomic 9 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 9 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -156($fp) + + ifend_10: + # assign (add here the expr.to_string) to t_254 + #load the variable t_258 + lw $v0, -156($fp) + sw $v0, -140($fp) + + j ifend_9 + then_9: + # assign (add here the expr.to_string) to t_254 + # Creating Int instance for atomic 8 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 8 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -140($fp) + + ifend_9: + # assign (add here the expr.to_string) to t_250 + #load the variable t_254 + lw $v0, -140($fp) + sw $v0, -124($fp) + + j ifend_8 + then_8: + # assign (add here the expr.to_string) to t_250 + # Creating Int instance for atomic 7 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 7 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -124($fp) + + ifend_8: + # assign (add here the expr.to_string) to t_246 + #load the variable t_250 + lw $v0, -124($fp) + sw $v0, -108($fp) + + j ifend_7 + then_7: + # assign (add here the expr.to_string) to t_246 + # Creating Int instance for atomic 6 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 6 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -108($fp) + + ifend_7: + # assign (add here the expr.to_string) to t_242 + #load the variable t_246 + lw $v0, -108($fp) + sw $v0, -92($fp) + + j ifend_6 + then_6: + # assign (add here the expr.to_string) to t_242 + # Creating Int instance for atomic 5 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 5 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -92($fp) + + ifend_6: + # assign (add here the expr.to_string) to t_238 + #load the variable t_242 + lw $v0, -92($fp) + sw $v0, -76($fp) + + j ifend_5 + then_5: + # assign (add here the expr.to_string) to t_238 + # Creating Int instance for atomic 4 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 4 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -76($fp) + + ifend_5: + # assign (add here the expr.to_string) to t_234 + #load the variable t_238 + lw $v0, -76($fp) + sw $v0, -60($fp) + + j ifend_4 + then_4: + # assign (add here the expr.to_string) to t_234 + # Creating Int instance for atomic 3 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 3 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -60($fp) + + ifend_4: + # assign (add here the expr.to_string) to t_230 + #load the variable t_234 + lw $v0, -60($fp) + sw $v0, -44($fp) + + j ifend_3 + then_3: + # assign (add here the expr.to_string) to t_230 + # Creating Int instance for atomic 2 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 2 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -44($fp) + + ifend_3: + # assign (add here the expr.to_string) to t_226 + #load the variable t_230 + lw $v0, -44($fp) + sw $v0, -28($fp) + + j ifend_2 + then_2: + # assign (add here the expr.to_string) to t_226 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -28($fp) + + ifend_2: + # assign (add here the expr.to_string) to t_222 + #load the variable t_226 + lw $v0, -28($fp) + sw $v0, -12($fp) + + j ifend_1 + then_1: + # assign (add here the expr.to_string) to t_222 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -12($fp) + + ifend_1: + # assign (add here the expr.to_string) to t_260 + #load the variable t_222 + lw $v0, -12($fp) + sw $v0, -164($fp) + + # return the value of the function in the register $v0 + #load the variable t_260 + lw $v0, -164($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 168 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +a2i_Parse: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 176 + + # assign (add here the expr.to_string) to t_262 + #load the variable s_261 + lw $v0, 12($fp) + sw $v0, -0($fp) + + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_263 + # calling the method length of type String + #load the variable t_262 + lw $v0, -0($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_264 + #load the variable t_263 + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_265 + #load the variable t_264 + lw $v0, -8($fp) + sw $v0, -12($fp) + + lw $t1, -12($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_11 + # assign (add here the expr.to_string) to t_267 + #load the variable s_261 + lw $v0, 12($fp) + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_268 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_269 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -28($fp) + + lw $v0, -20($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -24($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -28($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_270 + # calling the method substr of type String + #load the variable t_267 + lw $v0, -20($fp) + lw $t0, 0($v0) + lw $v1, 32($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -32($fp) + + # assign (add here the expr.to_string) to t_271 + #load the string str_17 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_17 + sw $v1, 4($v0) + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_272 + #load the variable t_270 + lw $v0, -32($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_271 + lw $v0, -36($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -40($fp) + + # assign (add here the expr.to_string) to t_273 + #load the variable t_272 + lw $v0, -40($fp) + sw $v0, -44($fp) + + lw $t1, -44($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_12 + # assign (add here the expr.to_string) to t_275 + #load the variable s_261 + lw $v0, 12($fp) + sw $v0, -52($fp) + + # assign (add here the expr.to_string) to t_276 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -56($fp) + + # assign (add here the expr.to_string) to t_277 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -60($fp) + + lw $v0, -52($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -56($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -60($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_278 + # calling the method substr of type String + #load the variable t_275 + lw $v0, -52($fp) + lw $t0, 0($v0) + lw $v1, 32($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -64($fp) + + # assign (add here the expr.to_string) to t_279 + #load the string str_18 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_18 + sw $v1, 4($v0) + sw $v0, -68($fp) + + # assign (add here the expr.to_string) to t_280 + #load the variable t_278 + lw $v0, -64($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_279 + lw $v0, -68($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -72($fp) + + # assign (add here the expr.to_string) to t_281 + #load the variable t_280 + lw $v0, -72($fp) + sw $v0, -76($fp) + + lw $t1, -76($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_13 + # assign (add here the expr.to_string) to t_283 + #load the variable s_261 + lw $v0, 12($fp) + sw $v0, -84($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -84($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_284 + # calling the method a2i_aux of type Parse + #load the variable self_Parse + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 56($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -88($fp) + + # assign (add here the expr.to_string) to t_282 + #load the variable t_284 + lw $v0, -88($fp) + sw $v0, -80($fp) + + j ifend_13 + then_13: + # assign (add here the expr.to_string) to t_285 + #load the variable s_261 + lw $v0, 12($fp) + sw $v0, -92($fp) + + # assign (add here the expr.to_string) to t_286 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -96($fp) + + # assign (add here the expr.to_string) to t_287 + #load the variable s_261 + lw $v0, 12($fp) + sw $v0, -100($fp) + + lw $v0, -100($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_288 + # calling the method length of type String + #load the variable t_287 + lw $v0, -100($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -104($fp) + + # assign (add here the expr.to_string) to t_289 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_288 + lw $v0, -104($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -108($fp) + + # assign (add here the expr.to_string) to t_290 + #load the variable t_289 + lw $v0, -108($fp) + sw $v0, -112($fp) + + lw $v0, -92($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -96($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -112($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_291 + # calling the method substr of type String + #load the variable t_285 + lw $v0, -92($fp) + lw $t0, 0($v0) + lw $v1, 32($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -116($fp) + + # assign (add here the expr.to_string) to t_292 + #load the variable t_291 + lw $v0, -116($fp) + sw $v0, -120($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -120($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_293 + # calling the method a2i of type Parse + #load the variable self_Parse + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 52($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -124($fp) + + # assign (add here the expr.to_string) to t_282 + #load the variable t_293 + lw $v0, -124($fp) + sw $v0, -80($fp) + + ifend_13: + # assign (add here the expr.to_string) to t_274 + #load the variable t_282 + lw $v0, -80($fp) + sw $v0, -48($fp) + + j ifend_12 + then_12: + # assign (add here the expr.to_string) to t_294 + #load the variable s_261 + lw $v0, 12($fp) + sw $v0, -128($fp) + + # assign (add here the expr.to_string) to t_295 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -132($fp) + + # assign (add here the expr.to_string) to t_296 + #load the variable s_261 + lw $v0, 12($fp) + sw $v0, -136($fp) + + lw $v0, -136($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_297 + # calling the method length of type String + #load the variable t_296 + lw $v0, -136($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -140($fp) + + # assign (add here the expr.to_string) to t_298 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_297 + lw $v0, -140($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -144($fp) + + # assign (add here the expr.to_string) to t_299 + #load the variable t_298 + lw $v0, -144($fp) + sw $v0, -148($fp) + + lw $v0, -128($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -132($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -148($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_300 + # calling the method substr of type String + #load the variable t_294 + lw $v0, -128($fp) + lw $t0, 0($v0) + lw $v1, 32($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -152($fp) + + # assign (add here the expr.to_string) to t_301 + #load the variable t_300 + lw $v0, -152($fp) + sw $v0, -156($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -156($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_302 + # calling the method a2i_aux of type Parse + #load the variable self_Parse + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 56($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -160($fp) + + # assign (add here the expr.to_string) to t_303 + #load the variable t_302 + lw $v0, -160($fp) + sw $v0, -164($fp) + + # assign (add here the expr.to_string) to t_304 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_303 + lw $v0, -164($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -168($fp) + + # assign (add here the expr.to_string) to t_274 + #load the variable t_304 + lw $v0, -168($fp) + sw $v0, -48($fp) + + ifend_12: + # assign (add here the expr.to_string) to t_266 + #load the variable t_274 + lw $v0, -48($fp) + sw $v0, -16($fp) + + j ifend_11 + then_11: + # assign (add here the expr.to_string) to t_266 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -16($fp) + + ifend_11: + # assign (add here the expr.to_string) to t_305 + #load the variable t_266 + lw $v0, -16($fp) + sw $v0, -172($fp) + + # return the value of the function in the register $v0 + #load the variable t_305 + lw $v0, -172($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 176 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +a2i_aux_Parse: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 216 + + # assign (add here the expr.to_string) to int_307 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_309 + #load the variable s_306 + lw $v0, 12($fp) + sw $v0, -8($fp) + + lw $v0, -8($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_310 + # calling the method length of type String + #load the variable t_309 + lw $v0, -8($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to j_308 + #load the variable t_310 + lw $v0, -12($fp) + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to i_311 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -16($fp) + + while_2: + # assign (add here the expr.to_string) to t_312 + #load the variable i_311 + lw $v0, -16($fp) + move $t1, $v0 + lw $t1, 4($t1) + # push $t1 to the stack + sw $t1, 0($sp) + addi $sp $sp -4 + + #load the variable j_308 + lw $v0, -4($fp) + # pop the top of the stack to $t1 + addi $sp $sp 4 + lw $t1, 0($sp) + + move $t2, $v0 + lw $t2, 4($t2) + slt $t3, $t1, $t2 + la $t4, Bool + li $a0, 8 + li $v0, 9 + syscall + sw $t4, 0($v0) + sw $t3, 4($v0) + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_313 + #load the variable t_312 + lw $v0, -20($fp) + sw $v0, -24($fp) + + lw $t1, -24($fp) + lw $t0, 4($t1) + bne $t0, $zero, body_2 + j pool_2 + body_2: + # assign (add here the expr.to_string) to t_316 + #load the variable s_306 + lw $v0, 12($fp) + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_317 + #load the variable i_311 + lw $v0, -16($fp) + sw $v0, -40($fp) + + # assign (add here the expr.to_string) to t_318 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -44($fp) + + lw $v0, -36($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -40($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -44($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_319 + # calling the method substr of type String + #load the variable t_316 + lw $v0, -36($fp) + lw $t0, 0($v0) + lw $v1, 32($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -48($fp) + + # assign (add here the expr.to_string) to c_315 + #load the variable t_319 + lw $v0, -48($fp) + sw $v0, -32($fp) + + # assign (add here the expr.to_string) to t_320 + #load the string str_19 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_19 + sw $v1, 4($v0) + sw $v0, -52($fp) + + # assign (add here the expr.to_string) to t_321 + #load the variable c_315 + lw $v0, -32($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_320 + lw $v0, -52($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -56($fp) + + # assign (add here the expr.to_string) to t_322 + #load the variable t_321 + lw $v0, -56($fp) + sw $v0, -60($fp) + + lw $t1, -60($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_14 + # assign (add here the expr.to_string) to t_324 + #load the string str_20 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_20 + sw $v1, 4($v0) + sw $v0, -68($fp) + + # assign (add here the expr.to_string) to t_325 + #load the variable c_315 + lw $v0, -32($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_324 + lw $v0, -68($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -72($fp) + + # assign (add here the expr.to_string) to t_326 + #load the variable t_325 + lw $v0, -72($fp) + sw $v0, -76($fp) + + lw $t1, -76($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_15 + # assign (add here the expr.to_string) to t_328 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable int_307 + lw $v0, -0($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 10 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 10 + sw $t0, 0($v0) + sw $t1, 4($v0) + + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + mult $t0, $t1 + mflo $t0 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -84($fp) + + # assign (add here the expr.to_string) to t_329 + #load the variable s_306 + lw $v0, 12($fp) + sw $v0, -88($fp) + + # assign (add here the expr.to_string) to t_330 + #load the variable i_311 + lw $v0, -16($fp) + sw $v0, -92($fp) + + # assign (add here the expr.to_string) to t_331 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -96($fp) + + lw $v0, -88($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -92($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -96($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_332 + # calling the method substr of type String + #load the variable t_329 + lw $v0, -88($fp) + lw $t0, 0($v0) + lw $v1, 32($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -100($fp) + + # assign (add here the expr.to_string) to t_333 + #load the variable t_332 + lw $v0, -100($fp) + sw $v0, -104($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -104($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_334 + # calling the method c2i of type Parse + #load the variable self_Parse + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 48($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -108($fp) + + # assign (add here the expr.to_string) to t_335 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_328 + lw $v0, -84($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_334 + lw $v0, -108($fp) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -112($fp) + + # assign (add here the expr.to_string) to int_307 + #load the variable t_335 + lw $v0, -112($fp) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_336 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable i_311 + lw $v0, -16($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -116($fp) + + # assign (add here the expr.to_string) to i_311 + #load the variable t_336 + lw $v0, -116($fp) + sw $v0, -16($fp) + + # assign (add here the expr.to_string) to t_337 + #load the variable i_311 + lw $v0, -16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable j_308 + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -120($fp) + + # assign (add here the expr.to_string) to t_338 + #load the variable t_337 + lw $v0, -120($fp) + sw $v0, -124($fp) + + lw $t1, -124($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_16 + # assign (add here the expr.to_string) to t_340 + #load the string str_21 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_21 + sw $v1, 4($v0) + sw $v0, -132($fp) + + # assign (add here the expr.to_string) to t_339 + #load the variable t_340 + lw $v0, -132($fp) + sw $v0, -128($fp) + + j ifend_16 + then_16: + # assign (add here the expr.to_string) to t_341 + #load the string str_22 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_22 + sw $v1, 4($v0) + sw $v0, -136($fp) + + # Setting value of the attribute rest in the instance self_Parse to t_341 + #load the variable t_341 + lw $v0, -136($fp) + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 8($v1) + + # assign (add here the expr.to_string) to t_339 + #load the variable t_341 + lw $v0, -136($fp) + sw $v0, -128($fp) + + ifend_16: + # assign (add here the expr.to_string) to t_327 + #load the variable t_339 + lw $v0, -128($fp) + sw $v0, -80($fp) + + j ifend_15 + then_15: + # assign (add here the expr.to_string) to t_342 + #load the variable s_306 + lw $v0, 12($fp) + sw $v0, -140($fp) + + # assign (add here the expr.to_string) to t_343 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable i_311 + lw $v0, -16($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -144($fp) + + # assign (add here the expr.to_string) to t_344 + #load the variable t_343 + lw $v0, -144($fp) + sw $v0, -148($fp) + + # assign (add here the expr.to_string) to t_345 + #load the variable s_306 + lw $v0, 12($fp) + sw $v0, -152($fp) + + lw $v0, -152($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_346 + # calling the method length of type String + #load the variable t_345 + lw $v0, -152($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -156($fp) + + # assign (add here the expr.to_string) to t_347 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_346 + lw $v0, -156($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable i_311 + lw $v0, -16($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -160($fp) + + # assign (add here the expr.to_string) to t_348 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_347 + lw $v0, -160($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -164($fp) + + # assign (add here the expr.to_string) to t_349 + #load the variable t_348 + lw $v0, -164($fp) + sw $v0, -168($fp) + + lw $v0, -140($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -148($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -168($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_350 + # calling the method substr of type String + #load the variable t_342 + lw $v0, -140($fp) + lw $t0, 0($v0) + lw $v1, 32($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -172($fp) + + # Setting value of the attribute rest in the instance self_Parse to t_350 + #load the variable t_350 + lw $v0, -172($fp) + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 8($v1) + + # assign (add here the expr.to_string) to i_311 + #load the variable j_308 + lw $v0, -4($fp) + sw $v0, -16($fp) + + # assign (add here the expr.to_string) to t_327 + #load the variable i_311 + lw $v0, -16($fp) + sw $v0, -80($fp) + + ifend_15: + # assign (add here the expr.to_string) to t_323 + #load the variable t_327 + lw $v0, -80($fp) + sw $v0, -64($fp) + + j ifend_14 + then_14: + # assign (add here the expr.to_string) to t_351 + #load the variable s_306 + lw $v0, 12($fp) + sw $v0, -176($fp) + + # assign (add here the expr.to_string) to t_352 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable i_311 + lw $v0, -16($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -180($fp) + + # assign (add here the expr.to_string) to t_353 + #load the variable t_352 + lw $v0, -180($fp) + sw $v0, -184($fp) + + # assign (add here the expr.to_string) to t_354 + #load the variable s_306 + lw $v0, 12($fp) + sw $v0, -188($fp) + + lw $v0, -188($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_355 + # calling the method length of type String + #load the variable t_354 + lw $v0, -188($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -192($fp) + + # assign (add here the expr.to_string) to t_356 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_355 + lw $v0, -192($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable i_311 + lw $v0, -16($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -196($fp) + + # assign (add here the expr.to_string) to t_357 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_356 + lw $v0, -196($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -200($fp) + + # assign (add here the expr.to_string) to t_358 + #load the variable t_357 + lw $v0, -200($fp) + sw $v0, -204($fp) + + lw $v0, -176($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -184($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -204($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_359 + # calling the method substr of type String + #load the variable t_351 + lw $v0, -176($fp) + lw $t0, 0($v0) + lw $v1, 32($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -208($fp) + + # Setting value of the attribute rest in the instance self_Parse to t_359 + #load the variable t_359 + lw $v0, -208($fp) + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 8($v1) + + # assign (add here the expr.to_string) to i_311 + #load the variable j_308 + lw $v0, -4($fp) + sw $v0, -16($fp) + + # assign (add here the expr.to_string) to t_323 + #load the variable i_311 + lw $v0, -16($fp) + sw $v0, -64($fp) + + ifend_14: + # assign (add here the expr.to_string) to t_314 + #load the variable t_323 + lw $v0, -64($fp) + sw $v0, -28($fp) + + j while_2 + pool_2: + # assign (add here the expr.to_string) to t_360 + #load the variable int_307 + lw $v0, -0($fp) + sw $v0, -212($fp) + + # return the value of the function in the register $v0 + #load the variable t_360 + lw $v0, -212($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 216 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_Parse: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 12 + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to self_Parse + jal Init_IO + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, 12($fp) + + # assign (add here the expr.to_string) to t_151 + li $a0, 4 + li $v0, 9 + syscall + la $a0, BoolOp + sw $a0, 0($v0) + sw $v0, -0($fp) + + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_152 + # calling the method Init_BoolOp of type BoolOp + #load the variable t_151 + lw $v0, -0($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -4($fp) + + # Setting value of the attribute boolop in the instance self_Parse to t_152 + #load the variable t_152 + lw $v0, -4($fp) + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 4($v1) + + # assign (add here the expr.to_string) to t_361 + #load the string str_empty + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_empty + sw $v1, 4($v0) + sw $v0, -8($fp) + + # Setting value of the attribute rest in the instance self_Parse to t_361 + #load the variable t_361 + lw $v0, -8($fp) + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 8($v1) + + # return the value of the function in the register $v0 + #load the variable self_Parse + lw $v0, 12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 12 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +main_Main: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 28 + + # assign (add here the expr.to_string) to t_363 + lw $v1, 12($fp) + lw $v0, 12($v1) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_364 + #load the variable t_363 + lw $v0, -0($fp) + sw $v0, -4($fp) + + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_365 + # calling the method print_V of type Graph + #load the variable t_364 + lw $v0, -4($fp) + lw $t0, 0($v0) + lw $v1, 32($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_366 + lw $v1, 12($fp) + lw $v0, 12($v1) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_367 + #load the variable t_366 + lw $v0, -12($fp) + sw $v0, -16($fp) + + lw $v0, -16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_368 + # calling the method print_E of type Graph + #load the variable t_367 + lw $v0, -16($fp) + lw $t0, 0($v0) + lw $v1, 28($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_369 + #load the variable t_368 + lw $v0, -20($fp) + sw $v0, -24($fp) + + # return the value of the function in the register $v0 + #load the variable t_369 + lw $v0, -24($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 28 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_Main: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 4 + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to self_Main + jal Init_Parse + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, 12($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_362 + # calling the method read_input of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 40($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -0($fp) + + # Setting value of the attribute g in the instance self_Main to t_362 + #load the variable t_362 + lw $v0, -0($fp) + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 12($v1) + + # return the value of the function in the register $v0 + #load the variable self_Main + lw $v0, 12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 4 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +and_BoolOp: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 16 + + # assign (add here the expr.to_string) to t_372 + #load the variable b1_370 + lw $v0, 16($fp) + sw $v0, -0($fp) + + lw $t1, -0($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_17 + # assign (add here the expr.to_string) to t_374 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_373 + #load the variable t_374 + lw $v0, -8($fp) + sw $v0, -4($fp) + + j ifend_17 + then_17: + # assign (add here the expr.to_string) to t_373 + #load the variable b2_371 + lw $v0, 12($fp) + sw $v0, -4($fp) + + ifend_17: + # assign (add here the expr.to_string) to t_375 + #load the variable t_373 + lw $v0, -4($fp) + sw $v0, -12($fp) + + # return the value of the function in the register $v0 + #load the variable t_375 + lw $v0, -12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 16 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +or_BoolOp: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 16 + + # assign (add here the expr.to_string) to t_378 + #load the variable b1_376 + lw $v0, 16($fp) + sw $v0, -0($fp) + + lw $t1, -0($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_18 + # assign (add here the expr.to_string) to t_379 + #load the variable b2_377 + lw $v0, 12($fp) + sw $v0, -4($fp) + + j ifend_18 + then_18: + # assign (add here the expr.to_string) to t_380 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_379 + #load the variable t_380 + lw $v0, -8($fp) + sw $v0, -4($fp) + + ifend_18: + # assign (add here the expr.to_string) to t_381 + #load the variable t_379 + lw $v0, -4($fp) + sw $v0, -12($fp) + + # return the value of the function in the register $v0 + #load the variable t_381 + lw $v0, -12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 16 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_BoolOp: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 0 + + # return the value of the function in the register $v0 + #load the variable self_BoolOp + lw $v0, 12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 0 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_Object: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 0 + + # return the value of the function in the register $v0 + #load the variable self + lw $v0, 12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 0 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_Int: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 0 + + # Setting value of the attribute value in the instance self to v + #load the variable v + lw $v0, 12($fp) + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 4($v1) + + # return the value of the function in the register $v0 + #load the variable self + lw $v0, 16($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 0 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_String: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 0 + + # Setting value of the attribute value in the instance self to v + #load the variable v + lw $v0, 12($fp) + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 4($v1) + + # return the value of the function in the register $v0 + #load the variable self + lw $v0, 16($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 0 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_Bool: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 0 + + # Setting value of the attribute value in the instance self to v + #load the variable v + lw $v0, 12($fp) + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 4($v1) + + # return the value of the function in the register $v0 + #load the variable self + lw $v0, 16($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 0 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_IO: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 0 + + # return the value of the function in the register $v0 + #load the variable self + lw $v0, 12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 0 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + +abort_Object: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + la $a0, ObjectAbortMessage + li $v0, 4 + syscall + + lw $t0, 12($fp) + lw $t0, 0($t0) + lw $t0, 4($t0) + + move $a0, $t0 + li $v0, 4 + syscall + + li $v0, 10 + syscall + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + +copy_Object: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + + lw $t7, 12($fp) # load the object address + lw $t6, 0($t7) # get the type info address + lw $t5, 0($t6) # get the size of the type + + move $a0, $t5 + li $v0, 9 + syscall + move $t6, $v0 +copy_Object_loop: + lw $t4, 0($t7) + sw $t4, 0($t6) + addu $t7, $t7, 4 + addu $t6, $t6, 4 + addu $t5, $t5, -4 + bgtz $t5, copy_Object_loop + + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + + + +out_string_IO: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + + lw $a1, 12($fp) # reference to string object + lw $a0, 4($a1) # get the address of the value of the string + li $v0, 4 + syscall + + lw $v0, 16($fp) + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + +out_int_IO: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + lw $v1, 12($fp) + lw $a0, 4($v1) + li $v0, 1 + syscall + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + +in_string_IO: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + # Read the string to the buffer + la $a0, IO_Buffer + li $a1, 1000 + li $v0, 8 + syscall + + # get the length of the string to allocate the memory + la $t0, IO_Buffer + sw $t0, 0($sp) + addi $sp, $sp, -4 + jal strlen + addi $sp, $sp, 4 + lw $t0, 0($sp) # the length is now in $v0 + + addi $v0, $v0, 1 + move $a0, $v0 + li $v0, 9 + syscall # in $v0 is the address of the value string + + la $t1, IO_Buffer # copy the string value from the buffer to the heap + move $t2, $v0 + in_string_IO_loop: + lb $t3, 0($t1) + sb $t3, 0($t2) + addi $t1, $t1, 1 + addi $t2, $t2, 1 + bgtz $t3, in_string_IO_loop + addi $t2, $t2, -2 + + li $t4, 10 + lb $t5, 0($t2) + bne $t5, $t4, in_string_IO_end + li $t3, 0 + sb $t3, 0($t2) + + in_string_IO_end: + move $t0, $v0 + + li $a0, 8 + li $v0, 9 + syscall + + la $t1, String + sw $t0, 4($v0) + sw $t1, 0($v0) + + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + +in_int_IO: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + li $v0, 5 + syscall + move $t0, $v0 + + li $v0, 9 + li $a0, 8 + syscall + + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + + + + + + + + + + + +type_name_Object: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + lw $t7, 12($fp) # get the instance address + lw $t6, 0($t7) # get the type info address + lw $t5, 4($t6) # get the type name + + # create the String class instance to return + li $a0, 8 + li $v0, 9 + syscall + + la $t1, String + sw $t1, 0($v0) + sw $t5, 4($v0) + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + +substr_String: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + lw $t7, 20($fp) # get the String instance address + lw $t0, 4($t7) # get the value of the source String + + lw $t7, 16($fp) # get the start parameter Int instance address + lw $t1, 4($t7) # get the value of the Int + + lw $t7, 12($fp) # get the length perameter Int instance address + lw $t2, 4($t7) # get the value of the Int + + move $a0, $t2 + addi $a0, $a0, 1 + li $v0, 9 + syscall # allocate memory for the substring value + + + li $t3, 0 # current pos in the string + + substr_String_loop1: + beq $t3, $t1, substr_String_eloop1 # if the current pos == start pos break + # else move the current pos + addi $t0, $t0, 1 + addi $t3, $t3, 1 + j substr_String_loop1 + + substr_String_eloop1: + + li $t3, 0 + move $t4, $v0 # move the substring address to $t4 + + substr_String_loop2: + beq $t3, $t2, substr_String_eloop2 + lb $t7, 0($t0) + sb $t7, 0($t4) + addi $t0, $t0, 1 + addi $t4, $t4, 1 + addi $t3, $t3, 1 + j substr_String_loop2 + + substr_String_eloop2: + sb $zero, 0($t4) + move $t0, $v0 + la $t1, String + + li $a0, 8 + li $v0, 9 + syscall + + sw $t1, 0($v0) + sw $t0, 4($v0) + + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + + +isvoid: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + lw $t0, 12($fp) + li $t1, 0 + beq $t0, $t1, isvoid_end + li $t0, 1 + isvoid_end: + + li $a0, 8 + li $v0, 9 + syscall + + la $t1, Bool + sw $t1, 0($v0) + sw $t0, 4($v0) + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + +# function to get the length of a string value +strlen: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + + lw $a0, 12($fp) + li $t0, 0 +strlen_loop: + lbu $t1, 0($a0) + beqz $t1, strlen_exit + addu $a0, $a0, 1 + addu $t0, $t0, 1 + j strlen_loop + strlen_exit: + move $v0, $t0 + + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + + +length_String: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + lw $v0, 12($fp) # get the string instance address + lw $v1, 4($v0) # get the string value address + + # push the instace in the stack + sw $v1, 0($sp) + addi $sp, $sp, -4 + + jal strlen # length at v0 + + addi $sp, $sp, 4 + lw $t0, 0($sp) + + + move $t0, $v0 + + # allocate space for the Int instace + li $a0, 8 + li $v0, 9 + syscall + + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + + +compare: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + lw $t0, 12($fp) + lw $t1, 16($fp) + + lw $t3, 0($t0) + + la $t4, Int + beq $t3, $t4, compare_branch1 + + la $t4, Bool + beq $t3, $t4, compare_branch1 + + la $t4, type + beq $t3, $t4, compare_branch1 + + la $t4, String + beq $t3, $t4, compare_branch2 + + j compare_values + + compare_branch1: + lw $t0, 4($t0) + lw $t1, 4($t1) + + compare_values: + beq $t0, $t1, compare_true + j compare_false + + + compare_branch2: + lw $t0, 4($t0) + lw $t1, 4($t1) + compare_str_loop: + lbu $t3, 0($t0) + lbu $t4, 0($t1) + bne $t3, $t4, compare_false + beq $t3, $zero, compare_true + addi $t0, $t0, 1 + addi $t1, $t1, 1 + j compare_str_loop + + compare_true: + li $t0, 1 + j compare_end + + compare_false: + li $t0, 0 + + compare_end: + + li $a0, 8 + li $v0, 9 + syscall + la $t1, Bool + sw $t1, 0($v0) + sw $t0, 4($v0) + + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + + +concat_String: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + lw $t0, 16($fp) + lw $t0, 4($t0) # the value of the first String instance + + # call strlen with the string + sw $t0, 0($sp) + addi $sp, $sp, -4 + jal strlen + addi $sp, $sp, 4 + lw $t0, 0($sp) + + #save the lenght of the first string + sw $v0, 0($sp) + addi $sp, $sp, -4 + + + lw $t0, 16($fp) + lw $t0, 4($t0) # the value of the second String instance + + # call strlen with the string + sw $t0, 0($sp) + addi $sp, $sp, -4 + jal strlen + addi $sp, $sp, 4 + lw $t0, 0($sp) + + # pop the lenght of the first string from the stack + addi $sp, $sp, 4 + lw $t0, 0($sp) + + # get the total space for allocating the new string + addu $t0, $t0, $v0 + addi $t0, $t0, 1 + + move $a0, $t0 + li $v0, 9 + syscall # at $v0 is the result string + + lw $t0, 16($fp) + lw $t0, 4($t0) # the address of the value of the first String instance + move $t1, $v0 # the address of the value of the result string + concat_String_loop1: + lbu $t3, 0($t0) + beq $t3, $zero, concat_String_eloop1 + sb $t3, 0($t1) + addi $t0, $t0, 1 + addi $t1, $t1, 1 + j concat_String_loop1 + + concat_String_eloop1: + + lw $t0, 12($fp) + lw $t0, 4($t0) + concat_String_loop2: + lbu $t3, 0($t0) + beq $t3, $zero, concat_String_eloop2 + sb $t3, 0($t1) + addi $t0, $t0, 1 + addi $t1, $t1, 1 + j concat_String_loop2 + concat_String_eloop2: + sb $zero, 0($t1) + + la $t0, String + move $t1, $v0 + + li $a0, 8 + li $v0, 9 + syscall + + sw $t0, 0($v0) + sw $t1, 4($v0) + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/result.s b/src/result.s index 7138e7241..606b67e61 100644 --- a/src/result.s +++ b/src/result.s @@ -1,41 +1,51 @@ .data -_Main: .asciiz "Main" + .align 4 +type: .word 8 + + .data +_Board: .asciiz "Board\n" + .data + .align 4 +Board: .word 16 _Board Init_Board abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO size_of_board_Board board_init_Board + + .data +_CellularAutomaton: .asciiz "CellularAutomaton\n" .data .align 4 -Main: .word 4 _Main Init_Main abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO main_Main +CellularAutomaton: .word 20 _CellularAutomaton Init_CellularAutomaton abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO size_of_board_Board board_init_Board init_CellularAutomaton print_CellularAutomaton num_cells_CellularAutomaton cell_CellularAutomaton north_CellularAutomaton south_CellularAutomaton east_CellularAutomaton west_CellularAutomaton northwest_CellularAutomaton northeast_CellularAutomaton southeast_CellularAutomaton southwest_CellularAutomaton neighbors_CellularAutomaton cell_at_next_evolution_CellularAutomaton evolve_CellularAutomaton option_CellularAutomaton prompt_CellularAutomaton prompt2_CellularAutomaton .data -_Complex: .asciiz "Complex" +_Main: .asciiz "Main\n" .data .align 4 -Complex: .word 12 _Complex Init_Complex abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO init_Complex print_Complex reflect_0_Complex reflect_X_Complex reflect_Y_Complex equal_Complex x_value_Complex y_value_Complex +Main: .word 24 _Main Init_Main abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO size_of_board_Board board_init_Board init_CellularAutomaton print_CellularAutomaton num_cells_CellularAutomaton cell_CellularAutomaton north_CellularAutomaton south_CellularAutomaton east_CellularAutomaton west_CellularAutomaton northwest_CellularAutomaton northeast_CellularAutomaton southeast_CellularAutomaton southwest_CellularAutomaton neighbors_CellularAutomaton cell_at_next_evolution_CellularAutomaton evolve_CellularAutomaton option_CellularAutomaton prompt_CellularAutomaton prompt2_CellularAutomaton main_Main .data -_Object: .asciiz "Object" +_Object: .asciiz "Object\n" .data .align 4 Object: .word 4 _Object Init_Object abort_Object type_name_Object copy_Object .data -_Int: .asciiz "Int" +_Int: .asciiz "Int\n" .data .align 4 Int: .word 8 _Int Init_Int abort_Object type_name_Object copy_Object .data -_String: .asciiz "String" +_String: .asciiz "String\n" .data .align 4 String: .word 8 _String Init_String abort_Object type_name_Object copy_Object length_String concat_String substr_String .data -_Bool: .asciiz "Bool" +_Bool: .asciiz "Bool\n" .data .align 4 Bool: .word 8 _Bool Init_Bool abort_Object type_name_Object copy_Object .data -_IO: .asciiz "IO" +_IO: .asciiz "IO\n" .data .align 4 IO: .word 4 _IO Init_IO abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO @@ -45,16 +55,265 @@ ObjectAbortMessage : .asciiz "Abort called from class " .data IO_Buffer : .space 1001 .data -str_0: .asciiz "=(\n" +str_empty: .asciiz "" + + .data +str_0: .asciiz "\n" + + .data +str_1: .asciiz "\n" + + .data +str_2: .asciiz "\n" + + .data +str_3: .asciiz " " + + .data +str_4: .asciiz " " + + .data +str_5: .asciiz " " + + .data +str_6: .asciiz " " + + .data +str_7: .asciiz " " + + .data +str_8: .asciiz " " + + .data +str_9: .asciiz " " + + .data +str_10: .asciiz " " + + .data +str_11: .asciiz " " + + .data +str_12: .asciiz " " + + .data +str_13: .asciiz " " + + .data +str_14: .asciiz " " + + .data +str_15: .asciiz " " + + .data +str_16: .asciiz " " + + .data +str_17: .asciiz "X" + + .data +str_18: .asciiz "X" + + .data +str_19: .asciiz "X" + + .data +str_20: .asciiz "X" + + .data +str_21: .asciiz "X" + + .data +str_22: .asciiz "X" + + .data +str_23: .asciiz "X" + + .data +str_24: .asciiz "X" + + .data +str_25: .asciiz "-" + + .data +str_26: .asciiz "X" + + .data +str_27: .asciiz "-" + + .data +str_28: .asciiz "X" + + .data +str_29: .asciiz "X" + + .data +str_30: .asciiz "\nPlease chose a number:\n" + + .data +str_31: .asciiz "\t1: A cross\n" + + .data +str_32: .asciiz "\t2: A slash from the upper left to lower right\n" + + .data +str_33: .asciiz "\t3: A slash from the upper right to lower left\n" + + .data +str_34: .asciiz "\t4: An X\n" + + .data +str_35: .asciiz "\t5: A greater than sign \n" + + .data +str_36: .asciiz "\t6: A less than sign\n" + + .data +str_37: .asciiz "\t7: Two greater than signs\n" + + .data +str_38: .asciiz "\t8: Two less than signs\n" + + .data +str_39: .asciiz "\t9: A 'V'\n" + + .data +str_40: .asciiz "\t10: An inverse 'V'\n" + + .data +str_41: .asciiz "\t11: Numbers 9 and 10 combined\n" + + .data +str_42: .asciiz "\t12: A full grid\n" + + .data +str_43: .asciiz "\t13: A 'T'\n" + + .data +str_44: .asciiz "\t14: A plus '+'\n" + + .data +str_45: .asciiz "\t15: A 'W'\n" + + .data +str_46: .asciiz "\t16: An 'M'\n" + + .data +str_47: .asciiz "\t17: An 'E'\n" + + .data +str_48: .asciiz "\t18: A '3'\n" + + .data +str_49: .asciiz "\t19: An 'O'\n" + + .data +str_50: .asciiz "\t20: An '8'\n" + + .data +str_51: .asciiz "\t21: An 'S'\n" + + .data +str_52: .asciiz "Your choice => " + + .data +str_53: .asciiz "\n" + + .data +str_54: .asciiz " " + + .data +str_55: .asciiz " XXXX X XX X XXXX " + + .data +str_56: .asciiz " XX X XX X XX X XX X XX " + + .data +str_57: .asciiz " XX X XX X XX " + + .data +str_58: .asciiz "XXX X X X X XXXX " + + .data +str_59: .asciiz "XXXXX X XXXXX X XXXX" + + .data +str_60: .asciiz " X X X X X X X" + + .data +str_61: .asciiz "X X X X X X X " + + .data +str_62: .asciiz " X X XXXXX X X " + + .data +str_63: .asciiz "XXXXX X X X X " + + .data +str_64: .asciiz "XXXXXXXXXXXXXXXXXXXXXXXXX" + + .data +str_65: .asciiz "X X X X X X X X" + + .data +str_66: .asciiz " X X X X X" + + .data +str_67: .asciiz "X X X X X " + + .data +str_68: .asciiz " X XX X X X " + + .data +str_69: .asciiz "X X X XX X " + + .data +str_70: .asciiz " X X X X X" + + .data +str_71: .asciiz "X X X X X " + + .data +str_72: .asciiz "X X X X X X X X X" + + .data +str_73: .asciiz "X X X X X" + + .data +str_74: .asciiz " X X X X X " + + .data +str_75: .asciiz " XX XXXX XXXX XX " + + .data +str_76: .asciiz "Would you like to continue with the next generation? \n" + + .data +str_77: .asciiz "Please use lowercase y or n for your answer [y]: " + + .data +str_78: .asciiz "\n" + + .data +str_79: .asciiz "n" + + .data +str_80: .asciiz "\n\n" + + .data +str_81: .asciiz "Would you like to choose a background pattern? \n" + + .data +str_82: .asciiz "Please use lowercase y or n for your answer [n]: " .data -str_1: .asciiz "=)\n" +str_83: .asciiz "y" .data -str_2: .asciiz "+" +str_84: .asciiz "Welcome to the Game of Life.\n" .data -str_3: .asciiz "I" +str_85: .asciiz "There are many initial states to choose from. \n" .text main: @@ -72,7 +331,7 @@ main: subu $sp $sp 12 # assign (add here the expr.to_string) to m0 - li $a0, 4 + li $a0, 24 li $v0, 9 syscall la $a0, Main @@ -88,8 +347,8 @@ main: # calling the method Init_Main of type Main #load the variable m0 lw $v0, -0($fp) - lw $v0, 0($v0) - lw $v1, 8($v0) + lw $t0, 0($v0) + lw $v1, 8($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -106,8 +365,8 @@ main: # calling the method main of type Main #load the variable m1 lw $v0, -4($fp) - lw $v0, 0($v0) - lw $v1, 40($v0) + lw $t0, 0($v0) + lw $v1, 120($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -134,7 +393,7 @@ main: syscall .text -main_Main: +size_of_board_Board: # save the return address and frame pointer # push $ra to the stack sw $ra, 0($sp) @@ -146,84 +405,89 @@ main_Main: # update the frame pointer and allocate the frame in the stack move $fp $sp - subu $sp $sp 84 + subu $sp $sp 12 # assign (add here the expr.to_string) to t_1 - li $a0, 12 - li $v0, 9 - syscall - la $a0, Complex - sw $a0, 0($v0) - sw $v0, -4($fp) + #load the variable initial_0 + lw $v0, 12($fp) + sw $v0, -0($fp) - lw $v0, -4($fp) + lw $v0, -0($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 # assign (add here the expr.to_string) to t_2 - # calling the method Init_Complex of type Complex + # calling the method length of type String #load the variable t_1 - lw $v0, -4($fp) - lw $v0, 0($v0) - lw $v1, 8($v0) + lw $v0, -0($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -8($fp) + sw $v0, -4($fp) # assign (add here the expr.to_string) to t_3 #load the variable t_2 + lw $v0, -4($fp) + sw $v0, -8($fp) + + # return the value of the function in the register $v0 + #load the variable t_3 lw $v0, -8($fp) - sw $v0, -12($fp) + move $v0, $v0 - # assign (add here the expr.to_string) to t_4 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) + # restore the stack pointer, frame pointer y return address + addu $sp $sp 12 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) - sw $v0, -16($fp) + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) - # assign (add here the expr.to_string) to t_5 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) + jr $ra - sw $v0, -20($fp) + .text +board_init_Board: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 - lw $v0, -12($fp) - # push $v0 to the stack - sw $v0, 0($sp) + # push $fp to the stack + sw $fp, 0($sp) addi $sp $sp -4 - lw $v0, -16($fp) + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 88 + + # assign (add here the expr.to_string) to t_6 + #load the variable start_4 + lw $v0, 12($fp) + sw $v0, -4($fp) + + lw $v0, 16($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -20($fp) + lw $v0, -4($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_6 - # calling the method init of type Complex - #load the variable t_3 - lw $v0, -12($fp) - lw $v0, 0($v0) - lw $v1, 40($v0) + # assign (add here the expr.to_string) to t_7 + # calling the method size_of_board of type Board + #load the variable self_Board + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 40($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -233,127 +497,7805 @@ main_Main: addi $sp $sp 4 lw $v1, 0($sp) - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) + sw $v0, -8($fp) - sw $v0, -24($fp) + # assign (add here the expr.to_string) to size_5 + #load the variable t_7 + lw $v0, -8($fp) + sw $v0, -0($fp) - # assign (add here the expr.to_string) to c_0 - #load the variable t_6 - lw $v0, -24($fp) - sw $v0, -0($fp) + # assign (add here the expr.to_string) to t_8 + #load the variable size_5 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # assign (add here the expr.to_string) to t_7 - #load the variable c_0 + # Creating Int instance for atomic 15 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 15 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_9 + #load the variable t_8 + lw $v0, -12($fp) + sw $v0, -16($fp) + + lw $t1, -16($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_0 + # assign (add here the expr.to_string) to t_11 + #load the variable size_5 lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 16 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 16 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_12 + #load the variable t_11 + lw $v0, -24($fp) sw $v0, -28($fp) - lw $v0, -28($fp) + lw $t1, -28($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_1 + # assign (add here the expr.to_string) to t_14 + #load the variable size_5 + lw $v0, -0($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_8 - # calling the method reflect_X of type Complex - #load the variable t_7 - lw $v0, -28($fp) - lw $v0, 0($v0) - lw $v1, 52($v0) - jal $v1 - # pop the top of the stack to $v1 + # Creating Int instance for atomic 20 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 20 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $v1, 0($sp) + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_15 + #load the variable t_14 + lw $v0, -36($fp) + sw $v0, -40($fp) + + lw $t1, -40($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_2 + # assign (add here the expr.to_string) to t_17 + #load the variable size_5 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 21 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 21 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -48($fp) + + # assign (add here the expr.to_string) to t_18 + #load the variable t_17 + lw $v0, -48($fp) + sw $v0, -52($fp) + + lw $t1, -52($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_3 + # assign (add here the expr.to_string) to t_20 + #load the variable size_5 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 25 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 25 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -60($fp) + + # assign (add here the expr.to_string) to t_21 + #load the variable t_20 + lw $v0, -60($fp) + sw $v0, -64($fp) + + lw $t1, -64($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_4 + # assign (add here the expr.to_string) to t_23 + #load the variable size_5 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 28 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 28 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -72($fp) + + # assign (add here the expr.to_string) to t_24 + #load the variable t_23 + lw $v0, -72($fp) + sw $v0, -76($fp) + + lw $t1, -76($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_5 + # Setting value of the attribute rows in the instance self_Board to 5 + # Creating Int instance for atomic 5 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 5 + sw $t0, 0($v0) + sw $t1, 4($v0) + + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 4($v1) + + # Setting value of the attribute columns in the instance self_Board to 5 + # Creating Int instance for atomic 5 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 5 + sw $t0, 0($v0) + sw $t1, 4($v0) + + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 8($v1) + + # Setting value of the attribute board_size in the instance self_Board to size_5 + #load the variable size_5 + lw $v0, -0($fp) + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 12($v1) + + # assign (add here the expr.to_string) to t_25 + #load the variable size_5 + lw $v0, -0($fp) + sw $v0, -80($fp) + + j ifend_5 + then_5: + # Setting value of the attribute rows in the instance self_Board to 7 + # Creating Int instance for atomic 7 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 7 + sw $t0, 0($v0) + sw $t1, 4($v0) + + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 4($v1) + + # Setting value of the attribute columns in the instance self_Board to 4 + # Creating Int instance for atomic 4 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 4 + sw $t0, 0($v0) + sw $t1, 4($v0) + + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 8($v1) + + # Setting value of the attribute board_size in the instance self_Board to size_5 + #load the variable size_5 + lw $v0, -0($fp) + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 12($v1) + + # assign (add here the expr.to_string) to t_25 + #load the variable size_5 + lw $v0, -0($fp) + sw $v0, -80($fp) + + ifend_5: + # assign (add here the expr.to_string) to t_22 + #load the variable t_25 + lw $v0, -80($fp) + sw $v0, -68($fp) + + j ifend_4 + then_4: + # Setting value of the attribute rows in the instance self_Board to 5 + # Creating Int instance for atomic 5 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 5 + sw $t0, 0($v0) + sw $t1, 4($v0) + + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 4($v1) + + # Setting value of the attribute columns in the instance self_Board to 5 + # Creating Int instance for atomic 5 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 5 + sw $t0, 0($v0) + sw $t1, 4($v0) + + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 8($v1) + + # Setting value of the attribute board_size in the instance self_Board to size_5 + #load the variable size_5 + lw $v0, -0($fp) + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 12($v1) + + # assign (add here the expr.to_string) to t_22 + #load the variable size_5 + lw $v0, -0($fp) + sw $v0, -68($fp) + + ifend_4: + # assign (add here the expr.to_string) to t_19 + #load the variable t_22 + lw $v0, -68($fp) + sw $v0, -56($fp) + + j ifend_3 + then_3: + # Setting value of the attribute rows in the instance self_Board to 3 + # Creating Int instance for atomic 3 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 3 + sw $t0, 0($v0) + sw $t1, 4($v0) + + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 4($v1) + + # Setting value of the attribute columns in the instance self_Board to 7 + # Creating Int instance for atomic 7 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 7 + sw $t0, 0($v0) + sw $t1, 4($v0) + + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 8($v1) + + # Setting value of the attribute board_size in the instance self_Board to size_5 + #load the variable size_5 + lw $v0, -0($fp) + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 12($v1) + + # assign (add here the expr.to_string) to t_19 + #load the variable size_5 + lw $v0, -0($fp) + sw $v0, -56($fp) + + ifend_3: + # assign (add here the expr.to_string) to t_16 + #load the variable t_19 + lw $v0, -56($fp) + sw $v0, -44($fp) + + j ifend_2 + then_2: + # Setting value of the attribute rows in the instance self_Board to 4 + # Creating Int instance for atomic 4 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 4 + sw $t0, 0($v0) + sw $t1, 4($v0) + + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 4($v1) + + # Setting value of the attribute columns in the instance self_Board to 5 + # Creating Int instance for atomic 5 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 5 + sw $t0, 0($v0) + sw $t1, 4($v0) + + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 8($v1) + + # Setting value of the attribute board_size in the instance self_Board to size_5 + #load the variable size_5 + lw $v0, -0($fp) + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 12($v1) + + # assign (add here the expr.to_string) to t_16 + #load the variable size_5 + lw $v0, -0($fp) + sw $v0, -44($fp) + + ifend_2: + # assign (add here the expr.to_string) to t_13 + #load the variable t_16 + lw $v0, -44($fp) + sw $v0, -32($fp) + + j ifend_1 + then_1: + # Setting value of the attribute rows in the instance self_Board to 4 + # Creating Int instance for atomic 4 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 4 + sw $t0, 0($v0) + sw $t1, 4($v0) + + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 4($v1) + + # Setting value of the attribute columns in the instance self_Board to 4 + # Creating Int instance for atomic 4 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 4 + sw $t0, 0($v0) + sw $t1, 4($v0) + + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 8($v1) + + # Setting value of the attribute board_size in the instance self_Board to size_5 + #load the variable size_5 + lw $v0, -0($fp) + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 12($v1) + + # assign (add here the expr.to_string) to t_13 + #load the variable size_5 + lw $v0, -0($fp) + sw $v0, -32($fp) + + ifend_1: + # assign (add here the expr.to_string) to t_10 + #load the variable t_13 + lw $v0, -32($fp) + sw $v0, -20($fp) + + j ifend_0 + then_0: + # Setting value of the attribute rows in the instance self_Board to 3 + # Creating Int instance for atomic 3 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 3 + sw $t0, 0($v0) + sw $t1, 4($v0) + + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 4($v1) + + # Setting value of the attribute columns in the instance self_Board to 5 + # Creating Int instance for atomic 5 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 5 + sw $t0, 0($v0) + sw $t1, 4($v0) + + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 8($v1) + + # Setting value of the attribute board_size in the instance self_Board to size_5 + #load the variable size_5 + lw $v0, -0($fp) + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 12($v1) + + # assign (add here the expr.to_string) to t_10 + #load the variable size_5 + lw $v0, -0($fp) + sw $v0, -20($fp) + + ifend_0: + # assign (add here the expr.to_string) to t_26 + #load the variable self_Board + lw $v0, 16($fp) + sw $v0, -84($fp) + + # return the value of the function in the register $v0 + #load the variable t_26 + lw $v0, -84($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 88 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_Board: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 0 + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to self_Board + jal Init_IO + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, 12($fp) + + # Setting value of the attribute rows in the instance self_Board to 0 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 4($v1) + + # Setting value of the attribute columns in the instance self_Board to 0 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 8($v1) + + # Setting value of the attribute board_size in the instance self_Board to 0 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 12($v1) + + # return the value of the function in the register $v0 + #load the variable self_Board + lw $v0, 12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 0 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +init_CellularAutomaton: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 12 + + # Setting value of the attribute population_map in the instance self_CellularAutomaton to map_27 + #load the variable map_27 + lw $v0, 12($fp) + move $s2, $v0 + lw $v1, 16($fp) + sw $s2, 16($v1) + + # assign (add here the expr.to_string) to t_28 + #load the variable map_27 + lw $v0, 12($fp) + sw $v0, -0($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_29 + # calling the method board_init of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 44($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_30 + #load the variable self_CellularAutomaton + lw $v0, 16($fp) + sw $v0, -8($fp) + + # return the value of the function in the register $v0 + #load the variable t_30 + lw $v0, -8($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 12 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +print_CellularAutomaton: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 104 + + # assign (add here the expr.to_string) to i_31 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_33 + lw $v1, 12($fp) + lw $v0, 12($v1) + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to num_32 + #load the variable t_33 + lw $v0, -8($fp) + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_34 + #load the string str_0 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_0 + sw $v1, 4($v0) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_35 + #load the variable t_34 + lw $v0, -12($fp) + sw $v0, -16($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_36 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -20($fp) + + while_0: + # assign (add here the expr.to_string) to t_37 + #load the variable i_31 + lw $v0, -0($fp) + move $t1, $v0 + lw $t1, 4($t1) + #load the variable num_32 + lw $v0, -4($fp) + move $t2, $v0 + lw $t2, 4($t2) + slt $t3, $t1, $t2 + la $t4, Bool + li $a0, 8 + li $v0, 9 + syscall + sw $t4, 0($v0) + sw $t3, 4($v0) + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_38 + #load the variable t_37 + lw $v0, -24($fp) + sw $v0, -28($fp) + + lw $t1, -28($fp) + lw $t0, 4($t1) + bne $t0, $zero, body_0 + j pool_0 + body_0: + # assign (add here the expr.to_string) to t_40 + lw $v1, 12($fp) + lw $v0, 16($v1) + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_41 + #load the variable t_40 + lw $v0, -36($fp) + sw $v0, -40($fp) + + # assign (add here the expr.to_string) to t_42 + #load the variable i_31 + lw $v0, -0($fp) + sw $v0, -44($fp) + + # assign (add here the expr.to_string) to t_43 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -48($fp) + + # assign (add here the expr.to_string) to t_44 + #load the variable t_43 + lw $v0, -48($fp) + sw $v0, -52($fp) + + lw $v0, -40($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -44($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -52($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_45 + # calling the method substr of type String + #load the variable t_41 + lw $v0, -40($fp) + lw $t0, 0($v0) + lw $v1, 32($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -56($fp) + + # assign (add here the expr.to_string) to t_46 + #load the variable t_45 + lw $v0, -56($fp) + sw $v0, -60($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -60($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_47 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -64($fp) + + # assign (add here the expr.to_string) to t_48 + #load the string str_1 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_1 + sw $v1, 4($v0) + sw $v0, -68($fp) + + # assign (add here the expr.to_string) to t_49 + #load the variable t_48 + lw $v0, -68($fp) + sw $v0, -72($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -72($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_50 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -76($fp) + + # assign (add here the expr.to_string) to t_51 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -80($fp) + + # assign (add here the expr.to_string) to t_52 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable i_31 + lw $v0, -0($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_51 + lw $v0, -80($fp) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -84($fp) + + # assign (add here the expr.to_string) to i_31 + #load the variable t_52 + lw $v0, -84($fp) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_39 + #load the variable i_31 + lw $v0, -0($fp) + sw $v0, -32($fp) + + j while_0 + pool_0: + # assign (add here the expr.to_string) to t_53 + #load the string str_2 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_2 + sw $v1, 4($v0) + sw $v0, -88($fp) + + # assign (add here the expr.to_string) to t_54 + #load the variable t_53 + lw $v0, -88($fp) + sw $v0, -92($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -92($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_55 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -96($fp) + + # assign (add here the expr.to_string) to t_56 + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + sw $v0, -100($fp) + + # return the value of the function in the register $v0 + #load the variable t_56 + lw $v0, -100($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 104 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +num_cells_CellularAutomaton: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 16 + + # assign (add here the expr.to_string) to t_57 + lw $v1, 12($fp) + lw $v0, 16($v1) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_58 + #load the variable t_57 + lw $v0, -0($fp) + sw $v0, -4($fp) + + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_59 + # calling the method length of type String + #load the variable t_58 + lw $v0, -4($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_60 + #load the variable t_59 + lw $v0, -8($fp) + sw $v0, -12($fp) + + # return the value of the function in the register $v0 + #load the variable t_60 + lw $v0, -12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 16 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +cell_CellularAutomaton: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 48 + + # assign (add here the expr.to_string) to t_62 + lw $v1, 16($fp) + lw $v0, 12($v1) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_63 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_62 + lw $v0, -0($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_64 + #load the variable t_63 + lw $v0, -4($fp) + move $t1, $v0 + lw $t1, 4($t1) + #load the variable position_61 + lw $v0, 12($fp) + move $t2, $v0 + lw $t2, 4($t2) + slt $t3, $t1, $t2 + la $t4, Bool + li $a0, 8 + li $v0, 9 + syscall + sw $t4, 0($v0) + sw $t3, 4($v0) + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_65 + #load the variable t_64 + lw $v0, -8($fp) + sw $v0, -12($fp) + + lw $t1, -12($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_6 + # assign (add here the expr.to_string) to t_67 + lw $v1, 16($fp) + lw $v0, 16($v1) + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_68 + #load the variable t_67 + lw $v0, -20($fp) + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_69 + #load the variable position_61 + lw $v0, 12($fp) + sw $v0, -28($fp) + + # assign (add here the expr.to_string) to t_70 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -32($fp) + + lw $v0, -24($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -28($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -32($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_71 + # calling the method substr of type String + #load the variable t_68 + lw $v0, -24($fp) + lw $t0, 0($v0) + lw $v1, 32($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_66 + #load the variable t_71 + lw $v0, -36($fp) + sw $v0, -16($fp) + + j ifend_6 + then_6: + # assign (add here the expr.to_string) to t_72 + #load the string str_3 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_3 + sw $v1, 4($v0) + sw $v0, -40($fp) + + # assign (add here the expr.to_string) to t_66 + #load the variable t_72 + lw $v0, -40($fp) + sw $v0, -16($fp) + + ifend_6: + # assign (add here the expr.to_string) to t_73 + #load the variable t_66 + lw $v0, -16($fp) + sw $v0, -44($fp) + + # return the value of the function in the register $v0 + #load the variable t_73 + lw $v0, -44($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 48 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +north_CellularAutomaton: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 44 + + # assign (add here the expr.to_string) to t_75 + lw $v1, 16($fp) + lw $v0, 8($v1) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_76 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable position_74 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_75 + lw $v0, -0($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_77 + #load the variable t_76 + lw $v0, -4($fp) + move $t1, $v0 + lw $t1, 4($t1) + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + move $t2, $v0 + lw $t2, 4($t2) + slt $t3, $t1, $t2 + la $t4, Bool + li $a0, 8 + li $v0, 9 + syscall + sw $t4, 0($v0) + sw $t3, 4($v0) + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_78 + #load the variable t_77 + lw $v0, -8($fp) + sw $v0, -12($fp) + + lw $t1, -12($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_7 + # assign (add here the expr.to_string) to t_80 + lw $v1, 16($fp) + lw $v0, 8($v1) + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_81 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable position_74 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_80 + lw $v0, -20($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_82 + #load the variable t_81 + lw $v0, -24($fp) + sw $v0, -28($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -28($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_83 + # calling the method cell of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 60($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -32($fp) + + # assign (add here the expr.to_string) to t_79 + #load the variable t_83 + lw $v0, -32($fp) + sw $v0, -16($fp) + + j ifend_7 + then_7: + # assign (add here the expr.to_string) to t_84 + #load the string str_4 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_4 + sw $v1, 4($v0) + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_79 + #load the variable t_84 + lw $v0, -36($fp) + sw $v0, -16($fp) + + ifend_7: + # assign (add here the expr.to_string) to t_85 + #load the variable t_79 + lw $v0, -16($fp) + sw $v0, -40($fp) + + # return the value of the function in the register $v0 + #load the variable t_85 + lw $v0, -40($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 44 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +south_CellularAutomaton: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 48 + + # assign (add here the expr.to_string) to t_87 + lw $v1, 16($fp) + lw $v0, 12($v1) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_88 + lw $v1, 16($fp) + lw $v0, 8($v1) + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_89 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable position_86 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_88 + lw $v0, -4($fp) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_90 + #load the variable t_87 + lw $v0, -0($fp) + move $t1, $v0 + lw $t1, 4($t1) + #load the variable t_89 + lw $v0, -8($fp) + move $t2, $v0 + lw $t2, 4($t2) + slt $t3, $t1, $t2 + la $t4, Bool + li $a0, 8 + li $v0, 9 + syscall + sw $t4, 0($v0) + sw $t3, 4($v0) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_91 + #load the variable t_90 + lw $v0, -12($fp) + sw $v0, -16($fp) + + lw $t1, -16($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_8 + # assign (add here the expr.to_string) to t_93 + lw $v1, 16($fp) + lw $v0, 8($v1) + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_94 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable position_86 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_93 + lw $v0, -24($fp) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -28($fp) + + # assign (add here the expr.to_string) to t_95 + #load the variable t_94 + lw $v0, -28($fp) + sw $v0, -32($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -32($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_96 + # calling the method cell of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 60($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_92 + #load the variable t_96 + lw $v0, -36($fp) + sw $v0, -20($fp) + + j ifend_8 + then_8: + # assign (add here the expr.to_string) to t_97 + #load the string str_5 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_5 + sw $v1, 4($v0) + sw $v0, -40($fp) + + # assign (add here the expr.to_string) to t_92 + #load the variable t_97 + lw $v0, -40($fp) + sw $v0, -20($fp) + + ifend_8: + # assign (add here the expr.to_string) to t_98 + #load the variable t_92 + lw $v0, -20($fp) + sw $v0, -44($fp) + + # return the value of the function in the register $v0 + #load the variable t_98 + lw $v0, -44($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 48 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +east_CellularAutomaton: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 56 + + # assign (add here the expr.to_string) to t_100 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable position_99 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_101 + lw $v1, 16($fp) + lw $v0, 8($v1) + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_102 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_100 + lw $v0, -0($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_101 + lw $v0, -4($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + div $t0, $t1 + mflo $t0 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_103 + lw $v1, 16($fp) + lw $v0, 8($v1) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_104 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_102 + lw $v0, -8($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_103 + lw $v0, -12($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + mult $t0, $t1 + mflo $t0 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -16($fp) + + # assign (add here the expr.to_string) to t_105 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable position_99 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_106 + #load the variable t_104 + lw $v0, -16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_105 + lw $v0, -20($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_107 + #load the variable t_106 + lw $v0, -24($fp) + sw $v0, -28($fp) + + lw $t1, -28($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_9 + # assign (add here the expr.to_string) to t_109 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable position_99 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_110 + #load the variable t_109 + lw $v0, -36($fp) + sw $v0, -40($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -40($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_111 + # calling the method cell of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 60($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -44($fp) + + # assign (add here the expr.to_string) to t_108 + #load the variable t_111 + lw $v0, -44($fp) + sw $v0, -32($fp) + + j ifend_9 + then_9: + # assign (add here the expr.to_string) to t_112 + #load the string str_6 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_6 + sw $v1, 4($v0) + sw $v0, -48($fp) + + # assign (add here the expr.to_string) to t_108 + #load the variable t_112 + lw $v0, -48($fp) + sw $v0, -32($fp) + + ifend_9: + # assign (add here the expr.to_string) to t_113 + #load the variable t_108 + lw $v0, -32($fp) + sw $v0, -52($fp) + + # return the value of the function in the register $v0 + #load the variable t_113 + lw $v0, -52($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 56 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +west_CellularAutomaton: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 64 + + # assign (add here the expr.to_string) to t_115 + #load the variable position_114 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_116 + #load the variable t_115 + lw $v0, -0($fp) + sw $v0, -4($fp) + + lw $t1, -4($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_10 + # assign (add here the expr.to_string) to t_118 + lw $v1, 16($fp) + lw $v0, 8($v1) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_119 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable position_114 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_118 + lw $v0, -12($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + div $t0, $t1 + mflo $t0 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -16($fp) + + # assign (add here the expr.to_string) to t_120 + lw $v1, 16($fp) + lw $v0, 8($v1) + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_121 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_119 + lw $v0, -16($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_120 + lw $v0, -20($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + mult $t0, $t1 + mflo $t0 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_122 + #load the variable t_121 + lw $v0, -24($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable position_114 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -28($fp) + + # assign (add here the expr.to_string) to t_123 + #load the variable t_122 + lw $v0, -28($fp) + sw $v0, -32($fp) + + lw $t1, -32($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_11 + # assign (add here the expr.to_string) to t_125 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable position_114 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -40($fp) + + # assign (add here the expr.to_string) to t_126 + #load the variable t_125 + lw $v0, -40($fp) + sw $v0, -44($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -44($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_127 + # calling the method cell of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 60($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -48($fp) + + # assign (add here the expr.to_string) to t_124 + #load the variable t_127 + lw $v0, -48($fp) + sw $v0, -36($fp) + + j ifend_11 + then_11: + # assign (add here the expr.to_string) to t_128 + #load the string str_7 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_7 + sw $v1, 4($v0) + sw $v0, -52($fp) + + # assign (add here the expr.to_string) to t_124 + #load the variable t_128 + lw $v0, -52($fp) + sw $v0, -36($fp) + + ifend_11: + # assign (add here the expr.to_string) to t_117 + #load the variable t_124 + lw $v0, -36($fp) + sw $v0, -8($fp) + + j ifend_10 + then_10: + # assign (add here the expr.to_string) to t_129 + #load the string str_8 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_8 + sw $v1, 4($v0) + sw $v0, -56($fp) + + # assign (add here the expr.to_string) to t_117 + #load the variable t_129 + lw $v0, -56($fp) + sw $v0, -8($fp) + + ifend_10: + # assign (add here the expr.to_string) to t_130 + #load the variable t_117 + lw $v0, -8($fp) + sw $v0, -60($fp) + + # return the value of the function in the register $v0 + #load the variable t_130 + lw $v0, -60($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 64 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +northwest_CellularAutomaton: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 72 + + # assign (add here the expr.to_string) to t_132 + lw $v1, 16($fp) + lw $v0, 8($v1) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_133 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable position_131 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_132 + lw $v0, -0($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_134 + #load the variable t_133 + lw $v0, -4($fp) + move $t1, $v0 + lw $t1, 4($t1) + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + move $t2, $v0 + lw $t2, 4($t2) + slt $t3, $t1, $t2 + la $t4, Bool + li $a0, 8 + li $v0, 9 + syscall + sw $t4, 0($v0) + sw $t3, 4($v0) + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_135 + #load the variable t_134 + lw $v0, -8($fp) + sw $v0, -12($fp) + + lw $t1, -12($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_12 + # assign (add here the expr.to_string) to t_137 + lw $v1, 16($fp) + lw $v0, 8($v1) + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_138 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable position_131 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_137 + lw $v0, -20($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + div $t0, $t1 + mflo $t0 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_139 + lw $v1, 16($fp) + lw $v0, 8($v1) + sw $v0, -28($fp) + + # assign (add here the expr.to_string) to t_140 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_138 + lw $v0, -24($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_139 + lw $v0, -28($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + mult $t0, $t1 + mflo $t0 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -32($fp) + + # assign (add here the expr.to_string) to t_141 + #load the variable t_140 + lw $v0, -32($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable position_131 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_142 + #load the variable t_141 + lw $v0, -36($fp) + sw $v0, -40($fp) + + lw $t1, -40($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_13 + # assign (add here the expr.to_string) to t_144 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable position_131 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -48($fp) + + # assign (add here the expr.to_string) to t_145 + #load the variable t_144 + lw $v0, -48($fp) + sw $v0, -52($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -52($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_146 + # calling the method north of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 64($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -56($fp) + + # assign (add here the expr.to_string) to t_143 + #load the variable t_146 + lw $v0, -56($fp) + sw $v0, -44($fp) + + j ifend_13 + then_13: + # assign (add here the expr.to_string) to t_147 + #load the string str_9 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_9 + sw $v1, 4($v0) + sw $v0, -60($fp) + + # assign (add here the expr.to_string) to t_143 + #load the variable t_147 + lw $v0, -60($fp) + sw $v0, -44($fp) + + ifend_13: + # assign (add here the expr.to_string) to t_136 + #load the variable t_143 + lw $v0, -44($fp) + sw $v0, -16($fp) + + j ifend_12 + then_12: + # assign (add here the expr.to_string) to t_148 + #load the string str_10 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_10 + sw $v1, 4($v0) + sw $v0, -64($fp) + + # assign (add here the expr.to_string) to t_136 + #load the variable t_148 + lw $v0, -64($fp) + sw $v0, -16($fp) + + ifend_12: + # assign (add here the expr.to_string) to t_149 + #load the variable t_136 + lw $v0, -16($fp) + sw $v0, -68($fp) + + # return the value of the function in the register $v0 + #load the variable t_149 + lw $v0, -68($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 72 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +northeast_CellularAutomaton: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 80 + + # assign (add here the expr.to_string) to t_151 + lw $v1, 16($fp) + lw $v0, 8($v1) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_152 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable position_150 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_151 + lw $v0, -0($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_153 + #load the variable t_152 + lw $v0, -4($fp) + move $t1, $v0 + lw $t1, 4($t1) + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + move $t2, $v0 + lw $t2, 4($t2) + slt $t3, $t1, $t2 + la $t4, Bool + li $a0, 8 + li $v0, 9 + syscall + sw $t4, 0($v0) + sw $t3, 4($v0) + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_154 + #load the variable t_153 + lw $v0, -8($fp) + sw $v0, -12($fp) + + lw $t1, -12($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_14 + # assign (add here the expr.to_string) to t_156 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable position_150 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_157 + lw $v1, 16($fp) + lw $v0, 8($v1) + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_158 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_156 + lw $v0, -20($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_157 + lw $v0, -24($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + div $t0, $t1 + mflo $t0 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -28($fp) + + # assign (add here the expr.to_string) to t_159 + lw $v1, 16($fp) + lw $v0, 8($v1) + sw $v0, -32($fp) + + # assign (add here the expr.to_string) to t_160 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_158 + lw $v0, -28($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_159 + lw $v0, -32($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + mult $t0, $t1 + mflo $t0 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_161 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable position_150 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -40($fp) + + # assign (add here the expr.to_string) to t_162 + #load the variable t_160 + lw $v0, -36($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_161 + lw $v0, -40($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -44($fp) + + # assign (add here the expr.to_string) to t_163 + #load the variable t_162 + lw $v0, -44($fp) + sw $v0, -48($fp) + + lw $t1, -48($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_15 + # assign (add here the expr.to_string) to t_165 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable position_150 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -56($fp) + + # assign (add here the expr.to_string) to t_166 + #load the variable t_165 + lw $v0, -56($fp) + sw $v0, -60($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -60($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_167 + # calling the method north of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 64($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -64($fp) + + # assign (add here the expr.to_string) to t_164 + #load the variable t_167 + lw $v0, -64($fp) + sw $v0, -52($fp) + + j ifend_15 + then_15: + # assign (add here the expr.to_string) to t_168 + #load the string str_11 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_11 + sw $v1, 4($v0) + sw $v0, -68($fp) + + # assign (add here the expr.to_string) to t_164 + #load the variable t_168 + lw $v0, -68($fp) + sw $v0, -52($fp) + + ifend_15: + # assign (add here the expr.to_string) to t_155 + #load the variable t_164 + lw $v0, -52($fp) + sw $v0, -16($fp) + + j ifend_14 + then_14: + # assign (add here the expr.to_string) to t_169 + #load the string str_12 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_12 + sw $v1, 4($v0) + sw $v0, -72($fp) + + # assign (add here the expr.to_string) to t_155 + #load the variable t_169 + lw $v0, -72($fp) + sw $v0, -16($fp) + + ifend_14: + # assign (add here the expr.to_string) to t_170 + #load the variable t_155 + lw $v0, -16($fp) + sw $v0, -76($fp) + + # return the value of the function in the register $v0 + #load the variable t_170 + lw $v0, -76($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 80 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +southeast_CellularAutomaton: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 84 + + # assign (add here the expr.to_string) to t_172 + lw $v1, 16($fp) + lw $v0, 12($v1) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_173 + lw $v1, 16($fp) + lw $v0, 8($v1) + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_174 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable position_171 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_173 + lw $v0, -4($fp) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_175 + #load the variable t_172 + lw $v0, -0($fp) + move $t1, $v0 + lw $t1, 4($t1) + #load the variable t_174 + lw $v0, -8($fp) + move $t2, $v0 + lw $t2, 4($t2) + slt $t3, $t1, $t2 + la $t4, Bool + li $a0, 8 + li $v0, 9 + syscall + sw $t4, 0($v0) + sw $t3, 4($v0) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_176 + #load the variable t_175 + lw $v0, -12($fp) + sw $v0, -16($fp) + + lw $t1, -16($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_16 + # assign (add here the expr.to_string) to t_178 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable position_171 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_179 + lw $v1, 16($fp) + lw $v0, 8($v1) + sw $v0, -28($fp) + + # assign (add here the expr.to_string) to t_180 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_178 + lw $v0, -24($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_179 + lw $v0, -28($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + div $t0, $t1 + mflo $t0 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -32($fp) + + # assign (add here the expr.to_string) to t_181 + lw $v1, 16($fp) + lw $v0, 8($v1) + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_182 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_180 + lw $v0, -32($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_181 + lw $v0, -36($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + mult $t0, $t1 + mflo $t0 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -40($fp) + + # assign (add here the expr.to_string) to t_183 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable position_171 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -44($fp) + + # assign (add here the expr.to_string) to t_184 + #load the variable t_182 + lw $v0, -40($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_183 + lw $v0, -44($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -48($fp) + + # assign (add here the expr.to_string) to t_185 + #load the variable t_184 + lw $v0, -48($fp) + sw $v0, -52($fp) + + lw $t1, -52($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_17 + # assign (add here the expr.to_string) to t_187 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable position_171 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -60($fp) + + # assign (add here the expr.to_string) to t_188 + #load the variable t_187 + lw $v0, -60($fp) + sw $v0, -64($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -64($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_189 + # calling the method south of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 68($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -68($fp) + + # assign (add here the expr.to_string) to t_186 + #load the variable t_189 + lw $v0, -68($fp) + sw $v0, -56($fp) + + j ifend_17 + then_17: + # assign (add here the expr.to_string) to t_190 + #load the string str_13 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_13 + sw $v1, 4($v0) + sw $v0, -72($fp) + + # assign (add here the expr.to_string) to t_186 + #load the variable t_190 + lw $v0, -72($fp) + sw $v0, -56($fp) + + ifend_17: + # assign (add here the expr.to_string) to t_177 + #load the variable t_186 + lw $v0, -56($fp) + sw $v0, -20($fp) + + j ifend_16 + then_16: + # assign (add here the expr.to_string) to t_191 + #load the string str_14 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_14 + sw $v1, 4($v0) + sw $v0, -76($fp) + + # assign (add here the expr.to_string) to t_177 + #load the variable t_191 + lw $v0, -76($fp) + sw $v0, -20($fp) + + ifend_16: + # assign (add here the expr.to_string) to t_192 + #load the variable t_177 + lw $v0, -20($fp) + sw $v0, -80($fp) + + # return the value of the function in the register $v0 + #load the variable t_192 + lw $v0, -80($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 84 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +southwest_CellularAutomaton: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 76 + + # assign (add here the expr.to_string) to t_194 + lw $v1, 16($fp) + lw $v0, 12($v1) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_195 + lw $v1, 16($fp) + lw $v0, 8($v1) + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_196 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable position_193 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_195 + lw $v0, -4($fp) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_197 + #load the variable t_194 + lw $v0, -0($fp) + move $t1, $v0 + lw $t1, 4($t1) + #load the variable t_196 + lw $v0, -8($fp) + move $t2, $v0 + lw $t2, 4($t2) + slt $t3, $t1, $t2 + la $t4, Bool + li $a0, 8 + li $v0, 9 + syscall + sw $t4, 0($v0) + sw $t3, 4($v0) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_198 + #load the variable t_197 + lw $v0, -12($fp) + sw $v0, -16($fp) + + lw $t1, -16($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_18 + # assign (add here the expr.to_string) to t_200 + lw $v1, 16($fp) + lw $v0, 8($v1) + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_201 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable position_193 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_200 + lw $v0, -24($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + div $t0, $t1 + mflo $t0 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -28($fp) + + # assign (add here the expr.to_string) to t_202 + lw $v1, 16($fp) + lw $v0, 8($v1) + sw $v0, -32($fp) + + # assign (add here the expr.to_string) to t_203 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_201 + lw $v0, -28($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_202 + lw $v0, -32($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + mult $t0, $t1 + mflo $t0 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_204 + #load the variable t_203 + lw $v0, -36($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable position_193 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -40($fp) + + # assign (add here the expr.to_string) to t_205 + #load the variable t_204 + lw $v0, -40($fp) + sw $v0, -44($fp) + + lw $t1, -44($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_19 + # assign (add here the expr.to_string) to t_207 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable position_193 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -52($fp) + + # assign (add here the expr.to_string) to t_208 + #load the variable t_207 + lw $v0, -52($fp) + sw $v0, -56($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -56($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_209 + # calling the method south of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 68($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -60($fp) + + # assign (add here the expr.to_string) to t_206 + #load the variable t_209 + lw $v0, -60($fp) + sw $v0, -48($fp) + + j ifend_19 + then_19: + # assign (add here the expr.to_string) to t_210 + #load the string str_15 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_15 + sw $v1, 4($v0) + sw $v0, -64($fp) + + # assign (add here the expr.to_string) to t_206 + #load the variable t_210 + lw $v0, -64($fp) + sw $v0, -48($fp) + + ifend_19: + # assign (add here the expr.to_string) to t_199 + #load the variable t_206 + lw $v0, -48($fp) + sw $v0, -20($fp) + + j ifend_18 + then_18: + # assign (add here the expr.to_string) to t_211 + #load the string str_16 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_16 + sw $v1, 4($v0) + sw $v0, -68($fp) + + # assign (add here the expr.to_string) to t_199 + #load the variable t_211 + lw $v0, -68($fp) + sw $v0, -20($fp) + + ifend_18: + # assign (add here the expr.to_string) to t_212 + #load the variable t_199 + lw $v0, -20($fp) + sw $v0, -72($fp) + + # return the value of the function in the register $v0 + #load the variable t_212 + lw $v0, -72($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 76 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +neighbors_CellularAutomaton: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 224 + + # assign (add here the expr.to_string) to t_214 + #load the variable position_213 + lw $v0, 12($fp) + sw $v0, -0($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_215 + # calling the method north of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 64($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_216 + #load the string str_17 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_17 + sw $v1, 4($v0) + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_217 + #load the variable t_215 + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_216 + lw $v0, -8($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_218 + #load the variable t_217 + lw $v0, -12($fp) + sw $v0, -16($fp) + + lw $t1, -16($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_20 + # assign (add here the expr.to_string) to t_219 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -20($fp) + + j ifend_20 + then_20: + # assign (add here the expr.to_string) to t_219 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -20($fp) + + ifend_20: + # assign (add here the expr.to_string) to t_220 + #load the variable position_213 + lw $v0, 12($fp) + sw $v0, -24($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -24($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_221 + # calling the method south of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 68($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -28($fp) + + # assign (add here the expr.to_string) to t_222 + #load the string str_18 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_18 + sw $v1, 4($v0) + sw $v0, -32($fp) + + # assign (add here the expr.to_string) to t_223 + #load the variable t_221 + lw $v0, -28($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_222 + lw $v0, -32($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_224 + #load the variable t_223 + lw $v0, -36($fp) + sw $v0, -40($fp) + + lw $t1, -40($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_21 + # assign (add here the expr.to_string) to t_225 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -44($fp) + + j ifend_21 + then_21: + # assign (add here the expr.to_string) to t_225 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -44($fp) + + ifend_21: + # assign (add here the expr.to_string) to t_226 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_219 + lw $v0, -20($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_225 + lw $v0, -44($fp) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -48($fp) + + # assign (add here the expr.to_string) to t_227 + #load the variable position_213 + lw $v0, 12($fp) + sw $v0, -52($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -52($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_228 + # calling the method east of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 72($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -56($fp) + + # assign (add here the expr.to_string) to t_229 + #load the string str_19 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_19 + sw $v1, 4($v0) + sw $v0, -60($fp) + + # assign (add here the expr.to_string) to t_230 + #load the variable t_228 + lw $v0, -56($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_229 + lw $v0, -60($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -64($fp) + + # assign (add here the expr.to_string) to t_231 + #load the variable t_230 + lw $v0, -64($fp) + sw $v0, -68($fp) + + lw $t1, -68($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_22 + # assign (add here the expr.to_string) to t_232 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -72($fp) + + j ifend_22 + then_22: + # assign (add here the expr.to_string) to t_232 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -72($fp) + + ifend_22: + # assign (add here the expr.to_string) to t_233 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_226 + lw $v0, -48($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_232 + lw $v0, -72($fp) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -76($fp) + + # assign (add here the expr.to_string) to t_234 + #load the variable position_213 + lw $v0, 12($fp) + sw $v0, -80($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -80($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_235 + # calling the method west of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 76($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -84($fp) + + # assign (add here the expr.to_string) to t_236 + #load the string str_20 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_20 + sw $v1, 4($v0) + sw $v0, -88($fp) + + # assign (add here the expr.to_string) to t_237 + #load the variable t_235 + lw $v0, -84($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_236 + lw $v0, -88($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -92($fp) + + # assign (add here the expr.to_string) to t_238 + #load the variable t_237 + lw $v0, -92($fp) + sw $v0, -96($fp) + + lw $t1, -96($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_23 + # assign (add here the expr.to_string) to t_239 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -100($fp) + + j ifend_23 + then_23: + # assign (add here the expr.to_string) to t_239 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -100($fp) + + ifend_23: + # assign (add here the expr.to_string) to t_240 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_233 + lw $v0, -76($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_239 + lw $v0, -100($fp) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -104($fp) + + # assign (add here the expr.to_string) to t_241 + #load the variable position_213 + lw $v0, 12($fp) + sw $v0, -108($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -108($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_242 + # calling the method northeast of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 84($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -112($fp) + + # assign (add here the expr.to_string) to t_243 + #load the string str_21 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_21 + sw $v1, 4($v0) + sw $v0, -116($fp) + + # assign (add here the expr.to_string) to t_244 + #load the variable t_242 + lw $v0, -112($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_243 + lw $v0, -116($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -120($fp) + + # assign (add here the expr.to_string) to t_245 + #load the variable t_244 + lw $v0, -120($fp) + sw $v0, -124($fp) + + lw $t1, -124($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_24 + # assign (add here the expr.to_string) to t_246 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -128($fp) + + j ifend_24 + then_24: + # assign (add here the expr.to_string) to t_246 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -128($fp) + + ifend_24: + # assign (add here the expr.to_string) to t_247 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_240 + lw $v0, -104($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_246 + lw $v0, -128($fp) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -132($fp) + + # assign (add here the expr.to_string) to t_248 + #load the variable position_213 + lw $v0, 12($fp) + sw $v0, -136($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -136($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_249 + # calling the method northwest of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 80($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -140($fp) + + # assign (add here the expr.to_string) to t_250 + #load the string str_22 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_22 + sw $v1, 4($v0) + sw $v0, -144($fp) + + # assign (add here the expr.to_string) to t_251 + #load the variable t_249 + lw $v0, -140($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_250 + lw $v0, -144($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -148($fp) + + # assign (add here the expr.to_string) to t_252 + #load the variable t_251 + lw $v0, -148($fp) + sw $v0, -152($fp) + + lw $t1, -152($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_25 + # assign (add here the expr.to_string) to t_253 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -156($fp) + + j ifend_25 + then_25: + # assign (add here the expr.to_string) to t_253 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -156($fp) + + ifend_25: + # assign (add here the expr.to_string) to t_254 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_247 + lw $v0, -132($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_253 + lw $v0, -156($fp) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -160($fp) + + # assign (add here the expr.to_string) to t_255 + #load the variable position_213 + lw $v0, 12($fp) + sw $v0, -164($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -164($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_256 + # calling the method southeast of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 88($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -168($fp) + + # assign (add here the expr.to_string) to t_257 + #load the string str_23 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_23 + sw $v1, 4($v0) + sw $v0, -172($fp) + + # assign (add here the expr.to_string) to t_258 + #load the variable t_256 + lw $v0, -168($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_257 + lw $v0, -172($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -176($fp) + + # assign (add here the expr.to_string) to t_259 + #load the variable t_258 + lw $v0, -176($fp) + sw $v0, -180($fp) + + lw $t1, -180($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_26 + # assign (add here the expr.to_string) to t_260 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -184($fp) + + j ifend_26 + then_26: + # assign (add here the expr.to_string) to t_260 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -184($fp) + + ifend_26: + # assign (add here the expr.to_string) to t_261 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_254 + lw $v0, -160($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_260 + lw $v0, -184($fp) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -188($fp) + + # assign (add here the expr.to_string) to t_262 + #load the variable position_213 + lw $v0, 12($fp) + sw $v0, -192($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -192($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_263 + # calling the method southwest of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 92($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -196($fp) + + # assign (add here the expr.to_string) to t_264 + #load the string str_24 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_24 + sw $v1, 4($v0) + sw $v0, -200($fp) + + # assign (add here the expr.to_string) to t_265 + #load the variable t_263 + lw $v0, -196($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_264 + lw $v0, -200($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -204($fp) + + # assign (add here the expr.to_string) to t_266 + #load the variable t_265 + lw $v0, -204($fp) + sw $v0, -208($fp) + + lw $t1, -208($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_27 + # assign (add here the expr.to_string) to t_267 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -212($fp) + + j ifend_27 + then_27: + # assign (add here the expr.to_string) to t_267 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -212($fp) + + ifend_27: + # assign (add here the expr.to_string) to t_268 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_261 + lw $v0, -188($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_267 + lw $v0, -212($fp) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -216($fp) + + # assign (add here the expr.to_string) to t_269 + #load the variable t_268 + lw $v0, -216($fp) + sw $v0, -220($fp) + + # return the value of the function in the register $v0 + #load the variable t_269 + lw $v0, -220($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 224 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +cell_at_next_evolution_CellularAutomaton: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 84 + + # assign (add here the expr.to_string) to t_271 + #load the variable position_270 + lw $v0, 12($fp) + sw $v0, -0($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_272 + # calling the method neighbors of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 96($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_273 + #load the variable t_272 + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 3 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 3 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_274 + #load the variable t_273 + lw $v0, -8($fp) + sw $v0, -12($fp) + + lw $t1, -12($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_28 + # assign (add here the expr.to_string) to t_276 + #load the variable position_270 + lw $v0, 12($fp) + sw $v0, -20($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -20($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_277 + # calling the method neighbors of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 96($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_278 + #load the variable t_277 + lw $v0, -24($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 2 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 2 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -28($fp) + + # assign (add here the expr.to_string) to t_279 + #load the variable t_278 + lw $v0, -28($fp) + sw $v0, -32($fp) + + lw $t1, -32($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_29 + # assign (add here the expr.to_string) to t_281 + #load the string str_25 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_25 + sw $v1, 4($v0) + sw $v0, -40($fp) + + # assign (add here the expr.to_string) to t_280 + #load the variable t_281 + lw $v0, -40($fp) + sw $v0, -36($fp) + + j ifend_29 + then_29: + # assign (add here the expr.to_string) to t_282 + #load the variable position_270 + lw $v0, 12($fp) + sw $v0, -44($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -44($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_283 + # calling the method cell of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 60($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -48($fp) + + # assign (add here the expr.to_string) to t_284 + #load the string str_26 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_26 + sw $v1, 4($v0) + sw $v0, -52($fp) + + # assign (add here the expr.to_string) to t_285 + #load the variable t_283 + lw $v0, -48($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_284 + lw $v0, -52($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -56($fp) + + # assign (add here the expr.to_string) to t_286 + #load the variable t_285 + lw $v0, -56($fp) + sw $v0, -60($fp) + + lw $t1, -60($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_30 + # assign (add here the expr.to_string) to t_288 + #load the string str_27 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_27 + sw $v1, 4($v0) + sw $v0, -68($fp) + + # assign (add here the expr.to_string) to t_287 + #load the variable t_288 + lw $v0, -68($fp) + sw $v0, -64($fp) + + j ifend_30 + then_30: + # assign (add here the expr.to_string) to t_289 + #load the string str_28 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_28 + sw $v1, 4($v0) + sw $v0, -72($fp) + + # assign (add here the expr.to_string) to t_287 + #load the variable t_289 + lw $v0, -72($fp) + sw $v0, -64($fp) + + ifend_30: + # assign (add here the expr.to_string) to t_280 + #load the variable t_287 + lw $v0, -64($fp) + sw $v0, -36($fp) + + ifend_29: + # assign (add here the expr.to_string) to t_275 + #load the variable t_280 + lw $v0, -36($fp) + sw $v0, -16($fp) + + j ifend_28 + then_28: + # assign (add here the expr.to_string) to t_290 + #load the string str_29 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_29 + sw $v1, 4($v0) + sw $v0, -76($fp) + + # assign (add here the expr.to_string) to t_275 + #load the variable t_290 + lw $v0, -76($fp) + sw $v0, -16($fp) + + ifend_28: + # assign (add here the expr.to_string) to t_291 + #load the variable t_275 + lw $v0, -16($fp) + sw $v0, -80($fp) + + # return the value of the function in the register $v0 + #load the variable t_291 + lw $v0, -80($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 84 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text + .globl evolve +evolve_CellularAutomaton: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 72 + + # assign (add here the expr.to_string) to position_292 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -0($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_294 + # calling the method num_cells of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 56($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to num_293 + #load the variable t_294 + lw $v0, -8($fp) + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to temp_295 + #load the string str_empty + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_empty + sw $v1, 4($v0) + sw $v0, -12($fp) + + while_1: + # assign (add here the expr.to_string) to t_296 + #load the variable position_292 + lw $v0, -0($fp) + move $t1, $v0 + lw $t1, 4($t1) + #load the variable num_293 + lw $v0, -4($fp) + move $t2, $v0 + lw $t2, 4($t2) + slt $t3, $t1, $t2 + la $t4, Bool + li $a0, 8 + li $v0, 9 + syscall + sw $t4, 0($v0) + sw $t3, 4($v0) + sw $v0, -16($fp) + + # assign (add here the expr.to_string) to t_297 + #load the variable t_296 + lw $v0, -16($fp) + sw $v0, -20($fp) + + lw $t1, -20($fp) + lw $t0, 4($t1) + bne $t0, $zero, body_1 + j pool_1 + body_1: + # assign (add here the expr.to_string) to t_299 + #load the variable temp_295 + lw $v0, -12($fp) + sw $v0, -28($fp) + + # assign (add here the expr.to_string) to t_300 + #load the variable position_292 + lw $v0, -0($fp) + sw $v0, -32($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -32($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_301 + # calling the method cell_at_next_evolution of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 100($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_302 + #load the variable t_301 + lw $v0, -36($fp) + sw $v0, -40($fp) + + lw $v0, -28($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -40($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_303 + # calling the method concat of type String + #load the variable t_299 + lw $v0, -28($fp) + lw $t0, 0($v0) + lw $v1, 28($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -44($fp) + + # assign (add here the expr.to_string) to temp_295 + #load the variable t_303 + lw $v0, -44($fp) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_304 + #load the variable position_292 + lw $v0, -0($fp) + sw $v0, -48($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -48($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_305 + # calling the method out_int of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 28($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -52($fp) + + # assign (add here the expr.to_string) to t_306 + #load the variable num_293 + lw $v0, -4($fp) + sw $v0, -56($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -56($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_307 + # calling the method out_int of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 28($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -60($fp) + + # assign (add here the expr.to_string) to t_308 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable position_292 + lw $v0, -0($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -64($fp) + + # assign (add here the expr.to_string) to position_292 + #load the variable t_308 + lw $v0, -64($fp) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_298 + #load the variable position_292 + lw $v0, -0($fp) + sw $v0, -24($fp) + + j while_1 + pool_1: + # Setting value of the attribute population_map in the instance self_CellularAutomaton to temp_295 + #load the variable temp_295 + lw $v0, -12($fp) + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 16($v1) + + # assign (add here the expr.to_string) to t_309 + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + sw $v0, -68($fp) + + # return the value of the function in the register $v0 + #load the variable t_309 + lw $v0, -68($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 72 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +option_CellularAutomaton: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 640 + + # assign (add here the expr.to_string) to num_310 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_311 + #load the string str_30 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_30 + sw $v1, 4($v0) + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_312 + #load the variable t_311 + lw $v0, -4($fp) + sw $v0, -8($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -8($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_313 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_314 + #load the string str_31 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_31 + sw $v1, 4($v0) + sw $v0, -16($fp) + + # assign (add here the expr.to_string) to t_315 + #load the variable t_314 + lw $v0, -16($fp) + sw $v0, -20($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -20($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_316 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_317 + #load the string str_32 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_32 + sw $v1, 4($v0) + sw $v0, -28($fp) + + # assign (add here the expr.to_string) to t_318 + #load the variable t_317 + lw $v0, -28($fp) + sw $v0, -32($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -32($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_319 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_320 + #load the string str_33 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_33 + sw $v1, 4($v0) + sw $v0, -40($fp) + + # assign (add here the expr.to_string) to t_321 + #load the variable t_320 + lw $v0, -40($fp) + sw $v0, -44($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -44($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_322 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -48($fp) + + # assign (add here the expr.to_string) to t_323 + #load the string str_34 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_34 + sw $v1, 4($v0) + sw $v0, -52($fp) + + # assign (add here the expr.to_string) to t_324 + #load the variable t_323 + lw $v0, -52($fp) + sw $v0, -56($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -56($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_325 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -60($fp) + + # assign (add here the expr.to_string) to t_326 + #load the string str_35 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_35 + sw $v1, 4($v0) + sw $v0, -64($fp) + + # assign (add here the expr.to_string) to t_327 + #load the variable t_326 + lw $v0, -64($fp) + sw $v0, -68($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -68($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_328 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -72($fp) + + # assign (add here the expr.to_string) to t_329 + #load the string str_36 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_36 + sw $v1, 4($v0) + sw $v0, -76($fp) + + # assign (add here the expr.to_string) to t_330 + #load the variable t_329 + lw $v0, -76($fp) + sw $v0, -80($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -80($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_331 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -84($fp) + + # assign (add here the expr.to_string) to t_332 + #load the string str_37 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_37 + sw $v1, 4($v0) + sw $v0, -88($fp) + + # assign (add here the expr.to_string) to t_333 + #load the variable t_332 + lw $v0, -88($fp) + sw $v0, -92($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -92($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_334 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -96($fp) + + # assign (add here the expr.to_string) to t_335 + #load the string str_38 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_38 + sw $v1, 4($v0) + sw $v0, -100($fp) + + # assign (add here the expr.to_string) to t_336 + #load the variable t_335 + lw $v0, -100($fp) + sw $v0, -104($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -104($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_337 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -108($fp) + + # assign (add here the expr.to_string) to t_338 + #load the string str_39 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_39 + sw $v1, 4($v0) + sw $v0, -112($fp) + + # assign (add here the expr.to_string) to t_339 + #load the variable t_338 + lw $v0, -112($fp) + sw $v0, -116($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -116($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_340 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -120($fp) + + # assign (add here the expr.to_string) to t_341 + #load the string str_40 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_40 + sw $v1, 4($v0) + sw $v0, -124($fp) + + # assign (add here the expr.to_string) to t_342 + #load the variable t_341 + lw $v0, -124($fp) + sw $v0, -128($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -128($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_343 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -132($fp) + + # assign (add here the expr.to_string) to t_344 + #load the string str_41 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_41 + sw $v1, 4($v0) + sw $v0, -136($fp) + + # assign (add here the expr.to_string) to t_345 + #load the variable t_344 + lw $v0, -136($fp) + sw $v0, -140($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -140($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_346 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -144($fp) + + # assign (add here the expr.to_string) to t_347 + #load the string str_42 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_42 + sw $v1, 4($v0) + sw $v0, -148($fp) + + # assign (add here the expr.to_string) to t_348 + #load the variable t_347 + lw $v0, -148($fp) + sw $v0, -152($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -152($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_349 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -156($fp) + + # assign (add here the expr.to_string) to t_350 + #load the string str_43 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_43 + sw $v1, 4($v0) + sw $v0, -160($fp) + + # assign (add here the expr.to_string) to t_351 + #load the variable t_350 + lw $v0, -160($fp) + sw $v0, -164($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -164($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_352 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -168($fp) + + # assign (add here the expr.to_string) to t_353 + #load the string str_44 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_44 + sw $v1, 4($v0) + sw $v0, -172($fp) + + # assign (add here the expr.to_string) to t_354 + #load the variable t_353 + lw $v0, -172($fp) + sw $v0, -176($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -176($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_355 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -180($fp) + + # assign (add here the expr.to_string) to t_356 + #load the string str_45 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_45 + sw $v1, 4($v0) + sw $v0, -184($fp) + + # assign (add here the expr.to_string) to t_357 + #load the variable t_356 + lw $v0, -184($fp) + sw $v0, -188($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -188($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_358 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -192($fp) + + # assign (add here the expr.to_string) to t_359 + #load the string str_46 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_46 + sw $v1, 4($v0) + sw $v0, -196($fp) + + # assign (add here the expr.to_string) to t_360 + #load the variable t_359 + lw $v0, -196($fp) + sw $v0, -200($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -200($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_361 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -204($fp) + + # assign (add here the expr.to_string) to t_362 + #load the string str_47 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_47 + sw $v1, 4($v0) + sw $v0, -208($fp) + + # assign (add here the expr.to_string) to t_363 + #load the variable t_362 + lw $v0, -208($fp) + sw $v0, -212($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -212($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_364 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -216($fp) + + # assign (add here the expr.to_string) to t_365 + #load the string str_48 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_48 + sw $v1, 4($v0) + sw $v0, -220($fp) + + # assign (add here the expr.to_string) to t_366 + #load the variable t_365 + lw $v0, -220($fp) + sw $v0, -224($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -224($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_367 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -228($fp) + + # assign (add here the expr.to_string) to t_368 + #load the string str_49 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_49 + sw $v1, 4($v0) + sw $v0, -232($fp) + + # assign (add here the expr.to_string) to t_369 + #load the variable t_368 + lw $v0, -232($fp) + sw $v0, -236($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -236($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_370 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -240($fp) + + # assign (add here the expr.to_string) to t_371 + #load the string str_50 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_50 + sw $v1, 4($v0) + sw $v0, -244($fp) + + # assign (add here the expr.to_string) to t_372 + #load the variable t_371 + lw $v0, -244($fp) + sw $v0, -248($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -248($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_373 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -252($fp) + + # assign (add here the expr.to_string) to t_374 + #load the string str_51 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_51 + sw $v1, 4($v0) + sw $v0, -256($fp) + + # assign (add here the expr.to_string) to t_375 + #load the variable t_374 + lw $v0, -256($fp) + sw $v0, -260($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -260($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_376 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -264($fp) + + # assign (add here the expr.to_string) to t_377 + #load the string str_52 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_52 + sw $v1, 4($v0) + sw $v0, -268($fp) + + # assign (add here the expr.to_string) to t_378 + #load the variable t_377 + lw $v0, -268($fp) + sw $v0, -272($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -272($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_379 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -276($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_380 + # calling the method in_int of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 36($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -280($fp) + + # assign (add here the expr.to_string) to num_310 + #load the variable t_380 + lw $v0, -280($fp) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_381 + #load the string str_53 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_53 + sw $v1, 4($v0) + sw $v0, -284($fp) + + # assign (add here the expr.to_string) to t_382 + #load the variable t_381 + lw $v0, -284($fp) + sw $v0, -288($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -288($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_383 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -292($fp) + + # assign (add here the expr.to_string) to t_384 + #load the variable num_310 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -296($fp) + + # assign (add here the expr.to_string) to t_385 + #load the variable t_384 + lw $v0, -296($fp) + sw $v0, -300($fp) + + lw $t1, -300($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_31 + # assign (add here the expr.to_string) to t_387 + #load the variable num_310 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 2 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 2 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -308($fp) + + # assign (add here the expr.to_string) to t_388 + #load the variable t_387 + lw $v0, -308($fp) + sw $v0, -312($fp) + + lw $t1, -312($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_32 + # assign (add here the expr.to_string) to t_390 + #load the variable num_310 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 3 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 3 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -320($fp) + + # assign (add here the expr.to_string) to t_391 + #load the variable t_390 + lw $v0, -320($fp) + sw $v0, -324($fp) + + lw $t1, -324($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_33 + # assign (add here the expr.to_string) to t_393 + #load the variable num_310 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 4 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 4 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -332($fp) + + # assign (add here the expr.to_string) to t_394 + #load the variable t_393 + lw $v0, -332($fp) + sw $v0, -336($fp) + + lw $t1, -336($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_34 + # assign (add here the expr.to_string) to t_396 + #load the variable num_310 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 5 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 5 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -344($fp) + + # assign (add here the expr.to_string) to t_397 + #load the variable t_396 + lw $v0, -344($fp) + sw $v0, -348($fp) + + lw $t1, -348($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_35 + # assign (add here the expr.to_string) to t_399 + #load the variable num_310 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 6 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 6 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -356($fp) + + # assign (add here the expr.to_string) to t_400 + #load the variable t_399 + lw $v0, -356($fp) + sw $v0, -360($fp) + + lw $t1, -360($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_36 + # assign (add here the expr.to_string) to t_402 + #load the variable num_310 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 7 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 7 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -368($fp) + + # assign (add here the expr.to_string) to t_403 + #load the variable t_402 + lw $v0, -368($fp) + sw $v0, -372($fp) + + lw $t1, -372($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_37 + # assign (add here the expr.to_string) to t_405 + #load the variable num_310 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 8 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 8 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -380($fp) + + # assign (add here the expr.to_string) to t_406 + #load the variable t_405 + lw $v0, -380($fp) + sw $v0, -384($fp) + + lw $t1, -384($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_38 + # assign (add here the expr.to_string) to t_408 + #load the variable num_310 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 9 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 9 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -392($fp) + + # assign (add here the expr.to_string) to t_409 + #load the variable t_408 + lw $v0, -392($fp) + sw $v0, -396($fp) + + lw $t1, -396($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_39 + # assign (add here the expr.to_string) to t_411 + #load the variable num_310 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 10 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 10 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -404($fp) + + # assign (add here the expr.to_string) to t_412 + #load the variable t_411 + lw $v0, -404($fp) + sw $v0, -408($fp) + + lw $t1, -408($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_40 + # assign (add here the expr.to_string) to t_414 + #load the variable num_310 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 11 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 11 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -416($fp) + + # assign (add here the expr.to_string) to t_415 + #load the variable t_414 + lw $v0, -416($fp) + sw $v0, -420($fp) + + lw $t1, -420($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_41 + # assign (add here the expr.to_string) to t_417 + #load the variable num_310 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 12 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 12 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -428($fp) + + # assign (add here the expr.to_string) to t_418 + #load the variable t_417 + lw $v0, -428($fp) + sw $v0, -432($fp) + + lw $t1, -432($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_42 + # assign (add here the expr.to_string) to t_420 + #load the variable num_310 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 13 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 13 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -440($fp) + + # assign (add here the expr.to_string) to t_421 + #load the variable t_420 + lw $v0, -440($fp) + sw $v0, -444($fp) + + lw $t1, -444($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_43 + # assign (add here the expr.to_string) to t_423 + #load the variable num_310 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 14 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 14 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -452($fp) + + # assign (add here the expr.to_string) to t_424 + #load the variable t_423 + lw $v0, -452($fp) + sw $v0, -456($fp) + + lw $t1, -456($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_44 + # assign (add here the expr.to_string) to t_426 + #load the variable num_310 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 15 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 15 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -464($fp) + + # assign (add here the expr.to_string) to t_427 + #load the variable t_426 + lw $v0, -464($fp) + sw $v0, -468($fp) + + lw $t1, -468($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_45 + # assign (add here the expr.to_string) to t_429 + #load the variable num_310 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 16 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 16 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -476($fp) + + # assign (add here the expr.to_string) to t_430 + #load the variable t_429 + lw $v0, -476($fp) + sw $v0, -480($fp) + + lw $t1, -480($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_46 + # assign (add here the expr.to_string) to t_432 + #load the variable num_310 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 17 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 17 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -488($fp) + + # assign (add here the expr.to_string) to t_433 + #load the variable t_432 + lw $v0, -488($fp) + sw $v0, -492($fp) + + lw $t1, -492($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_47 + # assign (add here the expr.to_string) to t_435 + #load the variable num_310 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 18 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 18 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -500($fp) + + # assign (add here the expr.to_string) to t_436 + #load the variable t_435 + lw $v0, -500($fp) + sw $v0, -504($fp) + + lw $t1, -504($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_48 + # assign (add here the expr.to_string) to t_438 + #load the variable num_310 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 19 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 19 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -512($fp) + + # assign (add here the expr.to_string) to t_439 + #load the variable t_438 + lw $v0, -512($fp) + sw $v0, -516($fp) + + lw $t1, -516($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_49 + # assign (add here the expr.to_string) to t_441 + #load the variable num_310 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 20 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 20 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -524($fp) + + # assign (add here the expr.to_string) to t_442 + #load the variable t_441 + lw $v0, -524($fp) + sw $v0, -528($fp) + + lw $t1, -528($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_50 + # assign (add here the expr.to_string) to t_444 + #load the variable num_310 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 21 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 21 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -536($fp) + + # assign (add here the expr.to_string) to t_445 + #load the variable t_444 + lw $v0, -536($fp) + sw $v0, -540($fp) + + lw $t1, -540($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_51 + # assign (add here the expr.to_string) to t_447 + #load the string str_54 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_54 + sw $v1, 4($v0) + sw $v0, -548($fp) + + # assign (add here the expr.to_string) to t_446 + #load the variable t_447 + lw $v0, -548($fp) + sw $v0, -544($fp) + + j ifend_51 + then_51: + # assign (add here the expr.to_string) to t_448 + #load the string str_55 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_55 + sw $v1, 4($v0) + sw $v0, -552($fp) + + # assign (add here the expr.to_string) to t_446 + #load the variable t_448 + lw $v0, -552($fp) + sw $v0, -544($fp) + + ifend_51: + # assign (add here the expr.to_string) to t_443 + #load the variable t_446 + lw $v0, -544($fp) + sw $v0, -532($fp) + + j ifend_50 + then_50: + # assign (add here the expr.to_string) to t_449 + #load the string str_56 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_56 + sw $v1, 4($v0) + sw $v0, -556($fp) + + # assign (add here the expr.to_string) to t_443 + #load the variable t_449 + lw $v0, -556($fp) + sw $v0, -532($fp) + + ifend_50: + # assign (add here the expr.to_string) to t_440 + #load the variable t_443 + lw $v0, -532($fp) + sw $v0, -520($fp) + + j ifend_49 + then_49: + # assign (add here the expr.to_string) to t_450 + #load the string str_57 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_57 + sw $v1, 4($v0) + sw $v0, -560($fp) + + # assign (add here the expr.to_string) to t_440 + #load the variable t_450 + lw $v0, -560($fp) + sw $v0, -520($fp) + + ifend_49: + # assign (add here the expr.to_string) to t_437 + #load the variable t_440 + lw $v0, -520($fp) + sw $v0, -508($fp) + + j ifend_48 + then_48: + # assign (add here the expr.to_string) to t_451 + #load the string str_58 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_58 + sw $v1, 4($v0) + sw $v0, -564($fp) + + # assign (add here the expr.to_string) to t_437 + #load the variable t_451 + lw $v0, -564($fp) + sw $v0, -508($fp) + + ifend_48: + # assign (add here the expr.to_string) to t_434 + #load the variable t_437 + lw $v0, -508($fp) + sw $v0, -496($fp) + + j ifend_47 + then_47: + # assign (add here the expr.to_string) to t_452 + #load the string str_59 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_59 + sw $v1, 4($v0) + sw $v0, -568($fp) + + # assign (add here the expr.to_string) to t_434 + #load the variable t_452 + lw $v0, -568($fp) + sw $v0, -496($fp) + + ifend_47: + # assign (add here the expr.to_string) to t_431 + #load the variable t_434 + lw $v0, -496($fp) + sw $v0, -484($fp) + + j ifend_46 + then_46: + # assign (add here the expr.to_string) to t_453 + #load the string str_60 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_60 + sw $v1, 4($v0) + sw $v0, -572($fp) + + # assign (add here the expr.to_string) to t_431 + #load the variable t_453 + lw $v0, -572($fp) + sw $v0, -484($fp) + + ifend_46: + # assign (add here the expr.to_string) to t_428 + #load the variable t_431 + lw $v0, -484($fp) + sw $v0, -472($fp) + + j ifend_45 + then_45: + # assign (add here the expr.to_string) to t_454 + #load the string str_61 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_61 + sw $v1, 4($v0) + sw $v0, -576($fp) + + # assign (add here the expr.to_string) to t_428 + #load the variable t_454 + lw $v0, -576($fp) + sw $v0, -472($fp) + + ifend_45: + # assign (add here the expr.to_string) to t_425 + #load the variable t_428 + lw $v0, -472($fp) + sw $v0, -460($fp) + + j ifend_44 + then_44: + # assign (add here the expr.to_string) to t_455 + #load the string str_62 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_62 + sw $v1, 4($v0) + sw $v0, -580($fp) + + # assign (add here the expr.to_string) to t_425 + #load the variable t_455 + lw $v0, -580($fp) + sw $v0, -460($fp) + + ifend_44: + # assign (add here the expr.to_string) to t_422 + #load the variable t_425 + lw $v0, -460($fp) + sw $v0, -448($fp) + + j ifend_43 + then_43: + # assign (add here the expr.to_string) to t_456 + #load the string str_63 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_63 + sw $v1, 4($v0) + sw $v0, -584($fp) + + # assign (add here the expr.to_string) to t_422 + #load the variable t_456 + lw $v0, -584($fp) + sw $v0, -448($fp) + + ifend_43: + # assign (add here the expr.to_string) to t_419 + #load the variable t_422 + lw $v0, -448($fp) + sw $v0, -436($fp) + + j ifend_42 + then_42: + # assign (add here the expr.to_string) to t_457 + #load the string str_64 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_64 + sw $v1, 4($v0) + sw $v0, -588($fp) + + # assign (add here the expr.to_string) to t_419 + #load the variable t_457 + lw $v0, -588($fp) + sw $v0, -436($fp) + + ifend_42: + # assign (add here the expr.to_string) to t_416 + #load the variable t_419 + lw $v0, -436($fp) + sw $v0, -424($fp) + + j ifend_41 + then_41: + # assign (add here the expr.to_string) to t_458 + #load the string str_65 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_65 + sw $v1, 4($v0) + sw $v0, -592($fp) + + # assign (add here the expr.to_string) to t_416 + #load the variable t_458 + lw $v0, -592($fp) + sw $v0, -424($fp) + + ifend_41: + # assign (add here the expr.to_string) to t_413 + #load the variable t_416 + lw $v0, -424($fp) + sw $v0, -412($fp) + + j ifend_40 + then_40: + # assign (add here the expr.to_string) to t_459 + #load the string str_66 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_66 + sw $v1, 4($v0) + sw $v0, -596($fp) + + # assign (add here the expr.to_string) to t_413 + #load the variable t_459 + lw $v0, -596($fp) + sw $v0, -412($fp) + + ifend_40: + # assign (add here the expr.to_string) to t_410 + #load the variable t_413 + lw $v0, -412($fp) + sw $v0, -400($fp) + + j ifend_39 + then_39: + # assign (add here the expr.to_string) to t_460 + #load the string str_67 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_67 + sw $v1, 4($v0) + sw $v0, -600($fp) + + # assign (add here the expr.to_string) to t_410 + #load the variable t_460 + lw $v0, -600($fp) + sw $v0, -400($fp) + + ifend_39: + # assign (add here the expr.to_string) to t_407 + #load the variable t_410 + lw $v0, -400($fp) + sw $v0, -388($fp) + + j ifend_38 + then_38: + # assign (add here the expr.to_string) to t_461 + #load the string str_68 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_68 + sw $v1, 4($v0) + sw $v0, -604($fp) + + # assign (add here the expr.to_string) to t_407 + #load the variable t_461 + lw $v0, -604($fp) + sw $v0, -388($fp) + + ifend_38: + # assign (add here the expr.to_string) to t_404 + #load the variable t_407 + lw $v0, -388($fp) + sw $v0, -376($fp) + + j ifend_37 + then_37: + # assign (add here the expr.to_string) to t_462 + #load the string str_69 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_69 + sw $v1, 4($v0) + sw $v0, -608($fp) + + # assign (add here the expr.to_string) to t_404 + #load the variable t_462 + lw $v0, -608($fp) + sw $v0, -376($fp) + + ifend_37: + # assign (add here the expr.to_string) to t_401 + #load the variable t_404 + lw $v0, -376($fp) + sw $v0, -364($fp) + + j ifend_36 + then_36: + # assign (add here the expr.to_string) to t_463 + #load the string str_70 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_70 + sw $v1, 4($v0) + sw $v0, -612($fp) + + # assign (add here the expr.to_string) to t_401 + #load the variable t_463 + lw $v0, -612($fp) + sw $v0, -364($fp) + + ifend_36: + # assign (add here the expr.to_string) to t_398 + #load the variable t_401 + lw $v0, -364($fp) + sw $v0, -352($fp) + + j ifend_35 + then_35: + # assign (add here the expr.to_string) to t_464 + #load the string str_71 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_71 + sw $v1, 4($v0) + sw $v0, -616($fp) + + # assign (add here the expr.to_string) to t_398 + #load the variable t_464 + lw $v0, -616($fp) + sw $v0, -352($fp) + + ifend_35: + # assign (add here the expr.to_string) to t_395 + #load the variable t_398 + lw $v0, -352($fp) + sw $v0, -340($fp) + + j ifend_34 + then_34: + # assign (add here the expr.to_string) to t_465 + #load the string str_72 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_72 + sw $v1, 4($v0) + sw $v0, -620($fp) + + # assign (add here the expr.to_string) to t_395 + #load the variable t_465 + lw $v0, -620($fp) + sw $v0, -340($fp) + + ifend_34: + # assign (add here the expr.to_string) to t_392 + #load the variable t_395 + lw $v0, -340($fp) + sw $v0, -328($fp) + + j ifend_33 + then_33: + # assign (add here the expr.to_string) to t_466 + #load the string str_73 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_73 + sw $v1, 4($v0) + sw $v0, -624($fp) + + # assign (add here the expr.to_string) to t_392 + #load the variable t_466 + lw $v0, -624($fp) + sw $v0, -328($fp) + + ifend_33: + # assign (add here the expr.to_string) to t_389 + #load the variable t_392 + lw $v0, -328($fp) + sw $v0, -316($fp) + + j ifend_32 + then_32: + # assign (add here the expr.to_string) to t_467 + #load the string str_74 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_74 + sw $v1, 4($v0) + sw $v0, -628($fp) + + # assign (add here the expr.to_string) to t_389 + #load the variable t_467 + lw $v0, -628($fp) + sw $v0, -316($fp) + + ifend_32: + # assign (add here the expr.to_string) to t_386 + #load the variable t_389 + lw $v0, -316($fp) + sw $v0, -304($fp) + + j ifend_31 + then_31: + # assign (add here the expr.to_string) to t_468 + #load the string str_75 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_75 + sw $v1, 4($v0) + sw $v0, -632($fp) - sw $v0, -32($fp) + # assign (add here the expr.to_string) to t_386 + #load the variable t_468 + lw $v0, -632($fp) + sw $v0, -304($fp) - # assign (add here the expr.to_string) to t_9 - #load the variable c_0 - lw $v0, -0($fp) - sw $v0, -36($fp) + ifend_31: + # assign (add here the expr.to_string) to t_469 + #load the variable t_386 + lw $v0, -304($fp) + sw $v0, -636($fp) - lw $v0, -36($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 + # return the value of the function in the register $v0 + #load the variable t_469 + lw $v0, -636($fp) + move $v0, $v0 - # assign (add here the expr.to_string) to t_10 - # calling the method reflect_0 of type Complex - #load the variable t_9 - lw $v0, -36($fp) - lw $v0, 0($v0) - lw $v1, 48($v0) - jal $v1 - # pop the top of the stack to $v1 + # restore the stack pointer, frame pointer y return address + addu $sp $sp 640 + # pop the top of the stack to $fp addi $sp $sp 4 - lw $v1, 0($sp) + lw $fp, 0($sp) - sw $v0, -40($fp) + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) - # assign (add here the expr.to_string) to t_11 - #load the variable t_8 - lw $v0, -32($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 + jr $ra - #load the variable t_10 - lw $v0, -40($fp) - # push $v0 to the stack - sw $v0, 0($sp) + .text +prompt_CellularAutomaton: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) addi $sp $sp -4 - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 - sw $v0, -44($fp) + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 72 - # assign (add here the expr.to_string) to t_12 - #load the variable t_11 - lw $v0, -44($fp) - sw $v0, -48($fp) + # assign (add here the expr.to_string) to ans_470 + #load the string str_empty + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_empty + sw $v1, 4($v0) + sw $v0, -0($fp) - lw $t1, -48($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_0 - # assign (add here the expr.to_string) to t_14 - #load the string str_0 + # assign (add here the expr.to_string) to t_471 + #load the string str_76 li $a0, 8 li $v0, 9 syscall la $v1, String sw $v1, 0($v0) - la $v1, str_0 + la $v1, str_76 sw $v1, 4($v0) - sw $v0, -56($fp) + sw $v0, -4($fp) - # assign (add here the expr.to_string) to t_15 - #load the variable t_14 - lw $v0, -56($fp) - sw $v0, -60($fp) + # assign (add here the expr.to_string) to t_472 + #load the variable t_471 + lw $v0, -4($fp) + sw $v0, -8($fp) lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -60($fp) + lw $v0, -8($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_16 - # calling the method out_string of type Main - #load the variable self_Main + # assign (add here the expr.to_string) to t_473 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton lw $v0, 12($fp) - lw $v0, 0($v0) - lw $v1, 24($v0) + lw $t0, 0($v0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -363,47 +8305,40 @@ main_Main: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -64($fp) - - # assign (add here the expr.to_string) to t_13 - #load the variable t_16 - lw $v0, -64($fp) - sw $v0, -52($fp) + sw $v0, -12($fp) - j ifend_0 - then_0: - # assign (add here the expr.to_string) to t_17 - #load the string str_1 + # assign (add here the expr.to_string) to t_474 + #load the string str_77 li $a0, 8 li $v0, 9 syscall la $v1, String sw $v1, 0($v0) - la $v1, str_1 + la $v1, str_77 sw $v1, 4($v0) - sw $v0, -68($fp) + sw $v0, -16($fp) - # assign (add here the expr.to_string) to t_18 - #load the variable t_17 - lw $v0, -68($fp) - sw $v0, -72($fp) + # assign (add here the expr.to_string) to t_475 + #load the variable t_474 + lw $v0, -16($fp) + sw $v0, -20($fp) lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -72($fp) + lw $v0, -20($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_19 - # calling the method out_string of type Main - #load the variable self_Main + # assign (add here the expr.to_string) to t_476 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton lw $v0, 12($fp) - lw $v0, 0($v0) - lw $v1, 24($v0) + lw $t0, 0($v0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -413,110 +8348,140 @@ main_Main: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -76($fp) - - # assign (add here the expr.to_string) to t_13 - #load the variable t_19 - lw $v0, -76($fp) - sw $v0, -52($fp) - - ifend_0: - # assign (add here the expr.to_string) to t_20 - #load the variable t_13 - lw $v0, -52($fp) - sw $v0, -80($fp) - - # return the value of the function in the register $v0 - #load the variable t_20 - lw $v0, -80($fp) - move $v0, $v0 + sw $v0, -24($fp) - # restore the stack pointer, frame pointer y return address - addu $sp $sp 84 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # pop the top of the stack to $ra + # assign (add here the expr.to_string) to t_477 + # calling the method in_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 32($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $ra, 0($sp) + lw $v1, 0($sp) - jr $ra + sw $v0, -28($fp) - .text -Init_Main: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to ans_470 + #load the variable t_477 + lw $v0, -28($fp) + sw $v0, -0($fp) - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_478 + #load the string str_78 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_78 + sw $v1, 4($v0) + sw $v0, -32($fp) - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 0 + # assign (add here the expr.to_string) to t_479 + #load the variable t_478 + lw $v0, -32($fp) + sw $v0, -36($fp) lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to self_Main - jal Init_IO + lw $v0, -36($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_480 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, 12($fp) - - # return the value of the function in the register $v0 - #load the variable self_Main - lw $v0, 12($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 - # pop the top of the stack to $fp + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $fp, 0($sp) + lw $v1, 0($sp) - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) + sw $v0, -40($fp) - jr $ra + # assign (add here the expr.to_string) to t_481 + #load the string str_79 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_79 + sw $v1, 4($v0) + sw $v0, -44($fp) - .text -init_Complex: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) + # assign (add here the expr.to_string) to t_482 + #load the variable ans_470 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # push $fp to the stack - sw $fp, 0($sp) + #load the variable t_481 + lw $v0, -44($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 20 + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) - # assign (add here the expr.to_string) to t_23 - lw $v1, 20($fp) - lw $v0, 4($v1) - sw $v0, -0($fp) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -48($fp) + + # assign (add here the expr.to_string) to t_483 + #load the variable t_482 + lw $v0, -48($fp) + sw $v0, -52($fp) + + lw $t1, -52($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_52 + # assign (add here the expr.to_string) to t_485 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) - # assign (add here the expr.to_string) to t_24 - #load the variable t_23 - lw $v0, -0($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - #load the variable a_21 - lw $v0, 16($fp) + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 @@ -530,22 +8495,38 @@ init_Complex: addi $sp $sp 4 lw $t0, 0($sp) - sw $v0, -4($fp) + sw $v0, -60($fp) - # assign (add here the expr.to_string) to t_25 - lw $v1, 20($fp) - lw $v0, 8($v1) - sw $v0, -8($fp) + # assign (add here the expr.to_string) to t_484 + #load the variable t_485 + lw $v0, -60($fp) + sw $v0, -56($fp) + + j ifend_52 + then_52: + # assign (add here the expr.to_string) to t_486 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) - # assign (add here the expr.to_string) to t_26 - #load the variable t_25 - lw $v0, -8($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - #load the variable b_22 - lw $v0, 12($fp) + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 @@ -559,20 +8540,26 @@ init_Complex: addi $sp $sp 4 lw $t0, 0($sp) - sw $v0, -12($fp) + sw $v0, -64($fp) - # assign (add here the expr.to_string) to t_27 - #load the variable self_Complex - lw $v0, 20($fp) - sw $v0, -16($fp) + # assign (add here the expr.to_string) to t_484 + #load the variable t_486 + lw $v0, -64($fp) + sw $v0, -56($fp) + + ifend_52: + # assign (add here the expr.to_string) to t_487 + #load the variable t_484 + lw $v0, -56($fp) + sw $v0, -68($fp) # return the value of the function in the register $v0 - #load the variable t_27 - lw $v0, -16($fp) + #load the variable t_487 + lw $v0, -68($fp) move $v0, $v0 # restore the stack pointer, frame pointer y return address - addu $sp $sp 20 + addu $sp $sp 72 # pop the top of the stack to $fp addi $sp $sp 4 lw $fp, 0($sp) @@ -584,7 +8571,7 @@ init_Complex: jr $ra .text -print_Complex: +prompt2_CellularAutomaton: # save the return address and frame pointer # push $ra to the stack sw $ra, 0($sp) @@ -596,78 +8583,51 @@ print_Complex: # update the frame pointer and allocate the frame in the stack move $fp $sp - subu $sp $sp 92 + subu $sp $sp 72 - # assign (add here the expr.to_string) to t_28 - lw $v1, 12($fp) - lw $v0, 8($v1) + # assign (add here the expr.to_string) to ans_488 + #load the string str_empty + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_empty + sw $v1, 4($v0) sw $v0, -0($fp) - # assign (add here the expr.to_string) to t_29 - #load the variable t_28 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 0 + # assign (add here the expr.to_string) to t_489 + #load the string str_80 li $a0, 8 li $v0, 9 syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - + la $v1, String + sw $v1, 0($v0) + la $v1, str_80 + sw $v1, 4($v0) sw $v0, -4($fp) - # assign (add here the expr.to_string) to t_30 - #load the variable t_29 + # assign (add here the expr.to_string) to t_490 + #load the variable t_489 lw $v0, -4($fp) sw $v0, -8($fp) - lw $t1, -8($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_1 - # assign (add here the expr.to_string) to t_32 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -16($fp) - - # assign (add here the expr.to_string) to t_33 - #load the variable t_32 - lw $v0, -16($fp) - sw $v0, -20($fp) - lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -20($fp) + lw $v0, -8($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_34 - # calling the method out_int of type Complex - #load the variable self_Complex + # assign (add here the expr.to_string) to t_491 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton lw $v0, 12($fp) - lw $v0, 0($v0) - lw $v1, 28($v0) + lw $t0, 0($v0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -677,87 +8637,40 @@ print_Complex: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to t_35 - #load the variable t_34 - lw $v0, -24($fp) - sw $v0, -28($fp) + sw $v0, -12($fp) - # assign (add here the expr.to_string) to t_36 - #load the string str_2 + # assign (add here the expr.to_string) to t_492 + #load the string str_81 li $a0, 8 li $v0, 9 syscall la $v1, String sw $v1, 0($v0) - la $v1, str_2 + la $v1, str_81 sw $v1, 4($v0) - sw $v0, -32($fp) - - # assign (add here the expr.to_string) to t_37 - #load the variable t_36 - lw $v0, -32($fp) - sw $v0, -36($fp) - - lw $v0, -28($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -36($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_38 - # calling the method out_string of type Complex - #load the variable t_35 - lw $v0, -28($fp) - lw $v0, 0($v0) - lw $v1, 24($v0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -40($fp) - - # assign (add here the expr.to_string) to t_39 - #load the variable t_38 - lw $v0, -40($fp) - sw $v0, -44($fp) - - # assign (add here the expr.to_string) to t_40 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -48($fp) + sw $v0, -16($fp) - # assign (add here the expr.to_string) to t_41 - #load the variable t_40 - lw $v0, -48($fp) - sw $v0, -52($fp) + # assign (add here the expr.to_string) to t_493 + #load the variable t_492 + lw $v0, -16($fp) + sw $v0, -20($fp) - lw $v0, -44($fp) + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -52($fp) + lw $v0, -20($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_42 - # calling the method out_int of type Complex - #load the variable t_39 - lw $v0, -44($fp) - lw $v0, 0($v0) - lw $v1, 28($v0) + # assign (add here the expr.to_string) to t_494 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -767,199 +8680,94 @@ print_Complex: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -56($fp) - - # assign (add here the expr.to_string) to t_43 - #load the variable t_42 - lw $v0, -56($fp) - sw $v0, -60($fp) + sw $v0, -24($fp) - # assign (add here the expr.to_string) to t_44 - #load the string str_3 + # assign (add here the expr.to_string) to t_495 + #load the string str_82 li $a0, 8 li $v0, 9 syscall la $v1, String sw $v1, 0($v0) - la $v1, str_3 + la $v1, str_82 sw $v1, 4($v0) - sw $v0, -64($fp) - - # assign (add here the expr.to_string) to t_45 - #load the variable t_44 - lw $v0, -64($fp) - sw $v0, -68($fp) - - lw $v0, -60($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -68($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_46 - # calling the method out_string of type Complex - #load the variable t_43 - lw $v0, -60($fp) - lw $v0, 0($v0) - lw $v1, 24($v0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -72($fp) - - # assign (add here the expr.to_string) to t_31 - #load the variable t_46 - lw $v0, -72($fp) - sw $v0, -12($fp) - - j ifend_1 - then_1: - # assign (add here the expr.to_string) to t_47 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -76($fp) + sw $v0, -28($fp) - # assign (add here the expr.to_string) to t_48 - #load the variable t_47 - lw $v0, -76($fp) - sw $v0, -80($fp) + # assign (add here the expr.to_string) to t_496 + #load the variable t_495 + lw $v0, -28($fp) + sw $v0, -32($fp) lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -80($fp) + lw $v0, -32($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_49 - # calling the method out_int of type Complex - #load the variable self_Complex - lw $v0, 12($fp) - lw $v0, 0($v0) - lw $v1, 28($v0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -84($fp) - - # assign (add here the expr.to_string) to t_31 - #load the variable t_49 - lw $v0, -84($fp) - sw $v0, -12($fp) - - ifend_1: - # assign (add here the expr.to_string) to t_50 - #load the variable t_31 - lw $v0, -12($fp) - sw $v0, -88($fp) - - # return the value of the function in the register $v0 - #load the variable t_50 - lw $v0, -88($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 92 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -reflect_0_Complex: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 44 - - # assign (add here the expr.to_string) to t_51 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_52 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -4($fp) + # assign (add here the expr.to_string) to t_497 + # calling the method out_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # assign (add here the expr.to_string) to t_53 - #load the variable t_52 - lw $v0, -4($fp) - sw $v0, -8($fp) + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # assign (add here the expr.to_string) to t_54 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) + sw $v0, -36($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - #load the variable t_53 - lw $v0, -8($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 + # assign (add here the expr.to_string) to t_498 + # calling the method in_string of type CellularAutomaton + #load the variable self_CellularAutomaton + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 32($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $t0, 0($sp) + lw $v1, 0($sp) - sub $t0, $t0, $t1 + sw $v0, -40($fp) + + # assign (add here the expr.to_string) to ans_488 + #load the variable t_498 + lw $v0, -40($fp) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_499 + #load the string str_83 li $a0, 8 li $v0, 9 syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -12($fp) + la $v1, String + sw $v1, 0($v0) + la $v1, str_83 + sw $v1, 4($v0) + sw $v0, -44($fp) - # assign (add here the expr.to_string) to t_55 - #load the variable t_51 + # assign (add here the expr.to_string) to t_500 + #load the variable ans_488 lw $v0, -0($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - #load the variable t_54 - lw $v0, -12($fp) + #load the variable t_499 + lw $v0, -44($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 @@ -973,25 +8781,17 @@ reflect_0_Complex: addi $sp $sp 4 lw $t0, 0($sp) - sw $v0, -16($fp) - - # assign (add here the expr.to_string) to t_56 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -20($fp) - - # assign (add here the expr.to_string) to t_57 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -24($fp) + sw $v0, -48($fp) - # assign (add here the expr.to_string) to t_58 - #load the variable t_57 - lw $v0, -24($fp) - sw $v0, -28($fp) + # assign (add here the expr.to_string) to t_501 + #load the variable t_500 + lw $v0, -48($fp) + sw $v0, -52($fp) - # assign (add here the expr.to_string) to t_59 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + lw $t1, -52($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_53 + # assign (add here the expr.to_string) to t_503 # Creating Int instance for atomic 0 li $a0, 8 li $v0, 9 @@ -1001,36 +8801,19 @@ reflect_0_Complex: sw $t0, 0($v0) sw $t1, 4($v0) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - #load the variable t_58 - lw $v0, -28($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sub $t0, $t0, $t1 + # Creating Int instance for atomic 1 li $a0, 8 li $v0, 9 syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -32($fp) - - # assign (add here the expr.to_string) to t_60 - #load the variable t_56 - lw $v0, -20($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) - #load the variable t_59 - lw $v0, -32($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 @@ -1044,62 +8827,16 @@ reflect_0_Complex: addi $sp $sp 4 lw $t0, 0($sp) - sw $v0, -36($fp) - - # assign (add here the expr.to_string) to t_61 - #load the variable self_Complex - lw $v0, 12($fp) - sw $v0, -40($fp) - - # return the value of the function in the register $v0 - #load the variable t_61 - lw $v0, -40($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 44 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -reflect_X_Complex: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 24 - - # assign (add here the expr.to_string) to t_62 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_63 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -4($fp) + sw $v0, -60($fp) - # assign (add here the expr.to_string) to t_64 - #load the variable t_63 - lw $v0, -4($fp) - sw $v0, -8($fp) + # assign (add here the expr.to_string) to t_502 + #load the variable t_503 + lw $v0, -60($fp) + sw $v0, -56($fp) - # assign (add here the expr.to_string) to t_65 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + j ifend_53 + then_53: + # assign (add here the expr.to_string) to t_504 # Creating Int instance for atomic 0 li $a0, 8 li $v0, 9 @@ -1109,36 +8846,19 @@ reflect_X_Complex: sw $t0, 0($v0) sw $t1, 4($v0) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - #load the variable t_64 - lw $v0, -8($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sub $t0, $t0, $t1 + # Creating Int instance for atomic 0 li $a0, 8 li $v0, 9 syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_66 - #load the variable t_62 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) - #load the variable t_65 - lw $v0, -12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 @@ -1152,20 +8872,26 @@ reflect_X_Complex: addi $sp $sp 4 lw $t0, 0($sp) - sw $v0, -16($fp) + sw $v0, -64($fp) - # assign (add here the expr.to_string) to t_67 - #load the variable self_Complex - lw $v0, 12($fp) - sw $v0, -20($fp) + # assign (add here the expr.to_string) to t_502 + #load the variable t_504 + lw $v0, -64($fp) + sw $v0, -56($fp) + + ifend_53: + # assign (add here the expr.to_string) to t_505 + #load the variable t_502 + lw $v0, -56($fp) + sw $v0, -68($fp) # return the value of the function in the register $v0 - #load the variable t_67 - lw $v0, -20($fp) + #load the variable t_505 + lw $v0, -68($fp) move $v0, $v0 # restore the stack pointer, frame pointer y return address - addu $sp $sp 24 + addu $sp $sp 72 # pop the top of the stack to $fp addi $sp $sp 4 lw $fp, 0($sp) @@ -1177,7 +8903,7 @@ reflect_X_Complex: jr $ra .text -reflect_Y_Complex: +Init_CellularAutomaton: # save the return address and frame pointer # push $ra to the stack sw $ra, 0($sp) @@ -1187,93 +8913,48 @@ reflect_Y_Complex: sw $fp, 0($sp) addi $sp $sp -4 - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 24 - - # assign (add here the expr.to_string) to t_68 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_69 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_70 - #load the variable t_69 - lw $v0, -4($fp) - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to t_71 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_70 - lw $v0, -8($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_72 - #load the variable t_68 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_71 - lw $v0, -12($fp) + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 4 + + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - jal compare - # pop the top of the stack to $t0 + # assign (add here the expr.to_string) to self_CellularAutomaton + jal Init_Board + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $t0, 0($sp) + lw $v1, 0($sp) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) + sw $v0, 12($fp) - sw $v0, -16($fp) + # assign (add here the expr.to_string) to t_506 + #load the string str_empty + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_empty + sw $v1, 4($v0) + sw $v0, -0($fp) - # assign (add here the expr.to_string) to t_73 - #load the variable self_Complex - lw $v0, 12($fp) - sw $v0, -20($fp) + # Setting value of the attribute population_map in the instance self_CellularAutomaton to t_506 + #load the variable t_506 + lw $v0, -0($fp) + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 16($v1) # return the value of the function in the register $v0 - #load the variable t_73 - lw $v0, -20($fp) + #load the variable self_CellularAutomaton + lw $v0, 12($fp) move $v0, $v0 # restore the stack pointer, frame pointer y return address - addu $sp $sp 24 + addu $sp $sp 4 # pop the top of the stack to $fp addi $sp $sp 4 lw $fp, 0($sp) @@ -1285,7 +8966,7 @@ reflect_Y_Complex: jr $ra .text -equal_Complex: +main_Main: # save the return address and frame pointer # push $ra to the stack sw $ra, 0($sp) @@ -1297,69 +8978,173 @@ equal_Complex: # update the frame pointer and allocate the frame in the stack move $fp $sp - subu $sp $sp 64 + subu $sp $sp 136 + + # assign (add here the expr.to_string) to continue_507 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) - # assign (add here the expr.to_string) to t_75 - lw $v1, 16($fp) - lw $v0, 4($v1) sw $v0, -0($fp) - # assign (add here the expr.to_string) to t_76 - #load the variable d_74 - lw $v0, 12($fp) + # assign (add here the expr.to_string) to choice_508 + #load the string str_empty + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_empty + sw $v1, 4($v0) sw $v0, -4($fp) - lw $v0, -4($fp) + # assign (add here the expr.to_string) to t_509 + #load the string str_84 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_84 + sw $v1, 4($v0) + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_510 + #load the variable t_509 + lw $v0, -8($fp) + sw $v0, -12($fp) + + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_77 - # calling the method x_value of type Complex - #load the variable t_76 - lw $v0, -4($fp) - lw $v0, 0($v0) - lw $v1, 64($v0) + lw $v0, -12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_511 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -8($fp) + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # assign (add here the expr.to_string) to t_78 - #load the variable t_75 - lw $v0, -0($fp) + sw $v0, -16($fp) + + # assign (add here the expr.to_string) to t_512 + #load the string str_85 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_85 + sw $v1, 4($v0) + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_513 + #load the variable t_512 + lw $v0, -20($fp) + sw $v0, -24($fp) + + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - #load the variable t_77 - lw $v0, -8($fp) + lw $v0, -24($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - jal compare - # pop the top of the stack to $t0 + # assign (add here the expr.to_string) to t_514 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $t0, 0($sp) + lw $v1, 0($sp) - # pop the top of the stack to $t0 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $t0, 0($sp) + lw $v1, 0($sp) - sw $v0, -12($fp) + sw $v0, -28($fp) - # assign (add here the expr.to_string) to t_79 - #load the variable t_78 - lw $v0, -12($fp) - sw $v0, -16($fp) + while_2: + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - lw $t1, -16($fp) + # assign (add here the expr.to_string) to t_515 + # calling the method prompt2 of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 116($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -32($fp) + + # assign (add here the expr.to_string) to t_516 + #load the variable t_515 + lw $v0, -32($fp) + sw $v0, -36($fp) + + lw $t1, -36($fp) lw $t0, 4($t1) - bne $t0, $zero, then_2 - # assign (add here the expr.to_string) to t_81 + bne $t0, $zero, body_2 + j pool_2 + body_2: + # assign (add here the expr.to_string) to t_518 # Creating Int instance for atomic 0 li $a0, 8 li $v0, 9 @@ -1373,12 +9158,12 @@ equal_Complex: sw $v0, 0($sp) addi $sp $sp -4 - # Creating Int instance for atomic 1 + # Creating Int instance for atomic 0 li $a0, 8 li $v0, 9 syscall la $t0, Int - li $t1, 1 + li $t1, 0 sw $t0, 0($v0) sw $t1, 4($v0) @@ -1395,76 +9180,172 @@ equal_Complex: addi $sp $sp 4 lw $t0, 0($sp) - sw $v0, -24($fp) + sw $v0, -44($fp) - # assign (add here the expr.to_string) to t_80 - #load the variable t_81 - lw $v0, -24($fp) - sw $v0, -20($fp) + # assign (add here the expr.to_string) to continue_507 + #load the variable t_518 + lw $v0, -44($fp) + sw $v0, -0($fp) - j ifend_2 - then_2: - # assign (add here the expr.to_string) to t_82 - lw $v1, 16($fp) - lw $v0, 8($v1) - sw $v0, -28($fp) + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # assign (add here the expr.to_string) to t_83 - #load the variable d_74 + # assign (add here the expr.to_string) to t_519 + # calling the method option of type Main + #load the variable self_Main lw $v0, 12($fp) - sw $v0, -32($fp) + lw $t0, 0($v0) + lw $v1, 108($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - lw $v0, -32($fp) + sw $v0, -48($fp) + + # assign (add here the expr.to_string) to choice_508 + #load the variable t_519 + lw $v0, -48($fp) + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_520 + li $a0, 20 + li $v0, 9 + syscall + la $a0, CellularAutomaton + sw $a0, 0($v0) + sw $v0, -52($fp) + + lw $v0, -52($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_521 + # calling the method Init_CellularAutomaton of type CellularAutomaton + #load the variable t_520 + lw $v0, -52($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -56($fp) + + # assign (add here the expr.to_string) to t_522 + #load the variable t_521 + lw $v0, -56($fp) + sw $v0, -60($fp) + + # assign (add here the expr.to_string) to t_523 + #load the variable choice_508 + lw $v0, -4($fp) + sw $v0, -64($fp) + + lw $v0, -60($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -64($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_524 + # calling the method init of type CellularAutomaton + #load the variable t_522 + lw $v0, -60($fp) + lw $t0, 0($v0) + lw $v1, 48($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -68($fp) + + # Setting value of the attribute cells in the instance self_Main to t_524 + #load the variable t_524 + lw $v0, -68($fp) + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 20($v1) + + # assign (add here the expr.to_string) to t_525 + lw $v1, 12($fp) + lw $v0, 20($v1) + sw $v0, -72($fp) + + # assign (add here the expr.to_string) to t_526 + #load the variable t_525 + lw $v0, -72($fp) + sw $v0, -76($fp) + + lw $v0, -76($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_84 - # calling the method y_value of type Complex - #load the variable t_83 - lw $v0, -32($fp) - lw $v0, 0($v0) - lw $v1, 68($v0) + # assign (add here the expr.to_string) to t_527 + # calling the method print of type CellularAutomaton + #load the variable t_526 + lw $v0, -76($fp) + lw $t0, 0($v0) + lw $v1, 52($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -36($fp) + sw $v0, -80($fp) - # assign (add here the expr.to_string) to t_85 - #load the variable t_82 - lw $v0, -28($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 + while_3: + # assign (add here the expr.to_string) to t_528 + #load the variable continue_507 + lw $v0, -0($fp) + sw $v0, -84($fp) - #load the variable t_84 - lw $v0, -36($fp) + lw $t1, -84($fp) + lw $t0, 4($t1) + bne $t0, $zero, body_3 + j pool_3 + body_3: + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 + # assign (add here the expr.to_string) to t_530 + # calling the method prompt of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 112($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $t0, 0($sp) + lw $v1, 0($sp) - sw $v0, -40($fp) + sw $v0, -92($fp) - # assign (add here the expr.to_string) to t_86 - #load the variable t_85 - lw $v0, -40($fp) - sw $v0, -44($fp) + # assign (add here the expr.to_string) to t_531 + #load the variable t_530 + lw $v0, -92($fp) + sw $v0, -96($fp) - lw $t1, -44($fp) + lw $t1, -96($fp) lw $t0, 4($t1) - bne $t0, $zero, then_3 - # assign (add here the expr.to_string) to t_88 + bne $t0, $zero, then_54 + # assign (add here the expr.to_string) to t_533 # Creating Int instance for atomic 0 li $a0, 8 li $v0, 9 @@ -1500,161 +9381,110 @@ equal_Complex: addi $sp $sp 4 lw $t0, 0($sp) - sw $v0, -52($fp) + sw $v0, -104($fp) - # assign (add here the expr.to_string) to t_87 - #load the variable t_88 - lw $v0, -52($fp) - sw $v0, -48($fp) + # assign (add here the expr.to_string) to continue_507 + #load the variable t_533 + lw $v0, -104($fp) + sw $v0, -0($fp) - j ifend_3 - then_3: - # assign (add here the expr.to_string) to t_89 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) + # assign (add here the expr.to_string) to t_532 + #load the variable continue_507 + lw $v0, -0($fp) + sw $v0, -100($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 + j ifend_54 + then_54: + # assign (add here the expr.to_string) to t_534 + lw $v1, 12($fp) + lw $v0, 20($v1) + sw $v0, -108($fp) - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) + # assign (add here the expr.to_string) to t_535 + #load the variable t_534 + lw $v0, -108($fp) + sw $v0, -112($fp) + lw $v0, -112($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -56($fp) - - # assign (add here the expr.to_string) to t_87 - #load the variable t_89 - lw $v0, -56($fp) - sw $v0, -48($fp) - - ifend_3: - # assign (add here the expr.to_string) to t_80 - #load the variable t_87 - lw $v0, -48($fp) - sw $v0, -20($fp) - - ifend_2: - # assign (add here the expr.to_string) to t_90 - #load the variable t_80 - lw $v0, -20($fp) - sw $v0, -60($fp) - - # return the value of the function in the register $v0 - #load the variable t_90 - lw $v0, -60($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 64 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra + + .globl test +test: + # assign (add here the expr.to_string) to t_536 + # calling the method evolve of type CellularAutomaton + #load the variable t_535 + lw $v0, -112($fp) + lw $t0, 0($v0) + lw $v1, 104($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -x_value_Complex: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 + lw $v1, 0($sp) - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 8 + sw $v0, -116($fp) - # assign (add here the expr.to_string) to t_91 + # assign (add here the expr.to_string) to t_537 lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -0($fp) + lw $v0, 20($v1) + sw $v0, -120($fp) - # assign (add here the expr.to_string) to t_92 - #load the variable t_91 - lw $v0, -0($fp) - sw $v0, -4($fp) - - # return the value of the function in the register $v0 - #load the variable t_92 - lw $v0, -4($fp) - move $v0, $v0 + # assign (add here the expr.to_string) to t_538 + #load the variable t_537 + lw $v0, -120($fp) + sw $v0, -124($fp) - # restore the stack pointer, frame pointer y return address - addu $sp $sp 8 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) + lw $v0, -124($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # pop the top of the stack to $ra + # assign (add here the expr.to_string) to t_539 + # calling the method print of type CellularAutomaton + #load the variable t_538 + lw $v0, -124($fp) + lw $t0, 0($v0) + lw $v1, 52($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra + lw $v1, 0($sp) - .text -y_value_Complex: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + sw $v0, -128($fp) - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_532 + #load the variable t_539 + lw $v0, -128($fp) + sw $v0, -100($fp) - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 8 + ifend_54: + # assign (add here the expr.to_string) to t_529 + #load the variable t_532 + lw $v0, -100($fp) + sw $v0, -88($fp) - # assign (add here the expr.to_string) to t_93 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -0($fp) + j while_3 + pool_3: + # assign (add here the expr.to_string) to t_517 + #load the variable t_529 + lw $v0, -88($fp) + sw $v0, -40($fp) - # assign (add here the expr.to_string) to t_94 - #load the variable t_93 - lw $v0, -0($fp) - sw $v0, -4($fp) + j while_2 + pool_2: + # assign (add here the expr.to_string) to t_540 + #load the variable self_Main + lw $v0, 12($fp) + sw $v0, -132($fp) # return the value of the function in the register $v0 - #load the variable t_94 - lw $v0, -4($fp) + #load the variable t_540 + lw $v0, -132($fp) move $v0, $v0 # restore the stack pointer, frame pointer y return address - addu $sp $sp 8 + addu $sp $sp 136 # pop the top of the stack to $fp addi $sp $sp 4 lw $fp, 0($sp) @@ -1666,7 +9496,7 @@ y_value_Complex: jr $ra .text -Init_Complex: +Init_Main: # save the return address and frame pointer # push $ra to the stack sw $ra, 0($sp) @@ -1685,8 +9515,8 @@ Init_Complex: sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to self_Complex - jal Init_IO + # assign (add here the expr.to_string) to self_Main + jal Init_CellularAutomaton # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) @@ -1694,7 +9524,7 @@ Init_Complex: sw $v0, 12($fp) # return the value of the function in the register $v0 - #load the variable self_Complex + #load the variable self_Main lw $v0, 12($fp) move $v0, $v0 @@ -1922,6 +9752,40 @@ abort_Object: jr $ra +copy_Object: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + + lw $t7, 12($fp) # load the object address + lw $t6, 0($t7) # get the type info address + lw $t5, 0($t6) # get the size of the type + + move $a0, $t5 + li $v0, 9 + syscall + move $t6, $v0 +copy_Object_loop: + lw $t4, 0($t7) + sw $t4, 0($t6) + addu $t7, $t7, 4 + addu $t6, $t6, 4 + addu $t5, $t5, -4 + bgtz $t5, copy_Object_loop + + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + out_string_IO: @@ -1987,7 +9851,7 @@ in_string_IO: la $t0, IO_Buffer sw $t0, 0($sp) addi $sp, $sp, -4 - jal strlen + jal strlen addi $sp, $sp, 4 lw $t0, 0($sp) # the length is now in $v0 @@ -1999,7 +9863,7 @@ in_string_IO: la $t1, IO_Buffer # copy the string value from the buffer to the heap move $t2, $v0 in_string_IO_loop: - lb $t3, 0($t1) + lbu $t3, 0($t1) sb $t3, 0($t2) addi $t1, $t1, 1 addi $t2, $t2, 1 @@ -2095,6 +9959,8 @@ type_name_Object: jr $ra + + .globl substr substr_String: # calling conventions sw $ra, 0($sp) @@ -2133,7 +9999,7 @@ substr_String: substr_String_loop2: beq $t3, $t2, substr_String_eloop2 - lb $t7, 0($t0) + lbu $t7, 0($t0) sb $t7, 0($t4) addi $t0, $t0, 1 addi $t4, $t4, 1 @@ -2205,7 +10071,7 @@ strlen: lw $a0, 12($fp) li $t0, 0 strlen_loop: - lb $t1, 0($a0) + lbu $t1, 0($a0) beqz $t1, strlen_exit addu $a0, $a0, 1 addu $t0, $t0, 1 @@ -2283,6 +10149,9 @@ compare: la $t4, Bool beq $t3, $t4, compare_branch1 + la $t4, type + beq $t3, $t4, compare_branch1 + la $t4, String beq $t3, $t4, compare_branch2 @@ -2301,8 +10170,8 @@ compare: lw $t0, 4($t0) lw $t1, 4($t1) compare_str_loop: - lb $t3, 0($t0) - lb $t4, 0($t1) + lbu $t3, 0($t0) + lbu $t4, 0($t1) bne $t3, $t4, compare_false beq $t3, $zero, compare_true addi $t0, $t0, 1 @@ -2342,6 +10211,97 @@ concat_String: sw $fp, 0($sp) addi $sp, $sp, -4 move $fp, $sp + + lw $t0, 16($fp) + lw $t0, 4($t0) # the value of the first String instance + + # call strlen with the string + sw $t0, 0($sp) + addi $sp, $sp, -4 + jal strlen + addi $sp, $sp, 4 + lw $t0, 0($sp) + + #save the lenght of the first string + sw $v0, 0($sp) + addi $sp, $sp, -4 + + + lw $t0, 16($fp) + lw $t0, 4($t0) # the value of the second String instance + + # call strlen with the string + sw $t0, 0($sp) + addi $sp, $sp, -4 + jal strlen + addi $sp, $sp, 4 + lw $t0, 0($sp) + + # pop the lenght of the first string from the stack + addi $sp, $sp, 4 + lw $t0, 0($sp) + + # get the total space for allocating the new string + addu $t0, $t0, $v0 + addi $t0, $t0, 1 + + move $a0, $t0 + li $v0, 9 + syscall # at $v0 is the result string + + lw $t0, 16($fp) + lw $t0, 4($t0) # the address of the value of the first String instance + move $t1, $v0 # the address of the value of the result string + concat_String_loop1: + lbu $t3, 0($t0) + beq $t3, $zero, concat_String_eloop1 + sb $t3, 0($t1) + addi $t0, $t0, 1 + addi $t1, $t1, 1 + j concat_String_loop1 + + concat_String_eloop1: + + lw $t0, 12($fp) + lw $t0, 4($t0) + concat_String_loop2: + lbu $t3, 0($t0) + beq $t3, $zero, concat_String_eloop2 + sb $t3, 0($t1) + addi $t0, $t0, 1 + addi $t1, $t1, 1 + j concat_String_loop2 + concat_String_eloop2: + sb $zero, 0($t1) + + la $t0, String + move $t1, $v0 + + li $a0, 8 + li $v0, 9 + syscall + + sw $t0, 0($v0) + sw $t1, 4($v0) + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + + + + + + + + + + + From 135547b0627b4ad382aec4dacaba33f5c843e984 Mon Sep 17 00:00:00 2001 From: Amy Date: Mon, 28 Feb 2022 22:48:55 -0500 Subject: [PATCH 66/81] fix error in second part of new implementation of case --- src/code_generator/generate_ast.py | 110 +++++++++++++++++++---------- src/code_generator/utils.py | 4 +- 2 files changed, 75 insertions(+), 39 deletions(-) diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 83260c338..0091a03d6 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -1,5 +1,4 @@ -from cmath import exp -from copy import copy + from parsing.ast import * from .ast_CIL import * from .utils import * @@ -245,14 +244,13 @@ def visit(self, node): @visitor.when(CaseNode) def visit(self, node): + self.scope.aux_lo = [] expr = self.visit(node.expr) self.expression_var_case = expr print("lolllllllllllllllllllllllllllllll") - order = order_case_branc_to(node.cases,self.to) - valid = valid_case(self.table,order) - print(valid) + new_cases, valid = return_list_valid_case(node, self.to, self.table) + print(new_cases) print("lolllllllllllllllllllllllllllllll") - #list, valid = return_list_valid_case(node,self.to,self.table) name = self.scope.add_new_local(node.expr.computed_type.name) var = CILVariableNode(name) @@ -263,14 +261,11 @@ def visit(self, node): self.scope.instructions.append(CILAssignNode(CILVariableNode(name_type_expr), expr_type_of)) name_return = self.scope.add_new_local(node.computed_type.name) - return_ = CILVariableNode(name_return) - - #for case, index in zip(node.cases,range(0, len(node.cases))): - # if index != 0: - # self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index-1}')) - - #case_expr_type_of = CILTypeConstantNode(case.type) + return_ = CILVariableNode(name_return) + keys = [ key.type for key in node.cases ] index = 0 + expr = {} + #aqui agrego las ramas originales for case in node.cases: name_var_condition = self.scope.add_new_local(None) var_condition = CILVariableNode(name_var_condition) @@ -280,44 +275,59 @@ def visit(self, node): case_expr_type_of = CILTypeConstantNode(case.type) self.scope.instructions.append(CILAssignNode(var_condition, CILNotEqualsNode(CILVariableNode(name_type_expr),case_expr_type_of))) - expr_attr = self.visit(case) - - if index == len(node.cases) - 1: + if index == len(node.cases) - 1 and len(new_cases) == 0 : self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'case_end{self.scope.case_count}'))) else: self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'branch_{self.scope.case_count}_{index}'))) - + #aqui hay problema porque dentro del visit que llama al metodo que esta despues de este se crea un nuevo scope + #las nuevaslocales estan all_locals + expr_attr = self.visit(case) + expr[case.type] = expr_attr self.scope.instructions.append(CILAssignNode(return_, expr_attr)) - self.scope.instructions.append(CILGotoNode(CILLabelNode(f'case_end{self.scope.case_count}'))) index += 1 - # for new_branch in s : - # print("lolllllllllllllllllllllllllllllll") - # print(new_branch) - # try: - # if new_branch not in keys and new_branch in valid[case.type]: - # print("entrooooo") - # print(new_branch) - # case_expr_type_of = CILTypeConstantNode(new_branch) - # self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index-1}')) - # index +=1 - # list.remove(new_branch) - # if index == len(node.cases) - 1: - # self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'case_end{self.scope.case_count}'))) - # else: - # self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'branch_{self.scope.case_count}_{index}'))) - # self.scope.instructions.append(CILAssignNode(return_, expr_attr)) - # self.scope.instructions.append(CILGotoNode(CILLabelNode(f'case_end{self.scope.case_count}'))) - # except : - # pass - #self.scope.instructions.append(CILAssignNode(return_,CILExceptionNode("Exception in case "))) + artific = False + type = [] + for (new_branch,i) in new_cases : + for name,j in zip(keys,range(0,len(keys))): + try: + can_ = False + try: + type.index(new_branch) + except: + can_= True + + if can_ and new_branch not in keys and (new_branch,i) in valid[name]: + type.append(new_branch) + artific =True + self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index-1}')) + case_expr_type_of = CILTypeConstantNode(new_branch) + self.scope.instructions.append(CILAssignNode(var_condition, CILNotEqualsNode(CILVariableNode(name_type_expr),case_expr_type_of))) + if index == (len(node.cases) + len(new_cases)) : + self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'case_end{self.scope.case_count}'))) + else: + self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'branch_{self.scope.case_count}_{index}'))) + self.scope.instructions.append(CILAssignNode(CILVariableNode(self.scope.aux_lo[j]), self.expression_var_case)) + self.scope.instructions.append(CILAssignNode(return_, expr[name])) + self.scope.instructions.append(CILGotoNode(CILLabelNode(f'case_end{self.scope.case_count}'))) + index +=1 + except : + pass + + if artific: + index-=1 + self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index}')) + self.scope.instructions.append(CILAssignNode(return_,CILExceptionNode("Errorrr"))) + self.scope.instructions.append(CILGotoNode(CILLabelNode(f'case_end{self.scope.case_count}'))) self.scope.instructions.append(CILLabelNode(f'case_end{ self.scope.case_count}')) self.scope.case_count += 1 return return_ + #self.scope.instructions.append(CILAssignNode(return_,CILExceptionNode("Exception in case "))) @visitor.when(CaseAttrNode) def visit(self, node): self.scope.locals.append({}) local = self.scope.add_local(node.id, node.type) + self.scope.aux_lo.append(local) self.scope.instructions.append(CILAssignNode(CILVariableNode(local), self.expression_var_case)) expression_branch = self.visit(node.expr) @@ -455,3 +465,27 @@ def visit(self, node): name = self.scope.add_new_local(node.lex) self.scope.instructions.append(CILAssignNode(CILVariableNode(name), CILVCallNode(node.lex, f"Init_{node.lex}"))) return CILVariableNode(name) +# for (new_branch,i) in s : +# try: +# if new_branch not in keys and (new_branch,i) in valid[case.type]: +# try: +# if type[new_branch] : +# new_cases.remove(new_branch) +# else: +# type[new_branch] = True +# new_cases.remove(new_branch) +# except: +# type[new_branch] = True +# self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index-1}')) +# case_expr_type_of = CILTypeConstantNode(new_branch) +# self.scope.instructions.append(CILAssignNode(var_condition, CILNotEqualsNode(CILVariableNode(name_type_expr),case_expr_type_of))) +# new_cases.remove((new_branch,i)) +# if index == len(node.cases) - 1 and len(s) == 0 : +# self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'case_end{self.scope.case_count}'))) +# else: +# self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'branch_{self.scope.case_count}_{index}'))) +# self.scope.instructions.append(CILAssignNode(return_, expr_attr)) +# self.scope.instructions.append(CILGotoNode(CILLabelNode(f'case_end{self.scope.case_count}'))) +# index +=1 +# except : +# pass \ No newline at end of file diff --git a/src/code_generator/utils.py b/src/code_generator/utils.py index f5f75f6d7..d751c5f9f 100644 --- a/src/code_generator/utils.py +++ b/src/code_generator/utils.py @@ -290,6 +290,7 @@ def valid_case (table, branchs): valid[key] = [m] return valid + def return_list_valid_case(node, to, table ): order = order_case_branc_to(node.cases,to) valid = valid_case(table,order) @@ -297,7 +298,8 @@ def return_list_valid_case(node, to, table ): iterator = chain(*s) l = list(iterator) m = list(OrderedDict.fromkeys(l)) - return m, valid + new_cases = sorted(m, key=lambda tu : tu[1]) + return new_cases, valid From 4f924da63c2529142f82d755175fc96b205dbab7 Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Tue, 1 Mar 2022 02:48:56 -0500 Subject: [PATCH 67/81] Fixed Case expression code generation --- src/code_generator/generate_ast.py | 214 +- src/code_generator/utils.py | 17 +- src/cool.py | 2 +- src/program.cl | 615 +- src/program.mips | 13165 +++++++++++++++++++-------- 5 files changed, 9723 insertions(+), 4290 deletions(-) diff --git a/src/code_generator/generate_ast.py b/src/code_generator/generate_ast.py index 0091a03d6..57677a247 100644 --- a/src/code_generator/generate_ast.py +++ b/src/code_generator/generate_ast.py @@ -35,8 +35,9 @@ def visit(self, node): self.scope.data.append(CILDataNode(f'str_empty', "\"\"")) table_ = bfs_init(self.scope.context) self.table = table(table_) - types_ts = get_ts(self.scope.context) - self.to = types_ts + types_ts, types_heirs = get_ts(self.scope.context) + self.types_ts = types_ts + self.types_heirs = types_heirs infos = self.scope.infos = {} for type in types_ts: t = TypeInfo() @@ -241,93 +242,156 @@ def visit(self, node): self.scope.instructions.append(CILLabelNode(f'pool_{count}')) return var_return - + + + @visitor.when(CaseNode) def visit(self, node): - self.scope.aux_lo = [] - expr = self.visit(node.expr) + expr = self.visit(node.expr) # the code for computing the expression is generated self.expression_var_case = expr - print("lolllllllllllllllllllllllllllllll") - new_cases, valid = return_list_valid_case(node, self.to, self.table) - print(new_cases) - print("lolllllllllllllllllllllllllllllll") - name = self.scope.add_new_local(node.expr.computed_type.name) - var = CILVariableNode(name) + expr_var_name = self.scope.add_new_local(node.expr.computed_type.name) + expr_var = CILVariableNode(expr_var_name) + self.scope.instructions.append(CILAssignNode(expr_var, expr)) + expr_type_of = CILTypeOfNode(expr_var) + name_type_expr = self.scope.add_new_local(node.expr.computed_type.name) + type_expr_var = CILVariableNode(name_type_expr) + self.scope.instructions.append(CILAssignNode(type_expr_var,expr_type_of)) + # until here we have + # t0 = expr + # t1 = TYPEOF t0 + name_type_comp = self.scope.add_new_local('Bool') + type_comp_var = CILVariableNode(name_type_comp) + + + # use the topological sort computed in the ProgramNode to sort the types of the branches of the case + print(self.types_heirs) + types_ts_pos = { type.name : i for i, type in enumerate(self.types_ts) } + case_types = [case.type for case in node.cases] + case_types = sorted(case_types, key=lambda t: types_ts_pos[t], reverse=True) + least_ancestor = {} + case_labels = {} + for type in case_types: + least_ancestor[type] = type + case_labels[type] = CILLabelNode(f'case_{self.scope.case_count}_{type}') + try: + queue = self.types_heirs[type].copy() # place the children class + except KeyError: # last type in a branch of the Type Tree + queue = None + while queue: # travel to all descendants + descendant = queue.pop() + try: + # this type was visited by a type that is later in + # the topological order so is more close to the type in the class hierarchy + least_ancestor[descendant] + continue + except KeyError: + least_ancestor[descendant] = type + try: + queue = self.types_heirs[descendant] + queue + except KeyError: + pass + for type, lancestor in least_ancestor.items(): + self.scope.instructions.append(CILAssignNode(type_comp_var, CILEqualsNode(type_expr_var, CILTypeConstantNode(type)))) + self.scope.instructions.append(CILIfGotoNode(type_comp_var, case_labels[lancestor])) + + result_name = self.scope.add_new_local(node.computed_type.name) + var_result = CILVariableNode(result_name) + # first generate the instrcutions of the labels to get the CILLabelNodes to use + for case in node.cases: + self.scope.instructions.append(case_labels[case.type]) + branch_expr = self.visit(case) + self.scope.instructions.append(CILAssignNode(var_result, branch_expr)) + self.scope.instructions.append(CILGotoNode(CILLabelNode(f'case_{self.scope.case_count}_end'))) + self.scope.instructions.append(CILLabelNode(f'case_{self.scope.case_count}_end')) + self.scope.case_count += 1 + return var_result + + + # @visitor.when(CaseNode) + # def visit(self, node): + # self.scope.aux_lo = [] + # expr = self.visit(node.expr) + # self.expression_var_case = expr + # print("lolllllllllllllllllllllllllllllll") + # new_cases, valid = return_list_valid_case(node, self.to, self.table) + # print(new_cases) + # print("lolllllllllllllllllllllllllllllll") + # name = self.scope.add_new_local(node.expr.computed_type.name) + # var = CILVariableNode(name) - self.scope.instructions.append(CILAssignNode(var, expr)) + # self.scope.instructions.append(CILAssignNode(var, expr)) - expr_type_of = CILTypeOfNode(var) - name_type_expr = self.scope.add_new_local(node.expr.computed_type.name) - self.scope.instructions.append(CILAssignNode(CILVariableNode(name_type_expr), expr_type_of)) + # expr_type_of = CILTypeOfNode(var) + # name_type_expr = self.scope.add_new_local(node.expr.computed_type.name) + # self.scope.instructions.append(CILAssignNode(CILVariableNode(name_type_expr), expr_type_of)) - name_return = self.scope.add_new_local(node.computed_type.name) - return_ = CILVariableNode(name_return) - keys = [ key.type for key in node.cases ] - index = 0 - expr = {} - #aqui agrego las ramas originales - for case in node.cases: - name_var_condition = self.scope.add_new_local(None) - var_condition = CILVariableNode(name_var_condition) + # name_return = self.scope.add_new_local(node.computed_type.name) + # return_ = CILVariableNode(name_return) + # keys = [ key.type for key in node.cases ] + # index = 0 + # expr = {} + # #aqui agrego las ramas originales + # for case in node.cases: + # name_var_condition = self.scope.add_new_local(None) + # var_condition = CILVariableNode(name_var_condition) - if index != 0: - self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index - 1}')) - case_expr_type_of = CILTypeConstantNode(case.type) - self.scope.instructions.append(CILAssignNode(var_condition, CILNotEqualsNode(CILVariableNode(name_type_expr),case_expr_type_of))) + # if index != 0: + # self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index - 1}')) + # case_expr_type_of = CILTypeConstantNode(case.type) + # self.scope.instructions.append(CILAssignNode(var_condition, CILNotEqualsNode(CILVariableNode(name_type_expr),case_expr_type_of))) - if index == len(node.cases) - 1 and len(new_cases) == 0 : - self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'case_end{self.scope.case_count}'))) - else: - self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'branch_{self.scope.case_count}_{index}'))) - #aqui hay problema porque dentro del visit que llama al metodo que esta despues de este se crea un nuevo scope - #las nuevaslocales estan all_locals - expr_attr = self.visit(case) - expr[case.type] = expr_attr - self.scope.instructions.append(CILAssignNode(return_, expr_attr)) - index += 1 - artific = False - type = [] - for (new_branch,i) in new_cases : - for name,j in zip(keys,range(0,len(keys))): - try: - can_ = False - try: - type.index(new_branch) - except: - can_= True + # if index == len(node.cases) - 1 and len(new_cases) == 0 : + # self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'case_end{self.scope.case_count}'))) + # else: + # self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'branch_{self.scope.case_count}_{index}'))) + # #aqui hay problema porque dentro del visit que llama al metodo que esta despues de este se crea un nuevo scope + # #las nuevaslocales estan all_locals + # expr_attr = self.visit(case) + # expr[case.type] = expr_attr + # self.scope.instructions.append(CILAssignNode(return_, expr_attr)) + # index += 1 + # artific = False + # type = [] + # for (new_branch,i) in new_cases : + # for name,j in zip(keys,range(0,len(keys))): + # try: + # can_ = False + # try: + # type.index(new_branch) + # except: + # can_= True - if can_ and new_branch not in keys and (new_branch,i) in valid[name]: - type.append(new_branch) - artific =True - self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index-1}')) - case_expr_type_of = CILTypeConstantNode(new_branch) - self.scope.instructions.append(CILAssignNode(var_condition, CILNotEqualsNode(CILVariableNode(name_type_expr),case_expr_type_of))) - if index == (len(node.cases) + len(new_cases)) : - self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'case_end{self.scope.case_count}'))) - else: - self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'branch_{self.scope.case_count}_{index}'))) - self.scope.instructions.append(CILAssignNode(CILVariableNode(self.scope.aux_lo[j]), self.expression_var_case)) - self.scope.instructions.append(CILAssignNode(return_, expr[name])) - self.scope.instructions.append(CILGotoNode(CILLabelNode(f'case_end{self.scope.case_count}'))) - index +=1 - except : - pass + # if can_ and new_branch not in keys and (new_branch,i) in valid[name]: + # type.append(new_branch) + # artific =True + # self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index-1}')) + # case_expr_type_of = CILTypeConstantNode(new_branch) + # self.scope.instructions.append(CILAssignNode(var_condition, CILNotEqualsNode(CILVariableNode(name_type_expr),case_expr_type_of))) + # if index == (len(node.cases) + len(new_cases)) : + # self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'case_end{self.scope.case_count}'))) + # else: + # self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'branch_{self.scope.case_count}_{index}'))) + # self.scope.instructions.append(CILAssignNode(CILVariableNode(self.scope.aux_lo[j]), self.expression_var_case)) + # self.scope.instructions.append(CILAssignNode(return_, expr[name])) + # self.scope.instructions.append(CILGotoNode(CILLabelNode(f'case_end{self.scope.case_count}'))) + # index +=1 + # except : + # pass - if artific: - index-=1 - self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index}')) - self.scope.instructions.append(CILAssignNode(return_,CILExceptionNode("Errorrr"))) - self.scope.instructions.append(CILGotoNode(CILLabelNode(f'case_end{self.scope.case_count}'))) - self.scope.instructions.append(CILLabelNode(f'case_end{ self.scope.case_count}')) - self.scope.case_count += 1 - return return_ - #self.scope.instructions.append(CILAssignNode(return_,CILExceptionNode("Exception in case "))) + # if artific: + # index-=1 + # self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index}')) + # self.scope.instructions.append(CILAssignNode(return_,CILExceptionNode("Errorrr"))) + # self.scope.instructions.append(CILGotoNode(CILLabelNode(f'case_end{self.scope.case_count}'))) + # self.scope.instructions.append(CILLabelNode(f'case_end{ self.scope.case_count}')) + # self.scope.case_count += 1 + # return return_ + # #self.scope.instructions.append(CILAssignNode(return_,CILExceptionNode("Exception in case "))) @visitor.when(CaseAttrNode) def visit(self, node): self.scope.locals.append({}) local = self.scope.add_local(node.id, node.type) - self.scope.aux_lo.append(local) self.scope.instructions.append(CILAssignNode(CILVariableNode(local), self.expression_var_case)) expression_branch = self.visit(node.expr) @@ -488,4 +552,4 @@ def visit(self, node): # self.scope.instructions.append(CILGotoNode(CILLabelNode(f'case_end{self.scope.case_count}'))) # index +=1 # except : -# pass \ No newline at end of file +# pass diff --git a/src/code_generator/utils.py b/src/code_generator/utils.py index d751c5f9f..629b2ba4d 100644 --- a/src/code_generator/utils.py +++ b/src/code_generator/utils.py @@ -197,17 +197,24 @@ def __repr__(self): def get_ts(context): list = [] + heirs = {} visited = [] for c in context.types.values(): if c not in visited: - dfs_visit_ts(context, c, list, visited) - return list + dfs_visit_ts(context, c, list,heirs, visited) + return list, heirs -def dfs_visit_ts(context, u, list, visited): +def dfs_visit_ts(context, u, list, heirs, visited): visited.append(u) - if u.parent is not None and u.parent not in visited: - dfs_visit_ts(context, u.parent, list, visited) + if u.parent is not None: + try: + heirs[u.parent.name].append(u.name) + except KeyError: + heirs[u.parent.name] = [u.name] + + if u.parent not in visited: + dfs_visit_ts(context, u.parent, list, heirs, visited) list.append(u) diff --git a/src/cool.py b/src/cool.py index dc164ddc5..b6529d0be 100644 --- a/src/cool.py +++ b/src/cool.py @@ -48,7 +48,7 @@ cil_generator = CIL(context) cil = cil_generator.visit(ast) -print(cil) +#print(cil) cil_codegen = CILCodegen() code = cil_codegen.visit(cil) with open(f'output.cil', 'w') as f: diff --git a/src/program.cl b/src/program.cl index 8e511358c..af5951cf7 100644 --- a/src/program.cl +++ b/src/program.cl @@ -1,291 +1,158 @@ (* - * Cool program reading descriptions of weighted directed graphs - * from stdin. It builds up a graph objects with a list of vertices - * and a list of edges. Every vertice has a list of outgoing edges. + * A contribution from Anne Sheets (sheets@cory) * - * INPUT FORMAT - * Every line has the form vertice successor* - * Where vertice is an int, and successor is vertice,weight - * - * An empty line or EOF terminates the input. - * - * The list of vertices and the edge list is printed out by the Main - * class. - * - * TEST - * Once compiled, the file g1.graph can be fed to the program. - * The output should look like this: - -nautilus.CS.Berkeley.EDU 53# spim -file graph.s out_string("Class type is now A\n"); + b : B => out_string("Class type is now B\n"); + c : C => out_string("Class type is now C\n"); + d : D => out_string("Class type is now D\n"); + e : E => out_string("Class type is now E\n"); + o : Object => out_string("Oooops\n"); + esac + }; + + print(var : A) : IO { + (let z : A2I <- new A2I in + { + out_string(z.i2a(var.value())); + out_string(" "); + } + ) + }; - or(b1 : Bool, b2 : Bool) : Bool { - if b1 then true else b2 fi - }; + main() : Object { + { + avar <- (new A); + while flag loop + { + -- avar <- (new A).set_var(get_int()); + out_string("number "); + print(avar); + if is_even(avar.value()) then + out_string("is even!\n") + else + out_string("is odd!\n") + fi; + -- print(avar); -- prints out answer + class_type(avar); + char <- menu(); + if char = "a" then -- add + { + a_var <- (new A).set_var(get_int()); + avar <- (new B).method2(avar.value(), a_var.value()); + } else + if char = "b" then -- negate + case avar of + c : C => avar <- c.method6(c.value()); + a : A => avar <- a.method3(a.value()); + o : Object => { + out_string("Oooops\n"); + abort(); 0; + }; + esac else + if char = "c" then -- diff + { + a_var <- (new A).set_var(get_int()); + avar <- (new D).method4(avar.value(), a_var.value()); + } else + if char = "d" then avar <- (new C)@A.method5(avar.value()) else + -- factorial + if char = "e" then avar <- (new C)@B.method5(avar.value()) else + -- square + if char = "f" then avar <- (new C)@C.method5(avar.value()) else + -- cube + if char = "g" then -- multiple of 3? + if ((new D).method7(avar.value())) + then -- avar <- (new A).method1(avar.value()) + { + out_string("number "); + print(avar); + out_string("is divisible by 3.\n"); + } + else -- avar <- (new A).set_var(0) + { + out_string("number "); + print(avar); + out_string("is not divisible by 3.\n"); + } + fi else + if char = "h" then + (let x : A in + { + x <- (new E).method6(avar.value()); + (let r : Int <- (avar.value() - (x.value() * 8)) in + { + out_string("number "); + print(avar); + out_string("is equal to "); + print(x); + out_string("times 8 with a remainder of "); + (let a : A2I <- new A2I in + { + out_string(a.i2a(r)); + out_string("\n"); + } + ); -- end let a: + } + ); -- end let r: + avar <- x; + } + ) -- end let x: + else + if char = "j" then avar <- (new A) + else + if char = "q" then flag <- false + else + avar <- (new A).method1(avar.value()) -- divide/8 + fi fi fi fi fi fi fi fi fi fi; + } + pool; + } + }; }; + diff --git a/src/program.mips b/src/program.mips index 6d839418f..0c28d4d0a 100644 --- a/src/program.mips +++ b/src/program.mips @@ -3,64 +3,46 @@ type: .word 8 .data -_Graph: .asciiz "Graph\n" +_A: .asciiz "A\n" .data .align 4 -Graph: .word 12 _Graph Init_Graph abort_Object type_name_Object copy_Object add_vertice_Graph print_E_Graph print_V_Graph +A: .word 8 _A Init_A abort_Object type_name_Object copy_Object value_A set_var_A method1_A method2_A method3_A method4_A method5_A .data -_Vertice: .asciiz "Vertice\n" +_B: .asciiz "B\n" .data .align 4 -Vertice: .word 12 _Vertice Init_Vertice abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO outgoing_Vertice number_Vertice init_Vertice add_out_Vertice print_Vertice +B: .word 8 _B Init_B abort_Object type_name_Object copy_Object value_A set_var_A method1_A method2_A method3_A method4_A method5_B .data -_Edge: .asciiz "Edge\n" +_C: .asciiz "C\n" .data .align 4 -Edge: .word 16 _Edge Init_Edge abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO init_Edge print_Edge +C: .word 8 _C Init_C abort_Object type_name_Object copy_Object value_A set_var_A method1_A method2_A method3_A method4_A method5_C method6_C .data -_EList: .asciiz "EList\n" +_D: .asciiz "D\n" .data .align 4 -EList: .word 8 _EList Init_EList abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO isNil_EList head_EList tail_EList cons_EList append_EList print_EList +D: .word 8 _D Init_D abort_Object type_name_Object copy_Object value_A set_var_A method1_A method2_A method3_A method4_A method5_B method7_D .data -_ECons: .asciiz "ECons\n" +_E: .asciiz "E\n" .data .align 4 -ECons: .word 12 _ECons Init_ECons abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO isNil_ECons head_ECons tail_ECons cons_EList append_EList print_ECons init_ECons +E: .word 8 _E Init_E abort_Object type_name_Object copy_Object value_A set_var_A method1_A method2_A method3_A method4_A method5_B method7_D method6_E .data -_VList: .asciiz "VList\n" +_A2I: .asciiz "A2I\n" .data .align 4 -VList: .word 8 _VList Init_VList abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO isNil_VList head_VList tail_VList cons_VList print_VList - - .data -_VCons: .asciiz "VCons\n" - .data - .align 4 -VCons: .word 12 _VCons Init_VCons abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO isNil_VCons head_VCons tail_VCons cons_VList print_VCons init_VCons - - .data -_Parse: .asciiz "Parse\n" - .data - .align 4 -Parse: .word 12 _Parse Init_Parse abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO read_input_Parse parse_line_Parse c2i_Parse a2i_Parse a2i_aux_Parse +A2I: .word 4 _A2I Init_A2I abort_Object type_name_Object copy_Object c2i_A2I i2c_A2I a2i_A2I a2i_aux_A2I i2a_A2I i2a_aux_A2I .data _Main: .asciiz "Main\n" .data .align 4 -Main: .word 16 _Main Init_Main abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO read_input_Parse parse_line_Parse c2i_Parse a2i_Parse a2i_aux_Parse main_Main - - .data -_BoolOp: .asciiz "BoolOp\n" - .data - .align 4 -BoolOp: .word 4 _BoolOp Init_BoolOp abort_Object type_name_Object copy_Object and_BoolOp or_BoolOp +Main: .word 20 _Main Init_Main abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO menu_Main prompt_Main get_int_Main is_even_Main class_type_Main print_Main main_Main .data _Object: .asciiz "Object\n" @@ -100,73 +82,229 @@ IO_Buffer : .space 1001 str_empty: .asciiz "" .data -str_0: .asciiz " (" +str_0: .asciiz "0" + + .data +str_1: .asciiz "1" + + .data +str_2: .asciiz "2" + + .data +str_3: .asciiz "3" + + .data +str_4: .asciiz "4" + + .data +str_5: .asciiz "5" + + .data +str_6: .asciiz "6" + + .data +str_7: .asciiz "7" + + .data +str_8: .asciiz "8" + + .data +str_9: .asciiz "9" + + .data +str_10: .asciiz "" + + .data +str_11: .asciiz "9" + + .data +str_12: .asciiz "8" + + .data +str_13: .asciiz "7" + + .data +str_14: .asciiz "6" + + .data +str_15: .asciiz "5" + + .data +str_16: .asciiz "4" + + .data +str_17: .asciiz "3" + + .data +str_18: .asciiz "2" + + .data +str_19: .asciiz "1" + + .data +str_20: .asciiz "0" + + .data +str_21: .asciiz "-" + + .data +str_22: .asciiz "+" + + .data +str_23: .asciiz "-" + + .data +str_24: .asciiz "0" + + .data +str_25: .asciiz "" + + .data +str_26: .asciiz "\n\tTo add a number to " .data -str_1: .asciiz "," +str_27: .asciiz "...enter a:\n" .data -str_2: .asciiz ")" +str_28: .asciiz "\tTo negate " .data -str_3: .asciiz "\n" +str_29: .asciiz "...enter b:\n" .data -str_4: .asciiz "\n" +str_30: .asciiz "\tTo find the difference between " .data -str_5: .asciiz "\n" +str_31: .asciiz "and another number...enter c:\n" .data -str_6: .asciiz "" +str_32: .asciiz "\tTo find the factorial of " .data -str_7: .asciiz "0" +str_33: .asciiz "...enter d:\n" .data -str_8: .asciiz "1" +str_34: .asciiz "\tTo square " .data -str_9: .asciiz "2" +str_35: .asciiz "...enter e:\n" .data -str_10: .asciiz "3" +str_36: .asciiz "\tTo cube " .data -str_11: .asciiz "4" +str_37: .asciiz "...enter f:\n" .data -str_12: .asciiz "5" +str_38: .asciiz "\tTo find out if " .data -str_13: .asciiz "6" +str_39: .asciiz "is a multiple of 3...enter g:\n" .data -str_14: .asciiz "7" +str_40: .asciiz "\tTo divide " .data -str_15: .asciiz "8" +str_41: .asciiz "by 8...enter h:\n" .data -str_16: .asciiz "9" +str_42: .asciiz "\tTo get a new number...enter j:\n" .data -str_17: .asciiz "-" +str_43: .asciiz "\tTo quit...enter q:\n\n" .data -str_18: .asciiz " " +str_44: .asciiz "\n" .data -str_19: .asciiz " " +str_45: .asciiz "Please enter a number... " .data -str_20: .asciiz "," +str_46: .asciiz "Class type is now A\n" .data -str_21: .asciiz "" +str_47: .asciiz "Class type is now B\n" .data -str_22: .asciiz "" +str_48: .asciiz "Class type is now C\n" + + .data +str_49: .asciiz "Class type is now D\n" + + .data +str_50: .asciiz "Class type is now E\n" + + .data +str_51: .asciiz "Oooops\n" + + .data +str_52: .asciiz " " + + .data +str_53: .asciiz "number " + + .data +str_54: .asciiz "is odd!\n" + + .data +str_55: .asciiz "is even!\n" + + .data +str_56: .asciiz "a" + + .data +str_57: .asciiz "b" + + .data +str_58: .asciiz "c" + + .data +str_59: .asciiz "d" + + .data +str_60: .asciiz "e" + + .data +str_61: .asciiz "f" + + .data +str_62: .asciiz "g" + + .data +str_63: .asciiz "h" + + .data +str_64: .asciiz "j" + + .data +str_65: .asciiz "q" + + .data +str_66: .asciiz "number " + + .data +str_67: .asciiz "is equal to " + + .data +str_68: .asciiz "times 8 with a remainder of " + + .data +str_69: .asciiz "\n" + + .data +str_70: .asciiz "number " + + .data +str_71: .asciiz "is not divisible by 3.\n" + + .data +str_72: .asciiz "number " + + .data +str_73: .asciiz "is divisible by 3.\n" + + .data +str_74: .asciiz "Oooops\n" .text main: @@ -184,7 +322,7 @@ main: subu $sp $sp 12 # assign (add here the expr.to_string) to m0 - li $a0, 16 + li $a0, 20 li $v0, 9 syscall la $a0, Main @@ -219,7 +357,7 @@ main: #load the variable m1 lw $v0, -4($fp) lw $t0, 0($v0) - lw $v1, 60($t0) + lw $v1, 64($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -246,7 +384,7 @@ main: syscall .text -add_vertice_Graph: +value_A: # save the return address and frame pointer # push $ra to the stack sw $ra, 0($sp) @@ -258,141 +396,69 @@ add_vertice_Graph: # update the frame pointer and allocate the frame in the stack move $fp $sp - subu $sp $sp 44 + subu $sp $sp 8 - # assign (add here the expr.to_string) to t_5 - #load the variable v_4 - lw $v0, 12($fp) + # assign (add here the expr.to_string) to t_0 + lw $v1, 12($fp) + lw $v0, 4($v1) sw $v0, -0($fp) + # assign (add here the expr.to_string) to t_1 + #load the variable t_0 lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_6 - # calling the method outgoing of type Vertice - #load the variable t_5 - lw $v0, -0($fp) - lw $t0, 0($v0) - lw $v1, 40($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - sw $v0, -4($fp) - # assign (add here the expr.to_string) to t_7 - #load the variable t_6 + # return the value of the function in the register $v0 + #load the variable t_1 lw $v0, -4($fp) - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to t_8 - lw $v1, 16($fp) - lw $v0, 8($v1) - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_9 - #load the variable t_8 - lw $v0, -12($fp) - sw $v0, -16($fp) - - lw $v0, -8($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 + move $v0, $v0 - # assign (add here the expr.to_string) to t_10 - # calling the method append of type EList - #load the variable t_7 - lw $v0, -8($fp) - lw $t0, 0($v0) - lw $v1, 56($t0) - jal $v1 - # pop the top of the stack to $v1 + # restore the stack pointer, frame pointer y return address + addu $sp $sp 8 + # pop the top of the stack to $fp addi $sp $sp 4 - lw $v1, 0($sp) + lw $fp, 0($sp) - # pop the top of the stack to $v1 + # pop the top of the stack to $ra addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -20($fp) - - # Setting value of the attribute edges in the instance self_Graph to t_10 - #load the variable t_10 - lw $v0, -20($fp) - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 8($v1) - - # assign (add here the expr.to_string) to t_11 - lw $v1, 16($fp) - lw $v0, 4($v1) - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to t_12 - #load the variable t_11 - lw $v0, -24($fp) - sw $v0, -28($fp) + lw $ra, 0($sp) - # assign (add here the expr.to_string) to t_13 - #load the variable v_4 - lw $v0, 12($fp) - sw $v0, -32($fp) + jr $ra - lw $v0, -28($fp) - # push $v0 to the stack - sw $v0, 0($sp) + .text +set_var_A: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) addi $sp $sp -4 - lw $v0, -32($fp) - # push $v0 to the stack - sw $v0, 0($sp) + # push $fp to the stack + sw $fp, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_14 - # calling the method cons of type VList - #load the variable t_12 - lw $v0, -28($fp) - lw $t0, 0($v0) - lw $v1, 52($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -36($fp) + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 4 - # Setting value of the attribute vertices in the instance self_Graph to t_14 - #load the variable t_14 - lw $v0, -36($fp) + # Setting value of the attribute var in the instance self_A to num_2 + #load the variable num_2 + lw $v0, 12($fp) move $s2, $v0 lw $v1, 16($fp) sw $s2, 4($v1) - # assign (add here the expr.to_string) to t_15 - #load the variable t_14 - lw $v0, -36($fp) - sw $v0, -40($fp) + # assign (add here the expr.to_string) to t_3 + #load the variable self_A + lw $v0, 16($fp) + sw $v0, -0($fp) # return the value of the function in the register $v0 - #load the variable t_15 - lw $v0, -40($fp) + #load the variable t_3 + lw $v0, -0($fp) move $v0, $v0 # restore the stack pointer, frame pointer y return address - addu $sp $sp 44 + addu $sp $sp 4 # pop the top of the stack to $fp addi $sp $sp 4 lw $fp, 0($sp) @@ -404,7 +470,7 @@ add_vertice_Graph: jr $ra .text -print_E_Graph: +method1_A: # save the return address and frame pointer # push $ra to the stack sw $ra, 0($sp) @@ -416,48 +482,20 @@ print_E_Graph: # update the frame pointer and allocate the frame in the stack move $fp $sp - subu $sp $sp 16 + subu $sp $sp 4 - # assign (add here the expr.to_string) to t_16 - lw $v1, 12($fp) - lw $v0, 8($v1) + # assign (add here the expr.to_string) to t_5 + #load the variable self_A + lw $v0, 16($fp) sw $v0, -0($fp) - # assign (add here the expr.to_string) to t_17 - #load the variable t_16 + # return the value of the function in the register $v0 + #load the variable t_5 lw $v0, -0($fp) - sw $v0, -4($fp) - - lw $v0, -4($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_18 - # calling the method print of type EList - #load the variable t_17 - lw $v0, -4($fp) - lw $t0, 0($v0) - lw $v1, 60($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to t_19 - #load the variable t_18 - lw $v0, -8($fp) - sw $v0, -12($fp) - - # return the value of the function in the register $v0 - #load the variable t_19 - lw $v0, -12($fp) - move $v0, $v0 + move $v0, $v0 # restore the stack pointer, frame pointer y return address - addu $sp $sp 16 + addu $sp $sp 4 # pop the top of the stack to $fp addi $sp $sp 4 lw $fp, 0($sp) @@ -469,7 +507,7 @@ print_E_Graph: jr $ra .text -print_V_Graph: +method2_A: # save the return address and frame pointer # push $ra to the stack sw $ra, 0($sp) @@ -481,48 +519,125 @@ print_V_Graph: # update the frame pointer and allocate the frame in the stack move $fp $sp - subu $sp $sp 16 + subu $sp $sp 32 + + # assign (add here the expr.to_string) to x_8 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) - # assign (add here the expr.to_string) to t_20 - lw $v1, 12($fp) - lw $v0, 4($v1) sw $v0, -0($fp) - # assign (add here the expr.to_string) to t_21 - #load the variable t_20 - lw $v0, -0($fp) + # assign (add here the expr.to_string) to t_9 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable num1_6 + lw $v0, 16($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable num2_7 + lw $v0, 12($fp) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) sw $v0, -4($fp) + # assign (add here the expr.to_string) to x_8 + #load the variable t_9 lw $v0, -4($fp) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_10 + li $a0, 8 + li $v0, 9 + syscall + la $a0, B + sw $a0, 0($v0) + sw $v0, -8($fp) + + lw $v0, -8($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_22 - # calling the method print of type VList - #load the variable t_21 - lw $v0, -4($fp) + # assign (add here the expr.to_string) to t_11 + # calling the method Init_B of type B + #load the variable t_10 + lw $v0, -8($fp) lw $t0, 0($v0) - lw $v1, 56($t0) + lw $v1, 8($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to t_23 - #load the variable t_22 - lw $v0, -8($fp) sw $v0, -12($fp) - # return the value of the function in the register $v0 - #load the variable t_23 + # assign (add here the expr.to_string) to t_12 + #load the variable t_11 lw $v0, -12($fp) + sw $v0, -16($fp) + + # assign (add here the expr.to_string) to t_13 + #load the variable x_8 + lw $v0, -0($fp) + sw $v0, -20($fp) + + lw $v0, -16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -20($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_14 + # calling the method set_var of type B + #load the variable t_12 + lw $v0, -16($fp) + lw $t0, 0($v0) + lw $v1, 28($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_15 + #load the variable t_14 + lw $v0, -24($fp) + sw $v0, -28($fp) + + # return the value of the function in the register $v0 + #load the variable t_15 + lw $v0, -28($fp) move $v0, $v0 # restore the stack pointer, frame pointer y return address - addu $sp $sp 16 + addu $sp $sp 32 # pop the top of the stack to $fp addi $sp $sp 4 lw $fp, 0($sp) @@ -534,7 +649,7 @@ print_V_Graph: jr $ra .text -Init_Graph: +method3_A: # save the return address and frame pointer # push $ra to the stack sw $ra, 0($sp) @@ -546,25 +661,79 @@ Init_Graph: # update the frame pointer and allocate the frame in the stack move $fp $sp - subu $sp $sp 16 + subu $sp $sp 36 - # assign (add here the expr.to_string) to t_0 + # assign (add here the expr.to_string) to x_17 + # Creating Int instance for atomic 0 li $a0, 8 li $v0, 9 syscall - la $a0, VList - sw $a0, 0($v0) + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + sw $v0, -0($fp) - lw $v0, -0($fp) + # assign (add here the expr.to_string) to t_18 + #load the variable num_16 + lw $v0, 12($fp) + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_19 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_18 + lw $v0, -4($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to x_17 + #load the variable t_19 + lw $v0, -8($fp) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_20 + li $a0, 8 + li $v0, 9 + syscall + la $a0, C + sw $a0, 0($v0) + sw $v0, -12($fp) + + lw $v0, -12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_1 - # calling the method Init_VList of type VList - #load the variable t_0 - lw $v0, -0($fp) + # assign (add here the expr.to_string) to t_21 + # calling the method Init_C of type C + #load the variable t_20 + lw $v0, -12($fp) lw $t0, 0($v0) lw $v1, 8($t0) jal $v1 @@ -572,55 +741,57 @@ Init_Graph: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -4($fp) + sw $v0, -16($fp) - # Setting value of the attribute vertices in the instance self_Graph to t_1 - #load the variable t_1 - lw $v0, -4($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 4($v1) + # assign (add here the expr.to_string) to t_22 + #load the variable t_21 + lw $v0, -16($fp) + sw $v0, -20($fp) - # assign (add here the expr.to_string) to t_2 - li $a0, 8 - li $v0, 9 - syscall - la $a0, EList - sw $a0, 0($v0) - sw $v0, -8($fp) + # assign (add here the expr.to_string) to t_23 + #load the variable x_17 + lw $v0, -0($fp) + sw $v0, -24($fp) - lw $v0, -8($fp) + lw $v0, -20($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_3 - # calling the method Init_EList of type EList - #load the variable t_2 - lw $v0, -8($fp) + lw $v0, -24($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_24 + # calling the method set_var of type C + #load the variable t_22 + lw $v0, -20($fp) lw $t0, 0($v0) - lw $v1, 8($t0) + lw $v1, 28($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -12($fp) + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # Setting value of the attribute edges in the instance self_Graph to t_3 - #load the variable t_3 - lw $v0, -12($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 8($v1) + sw $v0, -28($fp) + + # assign (add here the expr.to_string) to t_25 + #load the variable t_24 + lw $v0, -28($fp) + sw $v0, -32($fp) # return the value of the function in the register $v0 - #load the variable self_Graph - lw $v0, 12($fp) + #load the variable t_25 + lw $v0, -32($fp) move $v0, $v0 # restore the stack pointer, frame pointer y return address - addu $sp $sp 16 + addu $sp $sp 36 # pop the top of the stack to $fp addi $sp $sp 4 lw $fp, 0($sp) @@ -632,7 +803,7 @@ Init_Graph: jr $ra .text -outgoing_Vertice: +method4_A: # save the return address and frame pointer # push $ra to the stack sw $ra, 0($sp) @@ -644,67 +815,4921 @@ outgoing_Vertice: # update the frame pointer and allocate the frame in the stack move $fp $sp - subu $sp $sp 8 + subu $sp $sp 72 - # assign (add here the expr.to_string) to t_26 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -0($fp) + # assign (add here the expr.to_string) to t_28 + #load the variable num2_27 + lw $v0, 12($fp) + move $t1, $v0 + lw $t1, 4($t1) + # push $t1 to the stack + sw $t1, 0($sp) + addi $sp $sp -4 - # assign (add here the expr.to_string) to t_27 - #load the variable t_26 - lw $v0, -0($fp) - sw $v0, -4($fp) + #load the variable num1_26 + lw $v0, 16($fp) + # pop the top of the stack to $t1 + addi $sp $sp 4 + lw $t1, 0($sp) + + move $t2, $v0 + lw $t2, 4($t2) + slt $t3, $t1, $t2 + la $t4, Bool + li $a0, 8 + li $v0, 9 + syscall + sw $t4, 0($v0) + sw $t3, 4($v0) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_29 + #load the variable t_28 + lw $v0, -0($fp) + sw $v0, -4($fp) + + lw $t1, -4($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_0 + # assign (add here the expr.to_string) to x_31 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_32 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable num2_27 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable num1_26 + lw $v0, 16($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -16($fp) + + # assign (add here the expr.to_string) to x_31 + #load the variable t_32 + lw $v0, -16($fp) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_33 + li $a0, 8 + li $v0, 9 + syscall + la $a0, D + sw $a0, 0($v0) + sw $v0, -20($fp) + + lw $v0, -20($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_34 + # calling the method Init_D of type D + #load the variable t_33 + lw $v0, -20($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_35 + #load the variable t_34 + lw $v0, -24($fp) + sw $v0, -28($fp) + + # assign (add here the expr.to_string) to t_36 + #load the variable x_31 + lw $v0, -12($fp) + sw $v0, -32($fp) + + lw $v0, -28($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -32($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_37 + # calling the method set_var of type D + #load the variable t_35 + lw $v0, -28($fp) + lw $t0, 0($v0) + lw $v1, 28($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_30 + #load the variable t_37 + lw $v0, -36($fp) + sw $v0, -8($fp) + + j ifend_0 + then_0: + # assign (add here the expr.to_string) to x_38 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -40($fp) + + # assign (add here the expr.to_string) to t_39 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable num1_26 + lw $v0, 16($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable num2_27 + lw $v0, 12($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -44($fp) + + # assign (add here the expr.to_string) to x_38 + #load the variable t_39 + lw $v0, -44($fp) + sw $v0, -40($fp) + + # assign (add here the expr.to_string) to t_40 + li $a0, 8 + li $v0, 9 + syscall + la $a0, D + sw $a0, 0($v0) + sw $v0, -48($fp) + + lw $v0, -48($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_41 + # calling the method Init_D of type D + #load the variable t_40 + lw $v0, -48($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -52($fp) + + # assign (add here the expr.to_string) to t_42 + #load the variable t_41 + lw $v0, -52($fp) + sw $v0, -56($fp) + + # assign (add here the expr.to_string) to t_43 + #load the variable x_38 + lw $v0, -40($fp) + sw $v0, -60($fp) + + lw $v0, -56($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -60($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_44 + # calling the method set_var of type D + #load the variable t_42 + lw $v0, -56($fp) + lw $t0, 0($v0) + lw $v1, 28($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -64($fp) + + # assign (add here the expr.to_string) to t_30 + #load the variable t_44 + lw $v0, -64($fp) + sw $v0, -8($fp) + + ifend_0: + # assign (add here the expr.to_string) to t_45 + #load the variable t_30 + lw $v0, -8($fp) + sw $v0, -68($fp) + + # return the value of the function in the register $v0 + #load the variable t_45 + lw $v0, -68($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 72 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +method5_A: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 52 + + # assign (add here the expr.to_string) to x_47 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to y_48 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -4($fp) + + while_0: + # assign (add here the expr.to_string) to t_49 + #load the variable y_48 + lw $v0, -4($fp) + move $t1, $v0 + lw $t1, 4($t1) + # push $t1 to the stack + sw $t1, 0($sp) + addi $sp $sp -4 + + #load the variable num_46 + lw $v0, 12($fp) + # pop the top of the stack to $t1 + addi $sp $sp 4 + lw $t1, 0($sp) + + move $t2, $v0 + lw $t2, 4($t2) + slt $t4, $t2, $t1 + li $t3, 1 + xor $t3, $t3, $t4 + andi $t3, $t3, 0x01 + la $t4, Bool + li $a0, 8 + li $v0, 9 + syscall + sw $t4, 0($v0) + sw $t3, 4($v0) + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_50 + #load the variable t_49 + lw $v0, -8($fp) + sw $v0, -12($fp) + + lw $t1, -12($fp) + lw $t0, 4($t1) + bne $t0, $zero, body_0 + j pool_0 + body_0: + # assign (add here the expr.to_string) to t_52 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable x_47 + lw $v0, -0($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable y_48 + lw $v0, -4($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + mult $t0, $t1 + mflo $t0 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to x_47 + #load the variable t_52 + lw $v0, -20($fp) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_53 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable y_48 + lw $v0, -4($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to y_48 + #load the variable t_53 + lw $v0, -24($fp) + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_51 + #load the variable y_48 + lw $v0, -4($fp) + sw $v0, -16($fp) + + j while_0 + pool_0: + # assign (add here the expr.to_string) to t_54 + li $a0, 8 + li $v0, 9 + syscall + la $a0, E + sw $a0, 0($v0) + sw $v0, -28($fp) + + lw $v0, -28($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_55 + # calling the method Init_E of type E + #load the variable t_54 + lw $v0, -28($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -32($fp) + + # assign (add here the expr.to_string) to t_56 + #load the variable t_55 + lw $v0, -32($fp) + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_57 + #load the variable x_47 + lw $v0, -0($fp) + sw $v0, -40($fp) + + lw $v0, -36($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -40($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_58 + # calling the method set_var of type E + #load the variable t_56 + lw $v0, -36($fp) + lw $t0, 0($v0) + lw $v1, 28($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -44($fp) + + # assign (add here the expr.to_string) to t_59 + #load the variable t_58 + lw $v0, -44($fp) + sw $v0, -48($fp) + + # return the value of the function in the register $v0 + #load the variable t_59 + lw $v0, -48($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 52 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_A: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 0 + + # Setting value of the attribute var in the instance self_A to 0 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 4($v1) + + # return the value of the function in the register $v0 + #load the variable self_A + lw $v0, 12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 0 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +method5_B: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 32 + + # assign (add here the expr.to_string) to x_61 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_62 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable num_60 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable num_60 + lw $v0, 12($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + mult $t0, $t1 + mflo $t0 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to x_61 + #load the variable t_62 + lw $v0, -4($fp) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_63 + li $a0, 8 + li $v0, 9 + syscall + la $a0, E + sw $a0, 0($v0) + sw $v0, -8($fp) + + lw $v0, -8($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_64 + # calling the method Init_E of type E + #load the variable t_63 + lw $v0, -8($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_65 + #load the variable t_64 + lw $v0, -12($fp) + sw $v0, -16($fp) + + # assign (add here the expr.to_string) to t_66 + #load the variable x_61 + lw $v0, -0($fp) + sw $v0, -20($fp) + + lw $v0, -16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -20($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_67 + # calling the method set_var of type E + #load the variable t_65 + lw $v0, -16($fp) + lw $t0, 0($v0) + lw $v1, 28($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_68 + #load the variable t_67 + lw $v0, -24($fp) + sw $v0, -28($fp) + + # return the value of the function in the register $v0 + #load the variable t_68 + lw $v0, -28($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 32 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_B: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 0 + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to self_B + jal Init_A + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, 12($fp) + + # return the value of the function in the register $v0 + #load the variable self_B + lw $v0, 12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 0 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +method6_C: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 36 + + # assign (add here the expr.to_string) to x_70 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_71 + #load the variable num_69 + lw $v0, 12($fp) + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_72 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_71 + lw $v0, -4($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to x_70 + #load the variable t_72 + lw $v0, -8($fp) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_73 + li $a0, 8 + li $v0, 9 + syscall + la $a0, A + sw $a0, 0($v0) + sw $v0, -12($fp) + + lw $v0, -12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_74 + # calling the method Init_A of type A + #load the variable t_73 + lw $v0, -12($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -16($fp) + + # assign (add here the expr.to_string) to t_75 + #load the variable t_74 + lw $v0, -16($fp) + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_76 + #load the variable x_70 + lw $v0, -0($fp) + sw $v0, -24($fp) + + lw $v0, -20($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -24($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_77 + # calling the method set_var of type A + #load the variable t_75 + lw $v0, -20($fp) + lw $t0, 0($v0) + lw $v1, 28($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -28($fp) + + # assign (add here the expr.to_string) to t_78 + #load the variable t_77 + lw $v0, -28($fp) + sw $v0, -32($fp) + + # return the value of the function in the register $v0 + #load the variable t_78 + lw $v0, -32($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 36 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +method5_C: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 36 + + # assign (add here the expr.to_string) to x_80 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_81 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable num_79 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable num_79 + lw $v0, 12($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + mult $t0, $t1 + mflo $t0 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_82 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_81 + lw $v0, -4($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable num_79 + lw $v0, 12($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + mult $t0, $t1 + mflo $t0 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to x_80 + #load the variable t_82 + lw $v0, -8($fp) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_83 + li $a0, 8 + li $v0, 9 + syscall + la $a0, E + sw $a0, 0($v0) + sw $v0, -12($fp) + + lw $v0, -12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_84 + # calling the method Init_E of type E + #load the variable t_83 + lw $v0, -12($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -16($fp) + + # assign (add here the expr.to_string) to t_85 + #load the variable t_84 + lw $v0, -16($fp) + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_86 + #load the variable x_80 + lw $v0, -0($fp) + sw $v0, -24($fp) + + lw $v0, -20($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -24($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_87 + # calling the method set_var of type E + #load the variable t_85 + lw $v0, -20($fp) + lw $t0, 0($v0) + lw $v1, 28($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -28($fp) + + # assign (add here the expr.to_string) to t_88 + #load the variable t_87 + lw $v0, -28($fp) + sw $v0, -32($fp) + + # return the value of the function in the register $v0 + #load the variable t_88 + lw $v0, -32($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 36 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_C: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 0 + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to self_C + jal Init_B + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, 12($fp) + + # return the value of the function in the register $v0 + #load the variable self_C + lw $v0, 12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 0 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +method7_D: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 96 + + # assign (add here the expr.to_string) to x_90 + #load the variable num_89 + lw $v0, 12($fp) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_91 + #load the variable x_90 + lw $v0, -0($fp) + move $t1, $v0 + lw $t1, 4($t1) + # push $t1 to the stack + sw $t1, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # pop the top of the stack to $t1 + addi $sp $sp 4 + lw $t1, 0($sp) + + move $t2, $v0 + lw $t2, 4($t2) + slt $t3, $t1, $t2 + la $t4, Bool + li $a0, 8 + li $v0, 9 + syscall + sw $t4, 0($v0) + sw $t3, 4($v0) + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_92 + #load the variable t_91 + lw $v0, -4($fp) + sw $v0, -8($fp) + + lw $t1, -8($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_1 + # assign (add here the expr.to_string) to t_94 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable x_90 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -16($fp) + + # assign (add here the expr.to_string) to t_95 + #load the variable t_94 + lw $v0, -16($fp) + sw $v0, -20($fp) + + lw $t1, -20($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_2 + # assign (add here the expr.to_string) to t_97 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable x_90 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -28($fp) + + # assign (add here the expr.to_string) to t_98 + #load the variable t_97 + lw $v0, -28($fp) + sw $v0, -32($fp) + + lw $t1, -32($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_3 + # assign (add here the expr.to_string) to t_100 + # Creating Int instance for atomic 2 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 2 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable x_90 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -40($fp) + + # assign (add here the expr.to_string) to t_101 + #load the variable t_100 + lw $v0, -40($fp) + sw $v0, -44($fp) + + lw $t1, -44($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_4 + # assign (add here the expr.to_string) to t_103 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable x_90 + lw $v0, -0($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 3 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 3 + sw $t0, 0($v0) + sw $t1, 4($v0) + + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -52($fp) + + # assign (add here the expr.to_string) to t_104 + #load the variable t_103 + lw $v0, -52($fp) + sw $v0, -56($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -56($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_105 + # calling the method method7 of type D + #load the variable self_D + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 52($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -60($fp) + + # assign (add here the expr.to_string) to t_102 + #load the variable t_105 + lw $v0, -60($fp) + sw $v0, -48($fp) + + j ifend_4 + then_4: + # assign (add here the expr.to_string) to t_106 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -64($fp) + + # assign (add here the expr.to_string) to t_102 + #load the variable t_106 + lw $v0, -64($fp) + sw $v0, -48($fp) + + ifend_4: + # assign (add here the expr.to_string) to t_99 + #load the variable t_102 + lw $v0, -48($fp) + sw $v0, -36($fp) + + j ifend_3 + then_3: + # assign (add here the expr.to_string) to t_107 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -68($fp) + + # assign (add here the expr.to_string) to t_99 + #load the variable t_107 + lw $v0, -68($fp) + sw $v0, -36($fp) + + ifend_3: + # assign (add here the expr.to_string) to t_96 + #load the variable t_99 + lw $v0, -36($fp) + sw $v0, -24($fp) + + j ifend_2 + then_2: + # assign (add here the expr.to_string) to t_108 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -72($fp) + + # assign (add here the expr.to_string) to t_96 + #load the variable t_108 + lw $v0, -72($fp) + sw $v0, -24($fp) + + ifend_2: + # assign (add here the expr.to_string) to t_93 + #load the variable t_96 + lw $v0, -24($fp) + sw $v0, -12($fp) + + j ifend_1 + then_1: + # assign (add here the expr.to_string) to t_109 + #load the variable x_90 + lw $v0, -0($fp) + sw $v0, -76($fp) + + # assign (add here the expr.to_string) to t_110 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_109 + lw $v0, -76($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -80($fp) + + # assign (add here the expr.to_string) to t_111 + #load the variable t_110 + lw $v0, -80($fp) + sw $v0, -84($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -84($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_112 + # calling the method method7 of type D + #load the variable self_D + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 52($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -88($fp) + + # assign (add here the expr.to_string) to t_93 + #load the variable t_112 + lw $v0, -88($fp) + sw $v0, -12($fp) + + ifend_1: + # assign (add here the expr.to_string) to t_113 + #load the variable t_93 + lw $v0, -12($fp) + sw $v0, -92($fp) + + # return the value of the function in the register $v0 + #load the variable t_113 + lw $v0, -92($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 96 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_D: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 0 + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to self_D + jal Init_B + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, 12($fp) + + # return the value of the function in the register $v0 + #load the variable self_D + lw $v0, 12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 0 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +method6_E: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 32 + + # assign (add here the expr.to_string) to x_115 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_116 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable num_114 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 8 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 8 + sw $t0, 0($v0) + sw $t1, 4($v0) + + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + div $t0, $t1 + mflo $t0 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to x_115 + #load the variable t_116 + lw $v0, -4($fp) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_117 + li $a0, 8 + li $v0, 9 + syscall + la $a0, A + sw $a0, 0($v0) + sw $v0, -8($fp) + + lw $v0, -8($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_118 + # calling the method Init_A of type A + #load the variable t_117 + lw $v0, -8($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_119 + #load the variable t_118 + lw $v0, -12($fp) + sw $v0, -16($fp) + + # assign (add here the expr.to_string) to t_120 + #load the variable x_115 + lw $v0, -0($fp) + sw $v0, -20($fp) + + lw $v0, -16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -20($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_121 + # calling the method set_var of type A + #load the variable t_119 + lw $v0, -16($fp) + lw $t0, 0($v0) + lw $v1, 28($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_122 + #load the variable t_121 + lw $v0, -24($fp) + sw $v0, -28($fp) + + # return the value of the function in the register $v0 + #load the variable t_122 + lw $v0, -28($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 32 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +Init_E: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 0 + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to self_E + jal Init_D + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, 12($fp) + + # return the value of the function in the register $v0 + #load the variable self_E + lw $v0, 12($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 0 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +c2i_A2I: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 168 + + # assign (add here the expr.to_string) to t_124 + #load the string str_0 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_0 + sw $v1, 4($v0) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_125 + #load the variable char_123 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_124 + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_126 + #load the variable t_125 + lw $v0, -4($fp) + sw $v0, -8($fp) + + lw $t1, -8($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_5 + # assign (add here the expr.to_string) to t_128 + #load the string str_1 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_1 + sw $v1, 4($v0) + sw $v0, -16($fp) + + # assign (add here the expr.to_string) to t_129 + #load the variable char_123 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_128 + lw $v0, -16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_130 + #load the variable t_129 + lw $v0, -20($fp) + sw $v0, -24($fp) + + lw $t1, -24($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_6 + # assign (add here the expr.to_string) to t_132 + #load the string str_2 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_2 + sw $v1, 4($v0) + sw $v0, -32($fp) + + # assign (add here the expr.to_string) to t_133 + #load the variable char_123 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_132 + lw $v0, -32($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_134 + #load the variable t_133 + lw $v0, -36($fp) + sw $v0, -40($fp) + + lw $t1, -40($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_7 + # assign (add here the expr.to_string) to t_136 + #load the string str_3 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_3 + sw $v1, 4($v0) + sw $v0, -48($fp) + + # assign (add here the expr.to_string) to t_137 + #load the variable char_123 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_136 + lw $v0, -48($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -52($fp) + + # assign (add here the expr.to_string) to t_138 + #load the variable t_137 + lw $v0, -52($fp) + sw $v0, -56($fp) + + lw $t1, -56($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_8 + # assign (add here the expr.to_string) to t_140 + #load the string str_4 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_4 + sw $v1, 4($v0) + sw $v0, -64($fp) + + # assign (add here the expr.to_string) to t_141 + #load the variable char_123 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_140 + lw $v0, -64($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -68($fp) + + # assign (add here the expr.to_string) to t_142 + #load the variable t_141 + lw $v0, -68($fp) + sw $v0, -72($fp) + + lw $t1, -72($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_9 + # assign (add here the expr.to_string) to t_144 + #load the string str_5 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_5 + sw $v1, 4($v0) + sw $v0, -80($fp) + + # assign (add here the expr.to_string) to t_145 + #load the variable char_123 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_144 + lw $v0, -80($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -84($fp) + + # assign (add here the expr.to_string) to t_146 + #load the variable t_145 + lw $v0, -84($fp) + sw $v0, -88($fp) + + lw $t1, -88($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_10 + # assign (add here the expr.to_string) to t_148 + #load the string str_6 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_6 + sw $v1, 4($v0) + sw $v0, -96($fp) + + # assign (add here the expr.to_string) to t_149 + #load the variable char_123 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_148 + lw $v0, -96($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -100($fp) + + # assign (add here the expr.to_string) to t_150 + #load the variable t_149 + lw $v0, -100($fp) + sw $v0, -104($fp) + + lw $t1, -104($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_11 + # assign (add here the expr.to_string) to t_152 + #load the string str_7 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_7 + sw $v1, 4($v0) + sw $v0, -112($fp) + + # assign (add here the expr.to_string) to t_153 + #load the variable char_123 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_152 + lw $v0, -112($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -116($fp) + + # assign (add here the expr.to_string) to t_154 + #load the variable t_153 + lw $v0, -116($fp) + sw $v0, -120($fp) + + lw $t1, -120($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_12 + # assign (add here the expr.to_string) to t_156 + #load the string str_8 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_8 + sw $v1, 4($v0) + sw $v0, -128($fp) + + # assign (add here the expr.to_string) to t_157 + #load the variable char_123 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_156 + lw $v0, -128($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -132($fp) + + # assign (add here the expr.to_string) to t_158 + #load the variable t_157 + lw $v0, -132($fp) + sw $v0, -136($fp) + + lw $t1, -136($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_13 + # assign (add here the expr.to_string) to t_160 + #load the string str_9 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_9 + sw $v1, 4($v0) + sw $v0, -144($fp) + + # assign (add here the expr.to_string) to t_161 + #load the variable char_123 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_160 + lw $v0, -144($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -148($fp) + + # assign (add here the expr.to_string) to t_162 + #load the variable t_161 + lw $v0, -148($fp) + sw $v0, -152($fp) + + lw $t1, -152($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_14 + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_164 + # calling the method abort of type A2I + #load the variable self_A2I + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 12($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -160($fp) + + # assign (add here the expr.to_string) to t_163 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -156($fp) + + j ifend_14 + then_14: + # assign (add here the expr.to_string) to t_163 + # Creating Int instance for atomic 9 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 9 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -156($fp) + + ifend_14: + # assign (add here the expr.to_string) to t_159 + #load the variable t_163 + lw $v0, -156($fp) + sw $v0, -140($fp) + + j ifend_13 + then_13: + # assign (add here the expr.to_string) to t_159 + # Creating Int instance for atomic 8 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 8 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -140($fp) + + ifend_13: + # assign (add here the expr.to_string) to t_155 + #load the variable t_159 + lw $v0, -140($fp) + sw $v0, -124($fp) + + j ifend_12 + then_12: + # assign (add here the expr.to_string) to t_155 + # Creating Int instance for atomic 7 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 7 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -124($fp) + + ifend_12: + # assign (add here the expr.to_string) to t_151 + #load the variable t_155 + lw $v0, -124($fp) + sw $v0, -108($fp) + + j ifend_11 + then_11: + # assign (add here the expr.to_string) to t_151 + # Creating Int instance for atomic 6 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 6 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -108($fp) + + ifend_11: + # assign (add here the expr.to_string) to t_147 + #load the variable t_151 + lw $v0, -108($fp) + sw $v0, -92($fp) + + j ifend_10 + then_10: + # assign (add here the expr.to_string) to t_147 + # Creating Int instance for atomic 5 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 5 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -92($fp) + + ifend_10: + # assign (add here the expr.to_string) to t_143 + #load the variable t_147 + lw $v0, -92($fp) + sw $v0, -76($fp) + + j ifend_9 + then_9: + # assign (add here the expr.to_string) to t_143 + # Creating Int instance for atomic 4 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 4 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -76($fp) + + ifend_9: + # assign (add here the expr.to_string) to t_139 + #load the variable t_143 + lw $v0, -76($fp) + sw $v0, -60($fp) + + j ifend_8 + then_8: + # assign (add here the expr.to_string) to t_139 + # Creating Int instance for atomic 3 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 3 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -60($fp) + + ifend_8: + # assign (add here the expr.to_string) to t_135 + #load the variable t_139 + lw $v0, -60($fp) + sw $v0, -44($fp) + + j ifend_7 + then_7: + # assign (add here the expr.to_string) to t_135 + # Creating Int instance for atomic 2 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 2 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -44($fp) + + ifend_7: + # assign (add here the expr.to_string) to t_131 + #load the variable t_135 + lw $v0, -44($fp) + sw $v0, -28($fp) + + j ifend_6 + then_6: + # assign (add here the expr.to_string) to t_131 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -28($fp) + + ifend_6: + # assign (add here the expr.to_string) to t_127 + #load the variable t_131 + lw $v0, -28($fp) + sw $v0, -12($fp) + + j ifend_5 + then_5: + # assign (add here the expr.to_string) to t_127 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -12($fp) + + ifend_5: + # assign (add here the expr.to_string) to t_165 + #load the variable t_127 + lw $v0, -12($fp) + sw $v0, -164($fp) + + # return the value of the function in the register $v0 + #load the variable t_165 + lw $v0, -164($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 168 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +i2c_A2I: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 172 + + # assign (add here the expr.to_string) to t_167 + #load the variable i_166 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_168 + #load the variable t_167 + lw $v0, -0($fp) + sw $v0, -4($fp) + + lw $t1, -4($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_15 + # assign (add here the expr.to_string) to t_170 + #load the variable i_166 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_171 + #load the variable t_170 + lw $v0, -12($fp) + sw $v0, -16($fp) + + lw $t1, -16($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_16 + # assign (add here the expr.to_string) to t_173 + #load the variable i_166 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 2 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 2 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_174 + #load the variable t_173 + lw $v0, -24($fp) + sw $v0, -28($fp) + + lw $t1, -28($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_17 + # assign (add here the expr.to_string) to t_176 + #load the variable i_166 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 3 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 3 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_177 + #load the variable t_176 + lw $v0, -36($fp) + sw $v0, -40($fp) + + lw $t1, -40($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_18 + # assign (add here the expr.to_string) to t_179 + #load the variable i_166 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 4 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 4 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -48($fp) + + # assign (add here the expr.to_string) to t_180 + #load the variable t_179 + lw $v0, -48($fp) + sw $v0, -52($fp) + + lw $t1, -52($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_19 + # assign (add here the expr.to_string) to t_182 + #load the variable i_166 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 5 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 5 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -60($fp) + + # assign (add here the expr.to_string) to t_183 + #load the variable t_182 + lw $v0, -60($fp) + sw $v0, -64($fp) + + lw $t1, -64($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_20 + # assign (add here the expr.to_string) to t_185 + #load the variable i_166 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 6 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 6 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -72($fp) + + # assign (add here the expr.to_string) to t_186 + #load the variable t_185 + lw $v0, -72($fp) + sw $v0, -76($fp) + + lw $t1, -76($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_21 + # assign (add here the expr.to_string) to t_188 + #load the variable i_166 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 7 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 7 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -84($fp) + + # assign (add here the expr.to_string) to t_189 + #load the variable t_188 + lw $v0, -84($fp) + sw $v0, -88($fp) + + lw $t1, -88($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_22 + # assign (add here the expr.to_string) to t_191 + #load the variable i_166 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 8 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 8 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -96($fp) + + # assign (add here the expr.to_string) to t_192 + #load the variable t_191 + lw $v0, -96($fp) + sw $v0, -100($fp) + + lw $t1, -100($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_23 + # assign (add here the expr.to_string) to t_194 + #load the variable i_166 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 9 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 9 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -108($fp) + + # assign (add here the expr.to_string) to t_195 + #load the variable t_194 + lw $v0, -108($fp) + sw $v0, -112($fp) + + lw $t1, -112($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_24 + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_197 + # calling the method abort of type A2I + #load the variable self_A2I + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 12($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -120($fp) + + # assign (add here the expr.to_string) to t_198 + #load the string str_10 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_10 + sw $v1, 4($v0) + sw $v0, -124($fp) + + # assign (add here the expr.to_string) to t_196 + #load the variable t_198 + lw $v0, -124($fp) + sw $v0, -116($fp) + + j ifend_24 + then_24: + # assign (add here the expr.to_string) to t_199 + #load the string str_11 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_11 + sw $v1, 4($v0) + sw $v0, -128($fp) + + # assign (add here the expr.to_string) to t_196 + #load the variable t_199 + lw $v0, -128($fp) + sw $v0, -116($fp) + + ifend_24: + # assign (add here the expr.to_string) to t_193 + #load the variable t_196 + lw $v0, -116($fp) + sw $v0, -104($fp) + + j ifend_23 + then_23: + # assign (add here the expr.to_string) to t_200 + #load the string str_12 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_12 + sw $v1, 4($v0) + sw $v0, -132($fp) + + # assign (add here the expr.to_string) to t_193 + #load the variable t_200 + lw $v0, -132($fp) + sw $v0, -104($fp) + + ifend_23: + # assign (add here the expr.to_string) to t_190 + #load the variable t_193 + lw $v0, -104($fp) + sw $v0, -92($fp) + + j ifend_22 + then_22: + # assign (add here the expr.to_string) to t_201 + #load the string str_13 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_13 + sw $v1, 4($v0) + sw $v0, -136($fp) + + # assign (add here the expr.to_string) to t_190 + #load the variable t_201 + lw $v0, -136($fp) + sw $v0, -92($fp) + + ifend_22: + # assign (add here the expr.to_string) to t_187 + #load the variable t_190 + lw $v0, -92($fp) + sw $v0, -80($fp) + + j ifend_21 + then_21: + # assign (add here the expr.to_string) to t_202 + #load the string str_14 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_14 + sw $v1, 4($v0) + sw $v0, -140($fp) + + # assign (add here the expr.to_string) to t_187 + #load the variable t_202 + lw $v0, -140($fp) + sw $v0, -80($fp) + + ifend_21: + # assign (add here the expr.to_string) to t_184 + #load the variable t_187 + lw $v0, -80($fp) + sw $v0, -68($fp) + + j ifend_20 + then_20: + # assign (add here the expr.to_string) to t_203 + #load the string str_15 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_15 + sw $v1, 4($v0) + sw $v0, -144($fp) + + # assign (add here the expr.to_string) to t_184 + #load the variable t_203 + lw $v0, -144($fp) + sw $v0, -68($fp) + + ifend_20: + # assign (add here the expr.to_string) to t_181 + #load the variable t_184 + lw $v0, -68($fp) + sw $v0, -56($fp) + + j ifend_19 + then_19: + # assign (add here the expr.to_string) to t_204 + #load the string str_16 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_16 + sw $v1, 4($v0) + sw $v0, -148($fp) + + # assign (add here the expr.to_string) to t_181 + #load the variable t_204 + lw $v0, -148($fp) + sw $v0, -56($fp) + + ifend_19: + # assign (add here the expr.to_string) to t_178 + #load the variable t_181 + lw $v0, -56($fp) + sw $v0, -44($fp) + + j ifend_18 + then_18: + # assign (add here the expr.to_string) to t_205 + #load the string str_17 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_17 + sw $v1, 4($v0) + sw $v0, -152($fp) + + # assign (add here the expr.to_string) to t_178 + #load the variable t_205 + lw $v0, -152($fp) + sw $v0, -44($fp) + + ifend_18: + # assign (add here the expr.to_string) to t_175 + #load the variable t_178 + lw $v0, -44($fp) + sw $v0, -32($fp) + + j ifend_17 + then_17: + # assign (add here the expr.to_string) to t_206 + #load the string str_18 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_18 + sw $v1, 4($v0) + sw $v0, -156($fp) + + # assign (add here the expr.to_string) to t_175 + #load the variable t_206 + lw $v0, -156($fp) + sw $v0, -32($fp) + + ifend_17: + # assign (add here the expr.to_string) to t_172 + #load the variable t_175 + lw $v0, -32($fp) + sw $v0, -20($fp) + + j ifend_16 + then_16: + # assign (add here the expr.to_string) to t_207 + #load the string str_19 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_19 + sw $v1, 4($v0) + sw $v0, -160($fp) + + # assign (add here the expr.to_string) to t_172 + #load the variable t_207 + lw $v0, -160($fp) + sw $v0, -20($fp) + + ifend_16: + # assign (add here the expr.to_string) to t_169 + #load the variable t_172 + lw $v0, -20($fp) + sw $v0, -8($fp) + + j ifend_15 + then_15: + # assign (add here the expr.to_string) to t_208 + #load the string str_20 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_20 + sw $v1, 4($v0) + sw $v0, -164($fp) + + # assign (add here the expr.to_string) to t_169 + #load the variable t_208 + lw $v0, -164($fp) + sw $v0, -8($fp) + + ifend_15: + # assign (add here the expr.to_string) to t_209 + #load the variable t_169 + lw $v0, -8($fp) + sw $v0, -168($fp) + + # return the value of the function in the register $v0 + #load the variable t_209 + lw $v0, -168($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 172 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +a2i_A2I: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 176 + + # assign (add here the expr.to_string) to t_211 + #load the variable s_210 + lw $v0, 12($fp) + sw $v0, -0($fp) + + lw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_212 + # calling the method length of type String + #load the variable t_211 + lw $v0, -0($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to t_213 + #load the variable t_212 + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_214 + #load the variable t_213 + lw $v0, -8($fp) + sw $v0, -12($fp) + + lw $t1, -12($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_25 + # assign (add here the expr.to_string) to t_216 + #load the variable s_210 + lw $v0, 12($fp) + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_217 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_218 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -28($fp) + + lw $v0, -20($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -24($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -28($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_219 + # calling the method substr of type String + #load the variable t_216 + lw $v0, -20($fp) + lw $t0, 0($v0) + lw $v1, 32($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -32($fp) + + # assign (add here the expr.to_string) to t_220 + #load the string str_21 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_21 + sw $v1, 4($v0) + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_221 + #load the variable t_219 + lw $v0, -32($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_220 + lw $v0, -36($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -40($fp) + + # assign (add here the expr.to_string) to t_222 + #load the variable t_221 + lw $v0, -40($fp) + sw $v0, -44($fp) + + lw $t1, -44($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_26 + # assign (add here the expr.to_string) to t_224 + #load the variable s_210 + lw $v0, 12($fp) + sw $v0, -52($fp) + + # assign (add here the expr.to_string) to t_225 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -56($fp) + + # assign (add here the expr.to_string) to t_226 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -60($fp) + + lw $v0, -52($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -56($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -60($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_227 + # calling the method substr of type String + #load the variable t_224 + lw $v0, -52($fp) + lw $t0, 0($v0) + lw $v1, 32($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -64($fp) + + # assign (add here the expr.to_string) to t_228 + #load the string str_22 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_22 + sw $v1, 4($v0) + sw $v0, -68($fp) + + # assign (add here the expr.to_string) to t_229 + #load the variable t_227 + lw $v0, -64($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + #load the variable t_228 + lw $v0, -68($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -72($fp) + + # assign (add here the expr.to_string) to t_230 + #load the variable t_229 + lw $v0, -72($fp) + sw $v0, -76($fp) + + lw $t1, -76($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_27 + # assign (add here the expr.to_string) to t_232 + #load the variable s_210 + lw $v0, 12($fp) + sw $v0, -84($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -84($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_233 + # calling the method a2i_aux of type A2I + #load the variable self_A2I + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 36($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -88($fp) + + # assign (add here the expr.to_string) to t_231 + #load the variable t_233 + lw $v0, -88($fp) + sw $v0, -80($fp) + + j ifend_27 + then_27: + # assign (add here the expr.to_string) to t_234 + #load the variable s_210 + lw $v0, 12($fp) + sw $v0, -92($fp) + + # assign (add here the expr.to_string) to t_235 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -96($fp) + + # assign (add here the expr.to_string) to t_236 + #load the variable s_210 + lw $v0, 12($fp) + sw $v0, -100($fp) + + lw $v0, -100($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_237 + # calling the method length of type String + #load the variable t_236 + lw $v0, -100($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -104($fp) + + # assign (add here the expr.to_string) to t_238 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_237 + lw $v0, -104($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -108($fp) + + # assign (add here the expr.to_string) to t_239 + #load the variable t_238 + lw $v0, -108($fp) + sw $v0, -112($fp) + + lw $v0, -92($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -96($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -112($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_240 + # calling the method substr of type String + #load the variable t_234 + lw $v0, -92($fp) + lw $t0, 0($v0) + lw $v1, 32($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -116($fp) + + # assign (add here the expr.to_string) to t_241 + #load the variable t_240 + lw $v0, -116($fp) + sw $v0, -120($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -120($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_242 + # calling the method a2i_aux of type A2I + #load the variable self_A2I + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 36($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -124($fp) + + # assign (add here the expr.to_string) to t_231 + #load the variable t_242 + lw $v0, -124($fp) + sw $v0, -80($fp) + + ifend_27: + # assign (add here the expr.to_string) to t_223 + #load the variable t_231 + lw $v0, -80($fp) + sw $v0, -48($fp) + + j ifend_26 + then_26: + # assign (add here the expr.to_string) to t_243 + #load the variable s_210 + lw $v0, 12($fp) + sw $v0, -128($fp) + + # assign (add here the expr.to_string) to t_244 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -132($fp) + + # assign (add here the expr.to_string) to t_245 + #load the variable s_210 + lw $v0, 12($fp) + sw $v0, -136($fp) + + lw $v0, -136($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_246 + # calling the method length of type String + #load the variable t_245 + lw $v0, -136($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -140($fp) + + # assign (add here the expr.to_string) to t_247 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_246 + lw $v0, -140($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -144($fp) + + # assign (add here the expr.to_string) to t_248 + #load the variable t_247 + lw $v0, -144($fp) + sw $v0, -148($fp) + + lw $v0, -128($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -132($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -148($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_249 + # calling the method substr of type String + #load the variable t_243 + lw $v0, -128($fp) + lw $t0, 0($v0) + lw $v1, 32($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -152($fp) + + # assign (add here the expr.to_string) to t_250 + #load the variable t_249 + lw $v0, -152($fp) + sw $v0, -156($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -156($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_251 + # calling the method a2i_aux of type A2I + #load the variable self_A2I + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 36($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -160($fp) + + # assign (add here the expr.to_string) to t_252 + #load the variable t_251 + lw $v0, -160($fp) + sw $v0, -164($fp) + + # assign (add here the expr.to_string) to t_253 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_252 + lw $v0, -164($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -168($fp) + + # assign (add here the expr.to_string) to t_223 + #load the variable t_253 + lw $v0, -168($fp) + sw $v0, -48($fp) + + ifend_26: + # assign (add here the expr.to_string) to t_215 + #load the variable t_223 + lw $v0, -48($fp) + sw $v0, -16($fp) + + j ifend_25 + then_25: + # assign (add here the expr.to_string) to t_215 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -16($fp) + + ifend_25: + # assign (add here the expr.to_string) to t_254 + #load the variable t_215 + lw $v0, -16($fp) + sw $v0, -172($fp) + + # return the value of the function in the register $v0 + #load the variable t_254 + lw $v0, -172($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 176 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +a2i_aux_A2I: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 72 + + # assign (add here the expr.to_string) to int_256 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_258 + #load the variable s_255 + lw $v0, 12($fp) + sw $v0, -8($fp) + + lw $v0, -8($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_259 + # calling the method length of type String + #load the variable t_258 + lw $v0, -8($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to j_257 + #load the variable t_259 + lw $v0, -12($fp) + sw $v0, -4($fp) + + # assign (add here the expr.to_string) to i_260 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -16($fp) + + while_1: + # assign (add here the expr.to_string) to t_261 + #load the variable i_260 + lw $v0, -16($fp) + move $t1, $v0 + lw $t1, 4($t1) + # push $t1 to the stack + sw $t1, 0($sp) + addi $sp $sp -4 + + #load the variable j_257 + lw $v0, -4($fp) + # pop the top of the stack to $t1 + addi $sp $sp 4 + lw $t1, 0($sp) + + move $t2, $v0 + lw $t2, 4($t2) + slt $t3, $t1, $t2 + la $t4, Bool + li $a0, 8 + li $v0, 9 + syscall + sw $t4, 0($v0) + sw $t3, 4($v0) + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_262 + #load the variable t_261 + lw $v0, -20($fp) + sw $v0, -24($fp) + + lw $t1, -24($fp) + lw $t0, 4($t1) + bne $t0, $zero, body_1 + j pool_1 + body_1: + # assign (add here the expr.to_string) to t_264 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable int_256 + lw $v0, -0($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 10 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 10 + sw $t0, 0($v0) + sw $t1, 4($v0) + + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + mult $t0, $t1 + mflo $t0 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -32($fp) + + # assign (add here the expr.to_string) to t_265 + #load the variable s_255 + lw $v0, 12($fp) + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_266 + #load the variable i_260 + lw $v0, -16($fp) + sw $v0, -40($fp) + + # assign (add here the expr.to_string) to t_267 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -44($fp) + + lw $v0, -36($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -40($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -44($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_268 + # calling the method substr of type String + #load the variable t_265 + lw $v0, -36($fp) + lw $t0, 0($v0) + lw $v1, 32($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -48($fp) + + # assign (add here the expr.to_string) to t_269 + #load the variable t_268 + lw $v0, -48($fp) + sw $v0, -52($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -52($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_270 + # calling the method c2i of type A2I + #load the variable self_A2I + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -56($fp) + + # assign (add here the expr.to_string) to t_271 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_264 + lw $v0, -32($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_270 + lw $v0, -56($fp) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -60($fp) + + # assign (add here the expr.to_string) to int_256 + #load the variable t_271 + lw $v0, -60($fp) + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_272 + # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable i_260 + lw $v0, -16($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + lw $t1, 4($v0) + add $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -64($fp) + + # assign (add here the expr.to_string) to i_260 + #load the variable t_272 + lw $v0, -64($fp) + sw $v0, -16($fp) + + # assign (add here the expr.to_string) to t_263 + #load the variable i_260 + lw $v0, -16($fp) + sw $v0, -28($fp) + + j while_1 + pool_1: + # assign (add here the expr.to_string) to t_273 + #load the variable int_256 + lw $v0, -0($fp) + sw $v0, -68($fp) + + # return the value of the function in the register $v0 + #load the variable t_273 + lw $v0, -68($fp) + move $v0, $v0 + + # restore the stack pointer, frame pointer y return address + addu $sp $sp 72 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +i2a_A2I: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 76 + + # assign (add here the expr.to_string) to t_275 + #load the variable i_274 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_276 + #load the variable t_275 + lw $v0, -0($fp) + sw $v0, -4($fp) + + lw $t1, -4($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_28 + # assign (add here the expr.to_string) to t_278 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + move $t1, $v0 + lw $t1, 4($t1) + # push $t1 to the stack + sw $t1, 0($sp) + addi $sp $sp -4 + + #load the variable i_274 + lw $v0, 12($fp) + # pop the top of the stack to $t1 + addi $sp $sp 4 + lw $t1, 0($sp) + + move $t2, $v0 + lw $t2, 4($t2) + slt $t3, $t1, $t2 + la $t4, Bool + li $a0, 8 + li $v0, 9 + syscall + sw $t4, 0($v0) + sw $t3, 4($v0) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_279 + #load the variable t_278 + lw $v0, -12($fp) + sw $v0, -16($fp) + + lw $t1, -16($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_29 + # assign (add here the expr.to_string) to t_281 + #load the string str_23 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_23 + sw $v1, 4($v0) + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_282 + #load the variable t_281 + lw $v0, -24($fp) + sw $v0, -28($fp) + + # assign (add here the expr.to_string) to t_283 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) + + sw $v0, -32($fp) + + # assign (add here the expr.to_string) to t_284 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_283 + lw $v0, -32($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -36($fp) + + # assign (add here the expr.to_string) to t_285 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable i_274 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_284 + lw $v0, -36($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + mult $t0, $t1 + mflo $t0 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -40($fp) + + # assign (add here the expr.to_string) to t_286 + #load the variable t_285 + lw $v0, -40($fp) + sw $v0, -44($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -44($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_287 + # calling the method i2a_aux of type A2I + #load the variable self_A2I + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 44($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -48($fp) + + # assign (add here the expr.to_string) to t_288 + #load the variable t_287 + lw $v0, -48($fp) + sw $v0, -52($fp) + + lw $v0, -28($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -52($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_289 + # calling the method concat of type String + #load the variable t_282 + lw $v0, -28($fp) + lw $t0, 0($v0) + lw $v1, 28($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -56($fp) + + # assign (add here the expr.to_string) to t_280 + #load the variable t_289 + lw $v0, -56($fp) + sw $v0, -20($fp) + + j ifend_29 + then_29: + # assign (add here the expr.to_string) to t_290 + #load the variable i_274 + lw $v0, 12($fp) + sw $v0, -60($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -60($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_291 + # calling the method i2a_aux of type A2I + #load the variable self_A2I + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 44($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -64($fp) + + # assign (add here the expr.to_string) to t_280 + #load the variable t_291 + lw $v0, -64($fp) + sw $v0, -20($fp) + + ifend_29: + # assign (add here the expr.to_string) to t_277 + #load the variable t_280 + lw $v0, -20($fp) + sw $v0, -8($fp) + + j ifend_28 + then_28: + # assign (add here the expr.to_string) to t_292 + #load the string str_24 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_24 + sw $v1, 4($v0) + sw $v0, -68($fp) + + # assign (add here the expr.to_string) to t_277 + #load the variable t_292 + lw $v0, -68($fp) + sw $v0, -8($fp) + + ifend_28: + # assign (add here the expr.to_string) to t_293 + #load the variable t_277 + lw $v0, -8($fp) + sw $v0, -72($fp) # return the value of the function in the register $v0 - #load the variable t_27 - lw $v0, -4($fp) + #load the variable t_293 + lw $v0, -72($fp) move $v0, $v0 - # restore the stack pointer, frame pointer y return address - addu $sp $sp 8 - # pop the top of the stack to $fp + # restore the stack pointer, frame pointer y return address + addu $sp $sp 76 + # pop the top of the stack to $fp + addi $sp $sp 4 + lw $fp, 0($sp) + + # pop the top of the stack to $ra + addi $sp $sp 4 + lw $ra, 0($sp) + + jr $ra + + .text +i2a_aux_A2I: + # save the return address and frame pointer + # push $ra to the stack + sw $ra, 0($sp) + addi $sp $sp -4 + + # push $fp to the stack + sw $fp, 0($sp) + addi $sp $sp -4 + + # update the frame pointer and allocate the frame in the stack + move $fp $sp + subu $sp $sp 64 + + # assign (add here the expr.to_string) to t_295 + #load the variable i_294 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) + + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -0($fp) + + # assign (add here the expr.to_string) to t_296 + #load the variable t_295 + lw $v0, -0($fp) + sw $v0, -4($fp) + + lw $t1, -4($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_30 + # assign (add here the expr.to_string) to t_299 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable i_294 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 10 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 10 + sw $t0, 0($v0) + sw $t1, 4($v0) + + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + div $t0, $t1 + mflo $t0 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -16($fp) + + # assign (add here the expr.to_string) to next_298 + #load the variable t_299 + lw $v0, -16($fp) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_300 + #load the variable next_298 + lw $v0, -12($fp) + sw $v0, -20($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -20($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_301 + # calling the method i2a_aux of type A2I + #load the variable self_A2I + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 44($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_302 + #load the variable t_301 + lw $v0, -24($fp) + sw $v0, -28($fp) + + # assign (add here the expr.to_string) to t_303 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable next_298 + lw $v0, -12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 10 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 10 + sw $t0, 0($v0) + sw $t1, 4($v0) + + lw $t1, 4($v0) + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $fp, 0($sp) + lw $t0, 0($sp) - # pop the top of the stack to $ra + mult $t0, $t1 + mflo $t0 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -32($fp) + + # assign (add here the expr.to_string) to t_304 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable i_294 + lw $v0, 12($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_303 + lw $v0, -32($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $ra, 0($sp) + lw $t0, 0($sp) - jr $ra + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -36($fp) - .text -number_Vertice: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) + # assign (add here the expr.to_string) to t_305 + #load the variable t_304 + lw $v0, -36($fp) + sw $v0, -40($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # push $fp to the stack - sw $fp, 0($sp) + lw $v0, -40($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 8 + # assign (add here the expr.to_string) to t_306 + # calling the method i2c of type A2I + #load the variable self_A2I + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 28($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # assign (add here the expr.to_string) to t_28 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -0($fp) + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # assign (add here the expr.to_string) to t_29 - #load the variable t_28 - lw $v0, -0($fp) - sw $v0, -4($fp) + sw $v0, -44($fp) + + # assign (add here the expr.to_string) to t_307 + #load the variable t_306 + lw $v0, -44($fp) + sw $v0, -48($fp) + + lw $v0, -28($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -48($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_308 + # calling the method concat of type String + #load the variable t_302 + lw $v0, -28($fp) + lw $t0, 0($v0) + lw $v1, 28($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -52($fp) + + # assign (add here the expr.to_string) to t_297 + #load the variable t_308 + lw $v0, -52($fp) + sw $v0, -8($fp) + + j ifend_30 + then_30: + # assign (add here the expr.to_string) to t_309 + #load the string str_25 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_25 + sw $v1, 4($v0) + sw $v0, -56($fp) + + # assign (add here the expr.to_string) to t_297 + #load the variable t_309 + lw $v0, -56($fp) + sw $v0, -8($fp) + + ifend_30: + # assign (add here the expr.to_string) to t_310 + #load the variable t_297 + lw $v0, -8($fp) + sw $v0, -60($fp) # return the value of the function in the register $v0 - #load the variable t_29 - lw $v0, -4($fp) + #load the variable t_310 + lw $v0, -60($fp) move $v0, $v0 # restore the stack pointer, frame pointer y return address - addu $sp $sp 8 + addu $sp $sp 64 # pop the top of the stack to $fp addi $sp $sp 4 lw $fp, 0($sp) @@ -716,7 +5741,7 @@ number_Vertice: jr $ra .text -init_Vertice: +Init_A2I: # save the return address and frame pointer # push $ra to the stack sw $ra, 0($sp) @@ -728,27 +5753,15 @@ init_Vertice: # update the frame pointer and allocate the frame in the stack move $fp $sp - subu $sp $sp 4 - - # Setting value of the attribute num in the instance self_Vertice to n_30 - #load the variable n_30 - lw $v0, 12($fp) - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 4($v1) - - # assign (add here the expr.to_string) to t_31 - #load the variable self_Vertice - lw $v0, 16($fp) - sw $v0, -0($fp) + subu $sp $sp 0 # return the value of the function in the register $v0 - #load the variable t_31 - lw $v0, -0($fp) + #load the variable self_A2I + lw $v0, 12($fp) move $v0, $v0 # restore the stack pointer, frame pointer y return address - addu $sp $sp 4 + addu $sp $sp 0 # pop the top of the stack to $fp addi $sp $sp 4 lw $fp, 0($sp) @@ -760,7 +5773,7 @@ init_Vertice: jr $ra .text -add_out_Vertice: +menu_Main: # save the return address and frame pointer # push $ra to the stack sw $ra, 0($sp) @@ -772,39 +5785,40 @@ add_out_Vertice: # update the frame pointer and allocate the frame in the stack move $fp $sp - subu $sp $sp 20 + subu $sp $sp 320 - # assign (add here the expr.to_string) to t_33 - lw $v1, 16($fp) - lw $v0, 8($v1) + # assign (add here the expr.to_string) to t_312 + #load the string str_26 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_26 + sw $v1, 4($v0) sw $v0, -0($fp) - # assign (add here the expr.to_string) to t_34 - #load the variable t_33 + # assign (add here the expr.to_string) to t_313 + #load the variable t_312 lw $v0, -0($fp) sw $v0, -4($fp) - # assign (add here the expr.to_string) to t_35 - #load the variable s_32 lw $v0, 12($fp) - sw $v0, -8($fp) - - lw $v0, -4($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -8($fp) + lw $v0, -4($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_36 - # calling the method cons of type EList - #load the variable t_34 - lw $v0, -4($fp) + # assign (add here the expr.to_string) to t_314 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 52($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -814,78 +5828,77 @@ add_out_Vertice: addi $sp $sp 4 lw $v1, 0($sp) + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_315 + lw $v1, 12($fp) + lw $v0, 8($v1) sw $v0, -12($fp) - # Setting value of the attribute out in the instance self_Vertice to t_36 - #load the variable t_36 + # assign (add here the expr.to_string) to t_316 + #load the variable t_315 lw $v0, -12($fp) - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 8($v1) - - # assign (add here the expr.to_string) to t_37 - #load the variable self_Vertice - lw $v0, 16($fp) sw $v0, -16($fp) - # return the value of the function in the register $v0 - #load the variable t_37 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + lw $v0, -16($fp) - move $v0, $v0 + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # restore the stack pointer, frame pointer y return address - addu $sp $sp 20 - # pop the top of the stack to $fp + # assign (add here the expr.to_string) to t_317 + # calling the method print of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 60($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $fp, 0($sp) + lw $v1, 0($sp) - # pop the top of the stack to $ra + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -print_Vertice: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 + lw $v1, 0($sp) - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 28 + sw $v0, -20($fp) - # assign (add here the expr.to_string) to t_38 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -0($fp) + # assign (add here the expr.to_string) to t_318 + #load the string str_27 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_27 + sw $v1, 4($v0) + sw $v0, -24($fp) - # assign (add here the expr.to_string) to t_39 - #load the variable t_38 - lw $v0, -0($fp) - sw $v0, -4($fp) + # assign (add here the expr.to_string) to t_319 + #load the variable t_318 + lw $v0, -24($fp) + sw $v0, -28($fp) lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -4($fp) + lw $v0, -28($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_40 - # calling the method out_int of type Vertice - #load the variable self_Vertice + # assign (add here the expr.to_string) to t_320 + # calling the method out_string of type Main + #load the variable self_Main lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 28($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -895,255 +5908,200 @@ print_Vertice: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -8($fp) + sw $v0, -32($fp) - # assign (add here the expr.to_string) to t_41 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -12($fp) + # assign (add here the expr.to_string) to t_321 + #load the string str_28 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_28 + sw $v1, 4($v0) + sw $v0, -36($fp) - # assign (add here the expr.to_string) to t_42 - #load the variable t_41 - lw $v0, -12($fp) - sw $v0, -16($fp) + # assign (add here the expr.to_string) to t_322 + #load the variable t_321 + lw $v0, -36($fp) + sw $v0, -40($fp) - lw $v0, -16($fp) + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_43 - # calling the method print of type EList - #load the variable t_42 - lw $v0, -16($fp) + lw $v0, -40($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_323 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 60($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -20($fp) - - # assign (add here the expr.to_string) to t_44 - #load the variable t_43 - lw $v0, -20($fp) - sw $v0, -24($fp) - - # return the value of the function in the register $v0 - #load the variable t_44 - lw $v0, -24($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 28 - # pop the top of the stack to $fp + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $fp, 0($sp) + lw $v1, 0($sp) - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) + sw $v0, -44($fp) - jr $ra + # assign (add here the expr.to_string) to t_324 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -48($fp) - .text -Init_Vertice: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_325 + #load the variable t_324 + lw $v0, -48($fp) + sw $v0, -52($fp) - # push $fp to the stack - sw $fp, 0($sp) + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 8 - - lw $v0, 12($fp) + lw $v0, -52($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to self_Vertice - jal Init_IO + # assign (add here the expr.to_string) to t_326 + # calling the method print of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 60($t0) + jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, 12($fp) + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # Setting value of the attribute num in the instance self_Vertice to 0 - # Creating Int instance for atomic 0 + sw $v0, -56($fp) + + # assign (add here the expr.to_string) to t_327 + #load the string str_29 li $a0, 8 li $v0, 9 syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) + la $v1, String + sw $v1, 0($v0) + la $v1, str_29 + sw $v1, 4($v0) + sw $v0, -60($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 4($v1) + # assign (add here the expr.to_string) to t_328 + #load the variable t_327 + lw $v0, -60($fp) + sw $v0, -64($fp) - # assign (add here the expr.to_string) to t_24 - li $a0, 8 - li $v0, 9 - syscall - la $a0, EList - sw $a0, 0($v0) - sw $v0, -0($fp) + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - lw $v0, -0($fp) + lw $v0, -64($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_25 - # calling the method Init_EList of type EList - #load the variable t_24 - lw $v0, -0($fp) + # assign (add here the expr.to_string) to t_329 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 8($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -4($fp) - - # Setting value of the attribute out in the instance self_Vertice to t_25 - #load the variable t_25 - lw $v0, -4($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 8($v1) - - # return the value of the function in the register $v0 - #load the variable self_Vertice - lw $v0, 12($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 8 - # pop the top of the stack to $fp + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $fp, 0($sp) + lw $v1, 0($sp) - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) + sw $v0, -68($fp) - jr $ra + # assign (add here the expr.to_string) to t_330 + #load the string str_30 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_30 + sw $v1, 4($v0) + sw $v0, -72($fp) - .text -init_Edge: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_331 + #load the variable t_330 + lw $v0, -72($fp) + sw $v0, -76($fp) - # push $fp to the stack - sw $fp, 0($sp) + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 4 - - # Setting value of the attribute from in the instance self_Edge to f_45 - #load the variable f_45 - lw $v0, 20($fp) - move $s2, $v0 - lw $v1, 24($fp) - sw $s2, 4($v1) - - # Setting value of the attribute to in the instance self_Edge to t_46 - #load the variable t_46 - lw $v0, 16($fp) - move $s2, $v0 - lw $v1, 24($fp) - sw $s2, 8($v1) + lw $v0, -76($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # Setting value of the attribute weight in the instance self_Edge to w_47 - #load the variable w_47 + # assign (add here the expr.to_string) to t_332 + # calling the method out_string of type Main + #load the variable self_Main lw $v0, 12($fp) - move $s2, $v0 - lw $v1, 24($fp) - sw $s2, 12($v1) - - # assign (add here the expr.to_string) to t_48 - #load the variable self_Edge - lw $v0, 24($fp) - sw $v0, -0($fp) - - # return the value of the function in the register $v0 - #load the variable t_48 - lw $v0, -0($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 4 - # pop the top of the stack to $fp + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $fp, 0($sp) + lw $v1, 0($sp) - # pop the top of the stack to $ra + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -print_Edge: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 76 + lw $v1, 0($sp) - # assign (add here the expr.to_string) to t_49 - #load the string str_0 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_0 - sw $v1, 4($v0) - sw $v0, -0($fp) + sw $v0, -80($fp) - # assign (add here the expr.to_string) to t_50 - #load the variable t_49 - lw $v0, -0($fp) - sw $v0, -4($fp) + # assign (add here the expr.to_string) to t_333 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -84($fp) + + # assign (add here the expr.to_string) to t_334 + #load the variable t_333 + lw $v0, -84($fp) + sw $v0, -88($fp) lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -4($fp) + lw $v0, -88($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_51 - # calling the method out_string of type Edge - #load the variable self_Edge + # assign (add here the expr.to_string) to t_335 + # calling the method print of type Main + #load the variable self_Main lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 24($t0) + lw $v1, 60($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -1153,34 +6111,40 @@ print_Edge: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -8($fp) + sw $v0, -92($fp) - # assign (add here the expr.to_string) to t_52 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -12($fp) + # assign (add here the expr.to_string) to t_336 + #load the string str_31 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_31 + sw $v1, 4($v0) + sw $v0, -96($fp) - # assign (add here the expr.to_string) to t_53 - #load the variable t_52 - lw $v0, -12($fp) - sw $v0, -16($fp) + # assign (add here the expr.to_string) to t_337 + #load the variable t_336 + lw $v0, -96($fp) + sw $v0, -100($fp) lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -16($fp) + lw $v0, -100($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_54 - # calling the method out_int of type Edge - #load the variable self_Edge + # assign (add here the expr.to_string) to t_338 + # calling the method out_string of type Main + #load the variable self_Main lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 28($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -1190,37 +6154,37 @@ print_Edge: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -20($fp) + sw $v0, -104($fp) - # assign (add here the expr.to_string) to t_55 - #load the string str_1 + # assign (add here the expr.to_string) to t_339 + #load the string str_32 li $a0, 8 li $v0, 9 syscall la $v1, String sw $v1, 0($v0) - la $v1, str_1 + la $v1, str_32 sw $v1, 4($v0) - sw $v0, -24($fp) + sw $v0, -108($fp) - # assign (add here the expr.to_string) to t_56 - #load the variable t_55 - lw $v0, -24($fp) - sw $v0, -28($fp) + # assign (add here the expr.to_string) to t_340 + #load the variable t_339 + lw $v0, -108($fp) + sw $v0, -112($fp) lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -28($fp) + lw $v0, -112($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_57 - # calling the method out_string of type Edge - #load the variable self_Edge + # assign (add here the expr.to_string) to t_341 + # calling the method out_string of type Main + #load the variable self_Main lw $v0, 12($fp) lw $t0, 0($v0) lw $v1, 24($t0) @@ -1233,34 +6197,34 @@ print_Edge: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -32($fp) + sw $v0, -116($fp) - # assign (add here the expr.to_string) to t_58 + # assign (add here the expr.to_string) to t_342 lw $v1, 12($fp) lw $v0, 8($v1) - sw $v0, -36($fp) + sw $v0, -120($fp) - # assign (add here the expr.to_string) to t_59 - #load the variable t_58 - lw $v0, -36($fp) - sw $v0, -40($fp) + # assign (add here the expr.to_string) to t_343 + #load the variable t_342 + lw $v0, -120($fp) + sw $v0, -124($fp) lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -40($fp) + lw $v0, -124($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_60 - # calling the method out_int of type Edge - #load the variable self_Edge + # assign (add here the expr.to_string) to t_344 + # calling the method print of type Main + #load the variable self_Main lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 28($t0) + lw $v1, 60($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -1270,37 +6234,37 @@ print_Edge: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -44($fp) + sw $v0, -128($fp) - # assign (add here the expr.to_string) to t_61 - #load the string str_2 + # assign (add here the expr.to_string) to t_345 + #load the string str_33 li $a0, 8 li $v0, 9 syscall la $v1, String sw $v1, 0($v0) - la $v1, str_2 + la $v1, str_33 sw $v1, 4($v0) - sw $v0, -48($fp) + sw $v0, -132($fp) - # assign (add here the expr.to_string) to t_62 - #load the variable t_61 - lw $v0, -48($fp) - sw $v0, -52($fp) + # assign (add here the expr.to_string) to t_346 + #load the variable t_345 + lw $v0, -132($fp) + sw $v0, -136($fp) lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -52($fp) + lw $v0, -136($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_63 - # calling the method out_string of type Edge - #load the variable self_Edge + # assign (add here the expr.to_string) to t_347 + # calling the method out_string of type Main + #load the variable self_Main lw $v0, 12($fp) lw $t0, 0($v0) lw $v1, 24($t0) @@ -1313,34 +6277,40 @@ print_Edge: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -56($fp) + sw $v0, -140($fp) - # assign (add here the expr.to_string) to t_64 - lw $v1, 12($fp) - lw $v0, 12($v1) - sw $v0, -60($fp) + # assign (add here the expr.to_string) to t_348 + #load the string str_34 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_34 + sw $v1, 4($v0) + sw $v0, -144($fp) - # assign (add here the expr.to_string) to t_65 - #load the variable t_64 - lw $v0, -60($fp) - sw $v0, -64($fp) + # assign (add here the expr.to_string) to t_349 + #load the variable t_348 + lw $v0, -144($fp) + sw $v0, -148($fp) lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -64($fp) + lw $v0, -148($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_66 - # calling the method out_int of type Edge - #load the variable self_Edge + # assign (add here the expr.to_string) to t_350 + # calling the method out_string of type Main + #load the variable self_Main lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 28($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -1350,384 +6320,280 @@ print_Edge: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -68($fp) - - # assign (add here the expr.to_string) to t_67 - #load the variable t_66 - lw $v0, -68($fp) - sw $v0, -72($fp) - - # return the value of the function in the register $v0 - #load the variable t_67 - lw $v0, -72($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 76 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) + sw $v0, -152($fp) - jr $ra + # assign (add here the expr.to_string) to t_351 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -156($fp) - .text -Init_Edge: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_352 + #load the variable t_351 + lw $v0, -156($fp) + sw $v0, -160($fp) - # push $fp to the stack - sw $fp, 0($sp) + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 0 - - lw $v0, 12($fp) + lw $v0, -160($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to self_Edge - jal Init_IO + # assign (add here the expr.to_string) to t_353 + # calling the method print of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 60($t0) + jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, 12($fp) - - # Setting value of the attribute from in the instance self_Edge to 0 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 4($v1) - - # Setting value of the attribute to in the instance self_Edge to 0 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 8($v1) - - # Setting value of the attribute weight in the instance self_Edge to 0 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 12($v1) - - # return the value of the function in the register $v0 - #load the variable self_Edge - lw $v0, 12($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -isNil_EList: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 + lw $v1, 0($sp) - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 8 + sw $v0, -164($fp) - # assign (add here the expr.to_string) to t_68 - # Creating Int instance for atomic 0 + # assign (add here the expr.to_string) to t_354 + #load the string str_35 li $a0, 8 li $v0, 9 syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) + la $v1, String + sw $v1, 0($v0) + la $v1, str_35 + sw $v1, 4($v0) + sw $v0, -168($fp) + # assign (add here the expr.to_string) to t_355 + #load the variable t_354 + lw $v0, -168($fp) + sw $v0, -172($fp) + + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - + lw $v0, -172($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 + # assign (add here the expr.to_string) to t_356 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_69 - #load the variable t_68 - lw $v0, -0($fp) - sw $v0, -4($fp) - - # return the value of the function in the register $v0 - #load the variable t_69 - lw $v0, -4($fp) - move $v0, $v0 + lw $v1, 0($sp) - # restore the stack pointer, frame pointer y return address - addu $sp $sp 8 - # pop the top of the stack to $fp + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $fp, 0($sp) + lw $v1, 0($sp) - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) + sw $v0, -176($fp) - jr $ra + # assign (add here the expr.to_string) to t_357 + #load the string str_36 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_36 + sw $v1, 4($v0) + sw $v0, -180($fp) - .text -head_EList: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_358 + #load the variable t_357 + lw $v0, -180($fp) + sw $v0, -184($fp) - # push $fp to the stack - sw $fp, 0($sp) + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 12 - - lw $v0, 12($fp) + lw $v0, -184($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_70 - # calling the method abort of type EList - #load the variable self_EList + # assign (add here the expr.to_string) to t_359 + # calling the method out_string of type Main + #load the variable self_Main lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 12($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -0($fp) + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # assign (add here the expr.to_string) to t_71 + sw $v0, -188($fp) + + # assign (add here the expr.to_string) to t_360 lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -4($fp) + lw $v0, 8($v1) + sw $v0, -192($fp) - # assign (add here the expr.to_string) to t_72 - #load the variable t_71 - lw $v0, -4($fp) - sw $v0, -8($fp) + # assign (add here the expr.to_string) to t_361 + #load the variable t_360 + lw $v0, -192($fp) + sw $v0, -196($fp) - # return the value of the function in the register $v0 - #load the variable t_72 - lw $v0, -8($fp) - move $v0, $v0 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # restore the stack pointer, frame pointer y return address - addu $sp $sp 12 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) + lw $v0, -196($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # pop the top of the stack to $ra + # assign (add here the expr.to_string) to t_362 + # calling the method print of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 60($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $ra, 0($sp) + lw $v1, 0($sp) - jr $ra + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - .text -tail_EList: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + sw $v0, -200($fp) - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_363 + #load the string str_37 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_37 + sw $v1, 4($v0) + sw $v0, -204($fp) - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 8 + # assign (add here the expr.to_string) to t_364 + #load the variable t_363 + lw $v0, -204($fp) + sw $v0, -208($fp) lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_73 - # calling the method abort of type EList - #load the variable self_EList + lw $v0, -208($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_365 + # calling the method out_string of type Main + #load the variable self_Main lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 12($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_74 - #load the variable self_EList - lw $v0, 12($fp) - sw $v0, -4($fp) - - # return the value of the function in the register $v0 - #load the variable t_74 - lw $v0, -4($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 8 - # pop the top of the stack to $fp + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $fp, 0($sp) + lw $v1, 0($sp) - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) + sw $v0, -212($fp) - jr $ra + # assign (add here the expr.to_string) to t_366 + #load the string str_38 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_38 + sw $v1, 4($v0) + sw $v0, -216($fp) - .text -cons_EList: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_367 + #load the variable t_366 + lw $v0, -216($fp) + sw $v0, -220($fp) - # push $fp to the stack - sw $fp, 0($sp) + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 28 - - # assign (add here the expr.to_string) to t_76 - li $a0, 12 - li $v0, 9 - syscall - la $a0, ECons - sw $a0, 0($v0) - sw $v0, -0($fp) - - lw $v0, -0($fp) + lw $v0, -220($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_77 - # calling the method Init_ECons of type ECons - #load the variable t_76 - lw $v0, -0($fp) + # assign (add here the expr.to_string) to t_368 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 8($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_78 - #load the variable t_77 - lw $v0, -4($fp) - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to t_79 - #load the variable e_75 - lw $v0, 12($fp) - sw $v0, -12($fp) + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # assign (add here the expr.to_string) to t_80 - #load the variable self_EList - lw $v0, 16($fp) - sw $v0, -16($fp) + sw $v0, -224($fp) - lw $v0, -8($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_369 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -228($fp) - lw $v0, -12($fp) + # assign (add here the expr.to_string) to t_370 + #load the variable t_369 + lw $v0, -228($fp) + sw $v0, -232($fp) + + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -16($fp) + lw $v0, -232($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_81 - # calling the method init of type ECons - #load the variable t_78 - lw $v0, -8($fp) + # assign (add here the expr.to_string) to t_371 + # calling the method print of type Main + #load the variable self_Main + lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 64($t0) + lw $v1, 60($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -1737,119 +6603,163 @@ cons_EList: addi $sp $sp 4 lw $v1, 0($sp) - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) + sw $v0, -236($fp) - sw $v0, -20($fp) + # assign (add here the expr.to_string) to t_372 + #load the string str_39 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_39 + sw $v1, 4($v0) + sw $v0, -240($fp) - # assign (add here the expr.to_string) to t_82 - #load the variable t_81 - lw $v0, -20($fp) - sw $v0, -24($fp) + # assign (add here the expr.to_string) to t_373 + #load the variable t_372 + lw $v0, -240($fp) + sw $v0, -244($fp) - # return the value of the function in the register $v0 - #load the variable t_82 - lw $v0, -24($fp) - move $v0, $v0 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # restore the stack pointer, frame pointer y return address - addu $sp $sp 28 - # pop the top of the stack to $fp + lw $v0, -244($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_374 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $fp, 0($sp) + lw $v1, 0($sp) - # pop the top of the stack to $ra + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $ra, 0($sp) + lw $v1, 0($sp) - jr $ra + sw $v0, -248($fp) - .text -append_EList: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_375 + #load the string str_40 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_40 + sw $v1, 4($v0) + sw $v0, -252($fp) - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_376 + #load the variable t_375 + lw $v0, -252($fp) + sw $v0, -256($fp) - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 48 + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - lw $v0, 16($fp) + lw $v0, -256($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_84 - # calling the method isNil of type EList - #load the variable self_EList - lw $v0, 16($fp) + # assign (add here the expr.to_string) to t_377 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 40($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -0($fp) + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # assign (add here the expr.to_string) to t_85 - #load the variable t_84 - lw $v0, -0($fp) - sw $v0, -4($fp) + sw $v0, -260($fp) - lw $t1, -4($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_0 - lw $v0, 16($fp) + # assign (add here the expr.to_string) to t_378 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -264($fp) + + # assign (add here the expr.to_string) to t_379 + #load the variable t_378 + lw $v0, -264($fp) + sw $v0, -268($fp) + + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_87 - # calling the method tail of type EList - #load the variable self_EList - lw $v0, 16($fp) + lw $v0, -268($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_380 + # calling the method print of type Main + #load the variable self_Main + lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 48($t0) + lw $v1, 60($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -12($fp) + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # assign (add here the expr.to_string) to t_88 - #load the variable t_87 - lw $v0, -12($fp) - sw $v0, -16($fp) + sw $v0, -272($fp) - # assign (add here the expr.to_string) to t_89 - #load the variable l_83 - lw $v0, 12($fp) - sw $v0, -20($fp) + # assign (add here the expr.to_string) to t_381 + #load the string str_41 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_41 + sw $v1, 4($v0) + sw $v0, -276($fp) - lw $v0, -16($fp) + # assign (add here the expr.to_string) to t_382 + #load the variable t_381 + lw $v0, -276($fp) + sw $v0, -280($fp) + + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -20($fp) + lw $v0, -280($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_90 - # calling the method append of type EList - #load the variable t_88 - lw $v0, -16($fp) + # assign (add here the expr.to_string) to t_383 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 56($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -1859,52 +6769,83 @@ append_EList: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -24($fp) + sw $v0, -284($fp) - # assign (add here the expr.to_string) to t_91 - #load the variable t_90 - lw $v0, -24($fp) - sw $v0, -28($fp) + # assign (add here the expr.to_string) to t_384 + #load the string str_42 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_42 + sw $v1, 4($v0) + sw $v0, -288($fp) - lw $v0, 16($fp) + # assign (add here the expr.to_string) to t_385 + #load the variable t_384 + lw $v0, -288($fp) + sw $v0, -292($fp) + + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_92 - # calling the method head of type EList - #load the variable self_EList - lw $v0, 16($fp) + lw $v0, -292($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_386 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 44($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -32($fp) + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # assign (add here the expr.to_string) to t_93 - #load the variable t_92 - lw $v0, -32($fp) - sw $v0, -36($fp) + sw $v0, -296($fp) - lw $v0, -28($fp) + # assign (add here the expr.to_string) to t_387 + #load the string str_43 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_43 + sw $v1, 4($v0) + sw $v0, -300($fp) + + # assign (add here the expr.to_string) to t_388 + #load the variable t_387 + lw $v0, -300($fp) + sw $v0, -304($fp) + + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -36($fp) + lw $v0, -304($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_94 - # calling the method cons of type EList - #load the variable t_91 - lw $v0, -28($fp) + # assign (add here the expr.to_string) to t_389 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 52($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -1914,33 +6855,38 @@ append_EList: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -40($fp) + sw $v0, -308($fp) - # assign (add here the expr.to_string) to t_86 - #load the variable t_94 - lw $v0, -40($fp) - sw $v0, -8($fp) + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - j ifend_0 - then_0: - # assign (add here the expr.to_string) to t_86 - #load the variable l_83 + # assign (add here the expr.to_string) to t_390 + # calling the method in_string of type Main + #load the variable self_Main lw $v0, 12($fp) - sw $v0, -8($fp) + lw $t0, 0($v0) + lw $v1, 32($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - ifend_0: - # assign (add here the expr.to_string) to t_95 - #load the variable t_86 - lw $v0, -8($fp) - sw $v0, -44($fp) + sw $v0, -312($fp) + + # assign (add here the expr.to_string) to t_391 + #load the variable t_390 + lw $v0, -312($fp) + sw $v0, -316($fp) # return the value of the function in the register $v0 - #load the variable t_95 - lw $v0, -44($fp) + #load the variable t_391 + lw $v0, -316($fp) move $v0, $v0 # restore the stack pointer, frame pointer y return address - addu $sp $sp 48 + addu $sp $sp 320 # pop the top of the stack to $fp addi $sp $sp 4 lw $fp, 0($sp) @@ -1952,7 +6898,7 @@ append_EList: jr $ra .text -print_EList: +prompt_Main: # save the return address and frame pointer # push $ra to the stack sw $ra, 0($sp) @@ -1964,21 +6910,21 @@ print_EList: # update the frame pointer and allocate the frame in the stack move $fp $sp - subu $sp $sp 16 + subu $sp $sp 32 - # assign (add here the expr.to_string) to t_96 - #load the string str_3 + # assign (add here the expr.to_string) to t_392 + #load the string str_44 li $a0, 8 li $v0, 9 syscall la $v1, String sw $v1, 0($v0) - la $v1, str_3 + la $v1, str_44 sw $v1, 4($v0) sw $v0, -0($fp) - # assign (add here the expr.to_string) to t_97 - #load the variable t_96 + # assign (add here the expr.to_string) to t_393 + #load the variable t_392 lw $v0, -0($fp) sw $v0, -4($fp) @@ -1987,14 +6933,57 @@ print_EList: sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -4($fp) + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_394 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -8($fp) + + # assign (add here the expr.to_string) to t_395 + #load the string str_45 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_45 + sw $v1, 4($v0) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_396 + #load the variable t_395 + lw $v0, -12($fp) + sw $v0, -16($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -16($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_98 - # calling the method out_string of type EList - #load the variable self_EList + # assign (add here the expr.to_string) to t_397 + # calling the method out_string of type Main + #load the variable self_Main lw $v0, 12($fp) lw $t0, 0($v0) lw $v1, 24($t0) @@ -2007,20 +6996,38 @@ print_EList: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -8($fp) + sw $v0, -20($fp) - # assign (add here the expr.to_string) to t_99 - #load the variable t_98 - lw $v0, -8($fp) - sw $v0, -12($fp) + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_398 + # calling the method in_string of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 32($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -24($fp) + + # assign (add here the expr.to_string) to t_399 + #load the variable t_398 + lw $v0, -24($fp) + sw $v0, -28($fp) # return the value of the function in the register $v0 - #load the variable t_99 - lw $v0, -12($fp) + #load the variable t_399 + lw $v0, -28($fp) move $v0, $v0 # restore the stack pointer, frame pointer y return address - addu $sp $sp 16 + addu $sp $sp 32 # pop the top of the stack to $fp addi $sp $sp 4 lw $fp, 0($sp) @@ -2032,7 +7039,7 @@ print_EList: jr $ra .text -Init_EList: +get_int_Main: # save the return address and frame pointer # push $ra to the stack sw $ra, 0($sp) @@ -2044,103 +7051,111 @@ Init_EList: # update the frame pointer and allocate the frame in the stack move $fp $sp - subu $sp $sp 0 + subu $sp $sp 36 - lw $v0, 12($fp) + # assign (add here the expr.to_string) to t_401 + li $a0, 4 + li $v0, 9 + syscall + la $a0, A2I + sw $a0, 0($v0) + sw $v0, -4($fp) + + lw $v0, -4($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to self_EList - jal Init_IO + # assign (add here the expr.to_string) to t_402 + # calling the method Init_A2I of type A2I + #load the variable t_401 + lw $v0, -4($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, 12($fp) + sw $v0, -8($fp) - # return the value of the function in the register $v0 - #load the variable self_EList - lw $v0, 12($fp) - move $v0, $v0 + # assign (add here the expr.to_string) to z_400 + #load the variable t_402 + lw $v0, -8($fp) + sw $v0, -0($fp) - # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # pop the top of the stack to $ra + # assign (add here the expr.to_string) to t_404 + # calling the method prompt of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 44($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra + lw $v1, 0($sp) - .text -isNil_ECons: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + sw $v0, -16($fp) - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to s_403 + #load the variable t_404 + lw $v0, -16($fp) + sw $v0, -12($fp) - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 8 + # assign (add here the expr.to_string) to t_405 + #load the variable z_400 + lw $v0, -0($fp) + sw $v0, -20($fp) - # assign (add here the expr.to_string) to t_100 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) + # assign (add here the expr.to_string) to t_406 + #load the variable s_403 + lw $v0, -12($fp) + sw $v0, -24($fp) + lw $v0, -20($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - + lw $v0, -24($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - jal compare - # pop the top of the stack to $t0 + # assign (add here the expr.to_string) to t_407 + # calling the method a2i of type A2I + #load the variable t_405 + lw $v0, -20($fp) + lw $t0, 0($v0) + lw $v1, 32($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $t0, 0($sp) + lw $v1, 0($sp) - # pop the top of the stack to $t0 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $t0, 0($sp) + lw $v1, 0($sp) - sw $v0, -0($fp) + sw $v0, -28($fp) - # assign (add here the expr.to_string) to t_101 - #load the variable t_100 - lw $v0, -0($fp) - sw $v0, -4($fp) + # assign (add here the expr.to_string) to t_408 + #load the variable t_407 + lw $v0, -28($fp) + sw $v0, -32($fp) # return the value of the function in the register $v0 - #load the variable t_101 - lw $v0, -4($fp) + #load the variable t_408 + lw $v0, -32($fp) move $v0, $v0 # restore the stack pointer, frame pointer y return address - addu $sp $sp 8 + addu $sp $sp 36 # pop the top of the stack to $fp addi $sp $sp 4 lw $fp, 0($sp) @@ -2152,7 +7167,7 @@ isNil_ECons: jr $ra .text -head_ECons: +is_even_Main: # save the return address and frame pointer # push $ra to the stack sw $ra, 0($sp) @@ -2164,282 +7179,255 @@ head_ECons: # update the frame pointer and allocate the frame in the stack move $fp $sp - subu $sp $sp 8 + subu $sp $sp 80 - # assign (add here the expr.to_string) to t_102 - lw $v1, 12($fp) - lw $v0, 4($v1) + # assign (add here the expr.to_string) to x_410 + #load the variable num_409 + lw $v0, 12($fp) sw $v0, -0($fp) - # assign (add here the expr.to_string) to t_103 - #load the variable t_102 + # assign (add here the expr.to_string) to t_411 + #load the variable x_410 lw $v0, -0($fp) - sw $v0, -4($fp) + move $t1, $v0 + lw $t1, 4($t1) + # push $t1 to the stack + sw $t1, 0($sp) + addi $sp $sp -4 - # return the value of the function in the register $v0 - #load the variable t_103 - lw $v0, -4($fp) - move $v0, $v0 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) - # restore the stack pointer, frame pointer y return address - addu $sp $sp 8 - # pop the top of the stack to $fp + # pop the top of the stack to $t1 addi $sp $sp 4 - lw $fp, 0($sp) + lw $t1, 0($sp) - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) + move $t2, $v0 + lw $t2, 4($t2) + slt $t3, $t1, $t2 + la $t4, Bool + li $a0, 8 + li $v0, 9 + syscall + sw $t4, 0($v0) + sw $t3, 4($v0) + sw $v0, -4($fp) - jr $ra + # assign (add here the expr.to_string) to t_412 + #load the variable t_411 + lw $v0, -4($fp) + sw $v0, -8($fp) - .text -tail_ECons: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + lw $t1, -8($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_31 + # assign (add here the expr.to_string) to t_414 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) - # push $fp to the stack - sw $fp, 0($sp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 8 - - # assign (add here the expr.to_string) to t_104 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_105 - #load the variable t_104 + #load the variable x_410 lw $v0, -0($fp) - sw $v0, -4($fp) - - # return the value of the function in the register $v0 - #load the variable t_105 - lw $v0, -4($fp) - move $v0, $v0 + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # restore the stack pointer, frame pointer y return address - addu $sp $sp 8 - # pop the top of the stack to $fp + jal compare + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $fp, 0($sp) + lw $t0, 0($sp) - # pop the top of the stack to $ra + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -init_ECons: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 + lw $t0, 0($sp) - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 4 + sw $v0, -16($fp) - # Setting value of the attribute car in the instance self_ECons to e_106 - #load the variable e_106 - lw $v0, 16($fp) - move $s2, $v0 - lw $v1, 20($fp) - sw $s2, 4($v1) + # assign (add here the expr.to_string) to t_415 + #load the variable t_414 + lw $v0, -16($fp) + sw $v0, -20($fp) - # Setting value of the attribute cdr in the instance self_ECons to rest_107 - #load the variable rest_107 - lw $v0, 12($fp) - move $s2, $v0 - lw $v1, 20($fp) - sw $s2, 8($v1) + lw $t1, -20($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_32 + # assign (add here the expr.to_string) to t_417 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) - # assign (add here the expr.to_string) to t_108 - #load the variable self_ECons - lw $v0, 20($fp) - sw $v0, -0($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # return the value of the function in the register $v0 - #load the variable t_108 + #load the variable x_410 lw $v0, -0($fp) - move $v0, $v0 + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # restore the stack pointer, frame pointer y return address - addu $sp $sp 4 - # pop the top of the stack to $fp + jal compare + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $fp, 0($sp) + lw $t0, 0($sp) - # pop the top of the stack to $ra + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $ra, 0($sp) + lw $t0, 0($sp) - jr $ra + sw $v0, -28($fp) - .text -print_ECons: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_418 + #load the variable t_417 + lw $v0, -28($fp) + sw $v0, -32($fp) - # push $fp to the stack - sw $fp, 0($sp) + lw $t1, -32($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_33 + # assign (add here the expr.to_string) to t_420 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable x_410 + lw $v0, -0($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) addi $sp $sp -4 - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 28 + # Creating Int instance for atomic 2 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 2 + sw $t0, 0($v0) + sw $t1, 4($v0) - # assign (add here the expr.to_string) to t_109 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -0($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) - # assign (add here the expr.to_string) to t_110 - #load the variable t_109 - lw $v0, -0($fp) - sw $v0, -4($fp) + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -40($fp) - lw $v0, -4($fp) + # assign (add here the expr.to_string) to t_421 + #load the variable t_420 + lw $v0, -40($fp) + sw $v0, -44($fp) + + lw $v0, 16($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_111 - # calling the method print of type Edge - #load the variable t_110 - lw $v0, -4($fp) - lw $t0, 0($v0) - lw $v1, 44($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to t_112 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_113 - #load the variable t_112 - lw $v0, -12($fp) - sw $v0, -16($fp) - - lw $v0, -16($fp) + lw $v0, -44($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_114 - # calling the method print of type EList - #load the variable t_113 - lw $v0, -16($fp) + # assign (add here the expr.to_string) to t_422 + # calling the method is_even of type Main + #load the variable self_Main + lw $v0, 16($fp) lw $t0, 0($v0) - lw $v1, 60($t0) + lw $v1, 52($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -20($fp) - - # assign (add here the expr.to_string) to t_115 - #load the variable t_114 - lw $v0, -20($fp) - sw $v0, -24($fp) - - # return the value of the function in the register $v0 - #load the variable t_115 - lw $v0, -24($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 28 - # pop the top of the stack to $fp + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $fp, 0($sp) + lw $v1, 0($sp) - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) + sw $v0, -48($fp) - jr $ra + # assign (add here the expr.to_string) to t_419 + #load the variable t_422 + lw $v0, -48($fp) + sw $v0, -36($fp) - .text -Init_ECons: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + j ifend_33 + then_33: + # assign (add here the expr.to_string) to t_423 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) - # push $fp to the stack - sw $fp, 0($sp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 0 + # Creating Int instance for atomic 1 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 1 + sw $t0, 0($v0) + sw $t1, 4($v0) - lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to self_ECons - jal Init_EList - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, 12($fp) - - # return the value of the function in the register $v0 - #load the variable self_ECons - lw $v0, 12($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 - # pop the top of the stack to $fp + jal compare + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $fp, 0($sp) + lw $t0, 0($sp) - # pop the top of the stack to $ra + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra + lw $t0, 0($sp) - .text -isNil_VList: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + sw $v0, -52($fp) - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_419 + #load the variable t_423 + lw $v0, -52($fp) + sw $v0, -36($fp) - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 8 + ifend_33: + # assign (add here the expr.to_string) to t_416 + #load the variable t_419 + lw $v0, -36($fp) + sw $v0, -24($fp) - # assign (add here the expr.to_string) to t_116 + j ifend_32 + then_32: + # assign (add here the expr.to_string) to t_424 # Creating Int instance for atomic 0 li $a0, 8 li $v0, 9 @@ -2475,80 +7463,108 @@ isNil_VList: addi $sp $sp 4 lw $t0, 0($sp) - sw $v0, -0($fp) + sw $v0, -56($fp) - # assign (add here the expr.to_string) to t_117 - #load the variable t_116 + # assign (add here the expr.to_string) to t_416 + #load the variable t_424 + lw $v0, -56($fp) + sw $v0, -24($fp) + + ifend_32: + # assign (add here the expr.to_string) to t_413 + #load the variable t_416 + lw $v0, -24($fp) + sw $v0, -12($fp) + + j ifend_31 + then_31: + # assign (add here the expr.to_string) to t_425 + #load the variable x_410 lw $v0, -0($fp) - sw $v0, -4($fp) + sw $v0, -60($fp) - # return the value of the function in the register $v0 - #load the variable t_117 - lw $v0, -4($fp) - move $v0, $v0 + # assign (add here the expr.to_string) to t_426 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) - # restore the stack pointer, frame pointer y return address - addu $sp $sp 8 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 - # pop the top of the stack to $ra + #load the variable t_425 + lw $v0, -60($fp) + lw $t1, 4($v0) + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $ra, 0($sp) + lw $t0, 0($sp) - jr $ra + sub $t0, $t0, $t1 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -64($fp) - .text -head_VList: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_427 + #load the variable t_426 + lw $v0, -64($fp) + sw $v0, -68($fp) - # push $fp to the stack - sw $fp, 0($sp) + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 12 - - lw $v0, 12($fp) + lw $v0, -68($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_118 - # calling the method abort of type VList - #load the variable self_VList - lw $v0, 12($fp) + # assign (add here the expr.to_string) to t_428 + # calling the method is_even of type Main + #load the variable self_Main + lw $v0, 16($fp) lw $t0, 0($v0) - lw $v1, 12($t0) + lw $v1, 52($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -0($fp) + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # assign (add here the expr.to_string) to t_119 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -4($fp) + sw $v0, -72($fp) - # assign (add here the expr.to_string) to t_120 - #load the variable t_119 - lw $v0, -4($fp) - sw $v0, -8($fp) + # assign (add here the expr.to_string) to t_413 + #load the variable t_428 + lw $v0, -72($fp) + sw $v0, -12($fp) + + ifend_31: + # assign (add here the expr.to_string) to t_429 + #load the variable t_413 + lw $v0, -12($fp) + sw $v0, -76($fp) # return the value of the function in the register $v0 - #load the variable t_120 - lw $v0, -8($fp) + #load the variable t_429 + lw $v0, -76($fp) move $v0, $v0 # restore the stack pointer, frame pointer y return address - addu $sp $sp 12 + addu $sp $sp 80 # pop the top of the stack to $fp addi $sp $sp 4 lw $fp, 0($sp) @@ -2560,7 +7576,7 @@ head_VList: jr $ra .text -tail_VList: +class_type_Main: # save the return address and frame pointer # push $ra to the stack sw $ra, 0($sp) @@ -2572,325 +7588,361 @@ tail_VList: # update the frame pointer and allocate the frame in the stack move $fp $sp - subu $sp $sp 8 - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 + subu $sp $sp 116 - # assign (add here the expr.to_string) to t_121 - # calling the method abort of type VList - #load the variable self_VList + # assign (add here the expr.to_string) to t_431 + #load the variable var_430 lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 12($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - sw $v0, -0($fp) - # assign (add here the expr.to_string) to t_122 - #load the variable self_VList - lw $v0, 12($fp) + # assign (add here the expr.to_string) to t_432 + li $a0, 8 + li $v0, 9 + syscall + move $t0, $v0 + #load the variable t_431 + lw $v0, -0($fp) + la $t1, type + lw $t2, 0($v0) + sw $t1, 0($t0) + sw $t2, 4($t0) + move $v0, $t0 sw $v0, -4($fp) - # return the value of the function in the register $v0 - #load the variable t_122 + # assign (add here the expr.to_string) to t_433 + #load the variable t_432 lw $v0, -4($fp) - move $v0, $v0 + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # restore the stack pointer, frame pointer y return address - addu $sp $sp 8 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) + li $a0, 8 + li $v0, 9 + syscall + la $t0, type + la $t1, E + sw $t0, 0($v0) + sw $t1, 4($v0) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # pop the top of the stack to $ra + jal compare + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $ra, 0($sp) + lw $t0, 0($sp) - jr $ra + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) - .text -cons_VList: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + sw $v0, -8($fp) - # push $fp to the stack - sw $fp, 0($sp) + lw $t1, -8($fp) + lw $t0, 4($t1) + bne $t0, $zero, case_0_E + # assign (add here the expr.to_string) to t_433 + #load the variable t_432 + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 28 - - # assign (add here the expr.to_string) to t_124 - li $a0, 12 + li $a0, 8 li $v0, 9 syscall - la $a0, VCons - sw $a0, 0($v0) - sw $v0, -0($fp) - - lw $v0, -0($fp) + la $t0, type + la $t1, D + sw $t0, 0($v0) + sw $t1, 4($v0) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_125 - # calling the method Init_VCons of type VCons - #load the variable t_124 - lw $v0, -0($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 + jal compare + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $v1, 0($sp) + lw $t0, 0($sp) - sw $v0, -4($fp) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) - # assign (add here the expr.to_string) to t_126 - #load the variable t_125 - lw $v0, -4($fp) sw $v0, -8($fp) - # assign (add here the expr.to_string) to t_127 - #load the variable v_123 - lw $v0, 12($fp) - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_128 - #load the variable self_VList - lw $v0, 16($fp) - sw $v0, -16($fp) - - lw $v0, -8($fp) + lw $t1, -8($fp) + lw $t0, 4($t1) + bne $t0, $zero, case_0_D + # assign (add here the expr.to_string) to t_433 + #load the variable t_432 + lw $v0, -4($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -12($fp) + li $a0, 8 + li $v0, 9 + syscall + la $t0, type + la $t1, C + sw $t0, 0($v0) + sw $t1, 4($v0) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -16($fp) + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -8($fp) + + lw $t1, -8($fp) + lw $t0, 4($t1) + bne $t0, $zero, case_0_C + # assign (add here the expr.to_string) to t_433 + #load the variable t_432 + lw $v0, -4($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_129 - # calling the method init of type VCons - #load the variable t_126 - lw $v0, -8($fp) - lw $t0, 0($v0) - lw $v1, 60($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) + li $a0, 8 + li $v0, 9 + syscall + la $t0, type + la $t1, B + sw $t0, 0($v0) + sw $t1, 4($v0) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # pop the top of the stack to $v1 + jal compare + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $v1, 0($sp) + lw $t0, 0($sp) - # pop the top of the stack to $v1 + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $v1, 0($sp) + lw $t0, 0($sp) - sw $v0, -20($fp) + sw $v0, -8($fp) - # assign (add here the expr.to_string) to t_130 - #load the variable t_129 - lw $v0, -20($fp) - sw $v0, -24($fp) + lw $t1, -8($fp) + lw $t0, 4($t1) + bne $t0, $zero, case_0_B + # assign (add here the expr.to_string) to t_433 + #load the variable t_432 + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # return the value of the function in the register $v0 - #load the variable t_130 - lw $v0, -24($fp) - move $v0, $v0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, type + la $t1, A + sw $t0, 0($v0) + sw $t1, 4($v0) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # restore the stack pointer, frame pointer y return address - addu $sp $sp 28 - # pop the top of the stack to $fp + jal compare + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $fp, 0($sp) + lw $t0, 0($sp) - # pop the top of the stack to $ra + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra + lw $t0, 0($sp) - .text -print_VList: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + sw $v0, -8($fp) - # push $fp to the stack - sw $fp, 0($sp) + lw $t1, -8($fp) + lw $t0, 4($t1) + bne $t0, $zero, case_0_A + # assign (add here the expr.to_string) to t_433 + #load the variable t_432 + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 16 - - # assign (add here the expr.to_string) to t_131 - #load the string str_4 li $a0, 8 li $v0, 9 syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_4 - sw $v1, 4($v0) - sw $v0, -0($fp) + la $t0, type + la $t1, Object + sw $t0, 0($v0) + sw $t1, 4($v0) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) - # assign (add here the expr.to_string) to t_132 - #load the variable t_131 - lw $v0, -0($fp) - sw $v0, -4($fp) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) - lw $v0, 12($fp) + sw $v0, -8($fp) + + lw $t1, -8($fp) + lw $t0, 4($t1) + bne $t0, $zero, case_0_Object + # assign (add here the expr.to_string) to t_433 + #load the variable t_432 + lw $v0, -4($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -4($fp) + li $a0, 8 + li $v0, 9 + syscall + la $t0, type + la $t1, A2I + sw $t0, 0($v0) + sw $t1, 4($v0) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_133 - # calling the method out_string of type VList - #load the variable self_VList - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 + jal compare + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $v1, 0($sp) + lw $t0, 0($sp) - # pop the top of the stack to $v1 + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $v1, 0($sp) + lw $t0, 0($sp) sw $v0, -8($fp) - # assign (add here the expr.to_string) to t_134 - #load the variable t_133 - lw $v0, -8($fp) - sw $v0, -12($fp) + lw $t1, -8($fp) + lw $t0, 4($t1) + bne $t0, $zero, case_0_Object + # assign (add here the expr.to_string) to t_433 + #load the variable t_432 + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # return the value of the function in the register $v0 - #load the variable t_134 - lw $v0, -12($fp) - move $v0, $v0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, type + la $t1, Bool + sw $t0, 0($v0) + sw $t1, 4($v0) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # restore the stack pointer, frame pointer y return address - addu $sp $sp 16 - # pop the top of the stack to $fp + jal compare + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $fp, 0($sp) + lw $t0, 0($sp) - # pop the top of the stack to $ra + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra + lw $t0, 0($sp) - .text -Init_VList: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + sw $v0, -8($fp) - # push $fp to the stack - sw $fp, 0($sp) + lw $t1, -8($fp) + lw $t0, 4($t1) + bne $t0, $zero, case_0_Object + # assign (add here the expr.to_string) to t_433 + #load the variable t_432 + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 0 - - lw $v0, 12($fp) + li $a0, 8 + li $v0, 9 + syscall + la $t0, type + la $t1, String + sw $t0, 0($v0) + sw $t1, 4($v0) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to self_VList - jal Init_IO - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, 12($fp) - - # return the value of the function in the register $v0 - #load the variable self_VList - lw $v0, 12($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 - # pop the top of the stack to $fp + jal compare + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $fp, 0($sp) + lw $t0, 0($sp) - # pop the top of the stack to $ra + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra + lw $t0, 0($sp) - .text -isNil_VCons: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + sw $v0, -8($fp) - # push $fp to the stack - sw $fp, 0($sp) + lw $t1, -8($fp) + lw $t0, 4($t1) + bne $t0, $zero, case_0_Object + # assign (add here the expr.to_string) to t_433 + #load the variable t_432 + lw $v0, -4($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 8 - - # assign (add here the expr.to_string) to t_135 - # Creating Int instance for atomic 0 li $a0, 8 li $v0, 9 syscall - la $t0, Int - li $t1, 0 + la $t0, type + la $t1, Int sw $t0, 0($v0) sw $t1, 4($v0) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -8($fp) + lw $t1, -8($fp) + lw $t0, 4($t1) + bne $t0, $zero, case_0_Object + # assign (add here the expr.to_string) to t_433 + #load the variable t_432 + lw $v0, -4($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # Creating Int instance for atomic 1 li $a0, 8 li $v0, 9 syscall - la $t0, Int - li $t1, 1 + la $t0, type + la $t1, IO sw $t0, 0($v0) sw $t1, 4($v0) - # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 @@ -2904,293 +7956,386 @@ isNil_VCons: addi $sp $sp 4 lw $t0, 0($sp) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_136 - #load the variable t_135 - lw $v0, -0($fp) - sw $v0, -4($fp) + sw $v0, -8($fp) - # return the value of the function in the register $v0 - #load the variable t_136 + lw $t1, -8($fp) + lw $t0, 4($t1) + bne $t0, $zero, case_0_Object + # assign (add here the expr.to_string) to t_433 + #load the variable t_432 lw $v0, -4($fp) - move $v0, $v0 + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # restore the stack pointer, frame pointer y return address - addu $sp $sp 8 - # pop the top of the stack to $fp + li $a0, 8 + li $v0, 9 + syscall + la $t0, type + la $t1, Main + sw $t0, 0($v0) + sw $t1, 4($v0) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $fp, 0($sp) + lw $t0, 0($sp) - # pop the top of the stack to $ra + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $ra, 0($sp) + lw $t0, 0($sp) - jr $ra + sw $v0, -8($fp) - .text -head_VCons: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) + lw $t1, -8($fp) + lw $t0, 4($t1) + bne $t0, $zero, case_0_Object + case_0_A: + # assign (add here the expr.to_string) to a_435 + #load the variable var_430 + lw $v0, 12($fp) + sw $v0, -16($fp) + + # assign (add here the expr.to_string) to t_436 + #load the string str_46 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_46 + sw $v1, 4($v0) + sw $v0, -20($fp) + + # assign (add here the expr.to_string) to t_437 + #load the variable t_436 + lw $v0, -20($fp) + sw $v0, -24($fp) + + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # push $fp to the stack - sw $fp, 0($sp) + lw $v0, -24($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 8 + # assign (add here the expr.to_string) to t_438 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # assign (add here the expr.to_string) to t_137 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -0($fp) + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # assign (add here the expr.to_string) to t_138 - #load the variable t_137 - lw $v0, -0($fp) - sw $v0, -4($fp) + sw $v0, -28($fp) - # return the value of the function in the register $v0 - #load the variable t_138 - lw $v0, -4($fp) - move $v0, $v0 + # assign (add here the expr.to_string) to t_434 + #load the variable t_438 + lw $v0, -28($fp) + sw $v0, -12($fp) - # restore the stack pointer, frame pointer y return address - addu $sp $sp 8 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) + j case_0_end + case_0_B: + # assign (add here the expr.to_string) to b_439 + #load the variable var_430 + lw $v0, 12($fp) + sw $v0, -32($fp) - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) + # assign (add here the expr.to_string) to t_440 + #load the string str_47 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_47 + sw $v1, 4($v0) + sw $v0, -36($fp) - jr $ra + # assign (add here the expr.to_string) to t_441 + #load the variable t_440 + lw $v0, -36($fp) + sw $v0, -40($fp) - .text -tail_VCons: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # push $fp to the stack - sw $fp, 0($sp) + lw $v0, -40($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 8 + # assign (add here the expr.to_string) to t_442 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # assign (add here the expr.to_string) to t_139 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -0($fp) + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # assign (add here the expr.to_string) to t_140 - #load the variable t_139 - lw $v0, -0($fp) - sw $v0, -4($fp) + sw $v0, -44($fp) - # return the value of the function in the register $v0 - #load the variable t_140 - lw $v0, -4($fp) - move $v0, $v0 + # assign (add here the expr.to_string) to t_434 + #load the variable t_442 + lw $v0, -44($fp) + sw $v0, -12($fp) - # restore the stack pointer, frame pointer y return address - addu $sp $sp 8 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) + j case_0_end + case_0_C: + # assign (add here the expr.to_string) to c_443 + #load the variable var_430 + lw $v0, 12($fp) + sw $v0, -48($fp) - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) + # assign (add here the expr.to_string) to t_444 + #load the string str_48 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_48 + sw $v1, 4($v0) + sw $v0, -52($fp) - jr $ra + # assign (add here the expr.to_string) to t_445 + #load the variable t_444 + lw $v0, -52($fp) + sw $v0, -56($fp) - .text -init_VCons: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # push $fp to the stack - sw $fp, 0($sp) + lw $v0, -56($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 4 - - # Setting value of the attribute car in the instance self_VCons to v_141 - #load the variable v_141 + # assign (add here the expr.to_string) to t_446 + # calling the method out_string of type Main + #load the variable self_Main lw $v0, 16($fp) - move $s2, $v0 - lw $v1, 20($fp) - sw $s2, 4($v1) - - # Setting value of the attribute cdr in the instance self_VCons to rest_142 - #load the variable rest_142 - lw $v0, 12($fp) - move $s2, $v0 - lw $v1, 20($fp) - sw $s2, 8($v1) - - # assign (add here the expr.to_string) to t_143 - #load the variable self_VCons - lw $v0, 20($fp) - sw $v0, -0($fp) - - # return the value of the function in the register $v0 - #load the variable t_143 - lw $v0, -0($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 4 - # pop the top of the stack to $fp + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $fp, 0($sp) + lw $v1, 0($sp) - # pop the top of the stack to $ra + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $ra, 0($sp) + lw $v1, 0($sp) - jr $ra + sw $v0, -60($fp) - .text -print_VCons: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_434 + #load the variable t_446 + lw $v0, -60($fp) + sw $v0, -12($fp) - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 + j case_0_end + case_0_D: + # assign (add here the expr.to_string) to d_447 + #load the variable var_430 + lw $v0, 12($fp) + sw $v0, -64($fp) - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 28 + # assign (add here the expr.to_string) to t_448 + #load the string str_49 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_49 + sw $v1, 4($v0) + sw $v0, -68($fp) - # assign (add here the expr.to_string) to t_144 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -0($fp) + # assign (add here the expr.to_string) to t_449 + #load the variable t_448 + lw $v0, -68($fp) + sw $v0, -72($fp) - # assign (add here the expr.to_string) to t_145 - #load the variable t_144 - lw $v0, -0($fp) - sw $v0, -4($fp) + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - lw $v0, -4($fp) + lw $v0, -72($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_146 - # calling the method print of type Vertice - #load the variable t_145 - lw $v0, -4($fp) + # assign (add here the expr.to_string) to t_450 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 16($fp) lw $t0, 0($v0) - lw $v1, 56($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -8($fp) + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # assign (add here the expr.to_string) to t_147 - lw $v1, 12($fp) - lw $v0, 8($v1) + sw $v0, -76($fp) + + # assign (add here the expr.to_string) to t_434 + #load the variable t_450 + lw $v0, -76($fp) sw $v0, -12($fp) - # assign (add here the expr.to_string) to t_148 - #load the variable t_147 - lw $v0, -12($fp) - sw $v0, -16($fp) + j case_0_end + case_0_E: + # assign (add here the expr.to_string) to e_451 + #load the variable var_430 + lw $v0, 12($fp) + sw $v0, -80($fp) - lw $v0, -16($fp) + # assign (add here the expr.to_string) to t_452 + #load the string str_50 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_50 + sw $v1, 4($v0) + sw $v0, -84($fp) + + # assign (add here the expr.to_string) to t_453 + #load the variable t_452 + lw $v0, -84($fp) + sw $v0, -88($fp) + + lw $v0, 16($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_149 - # calling the method print of type VList - #load the variable t_148 - lw $v0, -16($fp) + lw $v0, -88($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_454 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 16($fp) lw $t0, 0($v0) - lw $v1, 56($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -20($fp) - - # assign (add here the expr.to_string) to t_150 - #load the variable t_149 - lw $v0, -20($fp) - sw $v0, -24($fp) + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # return the value of the function in the register $v0 - #load the variable t_150 - lw $v0, -24($fp) - move $v0, $v0 + sw $v0, -92($fp) - # restore the stack pointer, frame pointer y return address - addu $sp $sp 28 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) + # assign (add here the expr.to_string) to t_434 + #load the variable t_454 + lw $v0, -92($fp) + sw $v0, -12($fp) - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) + j case_0_end + case_0_Object: + # assign (add here the expr.to_string) to o_455 + #load the variable var_430 + lw $v0, 12($fp) + sw $v0, -96($fp) - jr $ra + # assign (add here the expr.to_string) to t_456 + #load the string str_51 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_51 + sw $v1, 4($v0) + sw $v0, -100($fp) - .text -Init_VCons: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_457 + #load the variable t_456 + lw $v0, -100($fp) + sw $v0, -104($fp) - # push $fp to the stack - sw $fp, 0($sp) + lw $v0, 16($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 0 - - lw $v0, 12($fp) + lw $v0, -104($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to self_VCons - jal Init_VList + # assign (add here the expr.to_string) to t_458 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 16($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, 12($fp) + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -108($fp) + + # assign (add here the expr.to_string) to t_434 + #load the variable t_458 + lw $v0, -108($fp) + sw $v0, -12($fp) + + j case_0_end + case_0_end: + # assign (add here the expr.to_string) to t_459 + #load the variable t_434 + lw $v0, -12($fp) + sw $v0, -112($fp) # return the value of the function in the register $v0 - #load the variable self_VCons - lw $v0, 12($fp) + #load the variable t_459 + lw $v0, -112($fp) move $v0, $v0 # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 + addu $sp $sp 116 # pop the top of the stack to $fp addi $sp $sp 4 lw $fp, 0($sp) @@ -3202,7 +8347,7 @@ Init_VCons: jr $ra .text -read_input_Parse: +print_Main: # save the return address and frame pointer # push $ra to the stack sw $ra, 0($sp) @@ -3214,13 +8359,13 @@ read_input_Parse: # update the frame pointer and allocate the frame in the stack move $fp $sp - subu $sp $sp 108 + subu $sp $sp 56 - # assign (add here the expr.to_string) to t_154 - li $a0, 12 + # assign (add here the expr.to_string) to t_462 + li $a0, 4 li $v0, 9 syscall - la $a0, Graph + la $a0, A2I sw $a0, 0($v0) sw $v0, -4($fp) @@ -3229,9 +8374,9 @@ read_input_Parse: sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_155 - # calling the method Init_Graph of type Graph - #load the variable t_154 + # assign (add here the expr.to_string) to t_463 + # calling the method Init_A2I of type A2I + #load the variable t_462 lw $v0, -4($fp) lw $t0, 0($v0) lw $v1, 8($t0) @@ -3242,176 +8387,60 @@ read_input_Parse: sw $v0, -8($fp) - # assign (add here the expr.to_string) to g_153 - #load the variable t_155 + # assign (add here the expr.to_string) to z_461 + #load the variable t_463 lw $v0, -8($fp) sw $v0, -0($fp) + # assign (add here the expr.to_string) to t_464 + #load the variable z_461 + lw $v0, -0($fp) + sw $v0, -12($fp) + + # assign (add here the expr.to_string) to t_465 + #load the variable var_460 lw $v0, 12($fp) + sw $v0, -16($fp) + + lw $v0, -16($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_157 - # calling the method in_string of type Parse - #load the variable self_Parse - lw $v0, 12($fp) + # assign (add here the expr.to_string) to t_466 + # calling the method value of type A + #load the variable t_465 + lw $v0, -16($fp) lw $t0, 0($v0) - lw $v1, 32($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -16($fp) - - # assign (add here the expr.to_string) to line_156 - #load the variable t_157 - lw $v0, -16($fp) - sw $v0, -12($fp) - - while_0: - # assign (add here the expr.to_string) to t_158 - lw $v1, 12($fp) - lw $v0, 4($v1) sw $v0, -20($fp) - # assign (add here the expr.to_string) to t_159 - #load the variable t_158 + # assign (add here the expr.to_string) to t_467 + #load the variable t_466 lw $v0, -20($fp) sw $v0, -24($fp) - # assign (add here the expr.to_string) to t_160 - #load the string str_5 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_5 - sw $v1, 4($v0) - sw $v0, -28($fp) - - # assign (add here the expr.to_string) to t_161 - #load the variable line_156 - lw $v0, -12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_160 - lw $v0, -28($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -32($fp) - - # assign (add here the expr.to_string) to t_162 - #load the variable t_161 - lw $v0, -32($fp) - sw $v0, -36($fp) - - # assign (add here the expr.to_string) to t_163 - #load the variable t_162 - lw $v0, -36($fp) - lw $t0, 4($v0) - li $t1, 1 - xor $t0, $t0, $t1 - andi $t0, $t0, 0x01 - sw $t0, 4($v0) - sw $v0, -40($fp) - - # assign (add here the expr.to_string) to t_164 - #load the variable t_163 - lw $v0, -40($fp) - sw $v0, -44($fp) - - # assign (add here the expr.to_string) to t_165 - #load the string str_6 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_6 - sw $v1, 4($v0) - sw $v0, -48($fp) - - # assign (add here the expr.to_string) to t_166 - #load the variable line_156 lw $v0, -12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - #load the variable t_165 - lw $v0, -48($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -52($fp) - - # assign (add here the expr.to_string) to t_167 - #load the variable t_166 - lw $v0, -52($fp) - sw $v0, -56($fp) - - # assign (add here the expr.to_string) to t_168 - #load the variable t_167 - lw $v0, -56($fp) - lw $t0, 4($v0) - li $t1, 1 - xor $t0, $t0, $t1 - andi $t0, $t0, 0x01 - sw $t0, 4($v0) - sw $v0, -60($fp) - - # assign (add here the expr.to_string) to t_169 - #load the variable t_168 - lw $v0, -60($fp) - sw $v0, -64($fp) - lw $v0, -24($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -44($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -64($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_170 - # calling the method and of type BoolOp - #load the variable t_159 - lw $v0, -24($fp) + # assign (add here the expr.to_string) to t_468 + # calling the method i2a of type A2I + #load the variable t_464 + lw $v0, -12($fp) lw $t0, 0($v0) - lw $v1, 24($t0) + lw $v1, 40($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -3421,48 +8450,29 @@ read_input_Parse: addi $sp $sp 4 lw $v1, 0($sp) - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -68($fp) - - # assign (add here the expr.to_string) to t_171 - #load the variable t_170 - lw $v0, -68($fp) - sw $v0, -72($fp) - - lw $t1, -72($fp) - lw $t0, 4($t1) - bne $t0, $zero, body_0 - j pool_0 - body_0: - # assign (add here the expr.to_string) to t_173 - #load the variable g_153 - lw $v0, -0($fp) - sw $v0, -80($fp) + sw $v0, -28($fp) - # assign (add here the expr.to_string) to t_174 - #load the variable line_156 - lw $v0, -12($fp) - sw $v0, -84($fp) + # assign (add here the expr.to_string) to t_469 + #load the variable t_468 + lw $v0, -28($fp) + sw $v0, -32($fp) - lw $v0, 12($fp) + lw $v0, 16($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -84($fp) + lw $v0, -32($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_175 - # calling the method parse_line of type Parse - #load the variable self_Parse - lw $v0, 12($fp) + # assign (add here the expr.to_string) to t_470 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 16($fp) lw $t0, 0($v0) - lw $v1, 44($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -3472,27 +8482,38 @@ read_input_Parse: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -88($fp) + sw $v0, -36($fp) - # assign (add here the expr.to_string) to t_176 - #load the variable t_175 - lw $v0, -88($fp) - sw $v0, -92($fp) + # assign (add here the expr.to_string) to t_471 + #load the string str_52 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_52 + sw $v1, 4($v0) + sw $v0, -40($fp) - lw $v0, -80($fp) + # assign (add here the expr.to_string) to t_472 + #load the variable t_471 + lw $v0, -40($fp) + sw $v0, -44($fp) + + lw $v0, 16($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -92($fp) + lw $v0, -44($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_177 - # calling the method add_vertice of type Graph - #load the variable t_173 - lw $v0, -80($fp) + # assign (add here the expr.to_string) to t_473 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 16($fp) lw $t0, 0($v0) lw $v1, 24($t0) jal $v1 @@ -3504,50 +8525,20 @@ read_input_Parse: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -96($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_178 - # calling the method in_string of type Parse - #load the variable self_Parse - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 32($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -100($fp) - - # assign (add here the expr.to_string) to line_156 - #load the variable t_178 - lw $v0, -100($fp) - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_172 - #load the variable line_156 - lw $v0, -12($fp) - sw $v0, -76($fp) + sw $v0, -48($fp) - j while_0 - pool_0: - # assign (add here the expr.to_string) to t_179 - #load the variable g_153 - lw $v0, -0($fp) - sw $v0, -104($fp) + # assign (add here the expr.to_string) to t_474 + #load the variable t_473 + lw $v0, -48($fp) + sw $v0, -52($fp) # return the value of the function in the register $v0 - #load the variable t_179 - lw $v0, -104($fp) + #load the variable t_474 + lw $v0, -52($fp) move $v0, $v0 # restore the stack pointer, frame pointer y return address - addu $sp $sp 108 + addu $sp $sp 56 # pop the top of the stack to $fp addi $sp $sp 4 lw $fp, 0($sp) @@ -3559,7 +8550,7 @@ read_input_Parse: jr $ra .text -parse_line_Parse: +main_Main: # save the return address and frame pointer # push $ra to the stack sw $ra, 0($sp) @@ -3571,25 +8562,25 @@ parse_line_Parse: # update the frame pointer and allocate the frame in the stack move $fp $sp - subu $sp $sp 148 + subu $sp $sp 968 - # assign (add here the expr.to_string) to t_182 - li $a0, 12 + # assign (add here the expr.to_string) to t_475 + li $a0, 8 li $v0, 9 syscall - la $a0, Vertice + la $a0, A sw $a0, 0($v0) - sw $v0, -4($fp) + sw $v0, -0($fp) - lw $v0, -4($fp) + lw $v0, -0($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_183 - # calling the method Init_Vertice of type Vertice - #load the variable t_182 - lw $v0, -4($fp) + # assign (add here the expr.to_string) to t_476 + # calling the method Init_A of type A + #load the variable t_475 + lw $v0, -0($fp) lw $t0, 0($v0) lw $v1, 8($t0) jal $v1 @@ -3597,51 +8588,48 @@ parse_line_Parse: addi $sp $sp 4 lw $v1, 0($sp) + sw $v0, -4($fp) + + # Setting value of the attribute avar in the instance self_Main to t_476 + #load the variable t_476 + lw $v0, -4($fp) + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 8($v1) + + while_2: + # assign (add here the expr.to_string) to t_477 + lw $v1, 12($fp) + lw $v0, 16($v1) sw $v0, -8($fp) - # assign (add here the expr.to_string) to t_184 - #load the variable t_183 + # assign (add here the expr.to_string) to t_478 + #load the variable t_477 lw $v0, -8($fp) sw $v0, -12($fp) - # assign (add here the expr.to_string) to t_185 - #load the variable s_180 - lw $v0, 12($fp) - sw $v0, -16($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_186 - # calling the method a2i of type Parse - #load the variable self_Parse - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 52($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - + lw $t1, -12($fp) + lw $t0, 4($t1) + bne $t0, $zero, body_2 + j pool_2 + body_2: + # assign (add here the expr.to_string) to t_480 + #load the string str_53 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_53 + sw $v1, 4($v0) sw $v0, -20($fp) - # assign (add here the expr.to_string) to t_187 - #load the variable t_186 + # assign (add here the expr.to_string) to t_481 + #load the variable t_480 lw $v0, -20($fp) sw $v0, -24($fp) - lw $v0, -12($fp) + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 @@ -3651,12 +8639,12 @@ parse_line_Parse: sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_188 - # calling the method init of type Vertice - #load the variable t_184 - lw $v0, -12($fp) + # assign (add here the expr.to_string) to t_482 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 48($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -3668,162 +8656,90 @@ parse_line_Parse: sw $v0, -28($fp) - # assign (add here the expr.to_string) to v_181 - #load the variable t_188 - lw $v0, -28($fp) - sw $v0, -0($fp) - - while_1: - # assign (add here the expr.to_string) to t_189 - lw $v1, 16($fp) + # assign (add here the expr.to_string) to t_483 + lw $v1, 12($fp) lw $v0, 8($v1) sw $v0, -32($fp) - # assign (add here the expr.to_string) to t_190 - #load the variable t_189 + # assign (add here the expr.to_string) to t_484 + #load the variable t_483 lw $v0, -32($fp) sw $v0, -36($fp) - lw $v0, -36($fp) + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_191 - # calling the method length of type String - #load the variable t_190 lw $v0, -36($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_485 + # calling the method print of type Main + #load the variable self_Main + lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 24($t0) + lw $v1, 60($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -40($fp) - - # assign (add here the expr.to_string) to t_192 - #load the variable t_191 - lw $v0, -40($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $t0, 0($sp) + lw $v1, 0($sp) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) + sw $v0, -40($fp) + # assign (add here the expr.to_string) to t_486 + lw $v1, 12($fp) + lw $v0, 8($v1) sw $v0, -44($fp) - # assign (add here the expr.to_string) to t_193 - #load the variable t_192 + # assign (add here the expr.to_string) to t_487 + #load the variable t_486 lw $v0, -44($fp) sw $v0, -48($fp) - # assign (add here the expr.to_string) to t_194 - #load the variable t_193 lw $v0, -48($fp) - lw $t0, 4($v0) - li $t1, 1 - xor $t0, $t0, $t1 - andi $t0, $t0, 0x01 - sw $t0, 4($v0) - sw $v0, -52($fp) - - # assign (add here the expr.to_string) to t_195 - #load the variable t_194 - lw $v0, -52($fp) - sw $v0, -56($fp) - - lw $t1, -56($fp) - lw $t0, 4($t1) - bne $t0, $zero, body_1 - j pool_1 - body_1: - # assign (add here the expr.to_string) to t_198 - lw $v1, 16($fp) - lw $v0, 8($v1) - sw $v0, -68($fp) - - # assign (add here the expr.to_string) to t_199 - #load the variable t_198 - lw $v0, -68($fp) - sw $v0, -72($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -72($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_200 - # calling the method a2i of type Parse - #load the variable self_Parse - lw $v0, 16($fp) + # assign (add here the expr.to_string) to t_488 + # calling the method value of type A + #load the variable t_487 + lw $v0, -48($fp) lw $t0, 0($v0) - lw $v1, 52($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -76($fp) - - # assign (add here the expr.to_string) to succ_197 - #load the variable t_200 - lw $v0, -76($fp) - sw $v0, -64($fp) - - # assign (add here the expr.to_string) to t_202 - lw $v1, 16($fp) - lw $v0, 8($v1) - sw $v0, -84($fp) + sw $v0, -52($fp) - # assign (add here the expr.to_string) to t_203 - #load the variable t_202 - lw $v0, -84($fp) - sw $v0, -88($fp) + # assign (add here the expr.to_string) to t_489 + #load the variable t_488 + lw $v0, -52($fp) + sw $v0, -56($fp) - lw $v0, 16($fp) + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -88($fp) + lw $v0, -56($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_204 - # calling the method a2i of type Parse - #load the variable self_Parse - lw $v0, 16($fp) + # assign (add here the expr.to_string) to t_490 + # calling the method is_even of type Main + #load the variable self_Main + lw $v0, 12($fp) lw $t0, 0($v0) lw $v1, 52($t0) jal $v1 @@ -3835,113 +8751,98 @@ parse_line_Parse: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -92($fp) - - # assign (add here the expr.to_string) to weight_201 - #load the variable t_204 - lw $v0, -92($fp) - sw $v0, -80($fp) + sw $v0, -60($fp) - # assign (add here the expr.to_string) to t_205 - #load the variable v_181 - lw $v0, -0($fp) - sw $v0, -96($fp) + # assign (add here the expr.to_string) to t_491 + #load the variable t_490 + lw $v0, -60($fp) + sw $v0, -64($fp) - # assign (add here the expr.to_string) to t_206 - li $a0, 16 + lw $t1, -64($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_34 + # assign (add here the expr.to_string) to t_493 + #load the string str_54 + li $a0, 8 li $v0, 9 syscall - la $a0, Edge - sw $a0, 0($v0) - sw $v0, -100($fp) + la $v1, String + sw $v1, 0($v0) + la $v1, str_54 + sw $v1, 4($v0) + sw $v0, -72($fp) - lw $v0, -100($fp) + # assign (add here the expr.to_string) to t_494 + #load the variable t_493 + lw $v0, -72($fp) + sw $v0, -76($fp) + + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_207 - # calling the method Init_Edge of type Edge - #load the variable t_206 - lw $v0, -100($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -104($fp) - - # assign (add here the expr.to_string) to t_208 - #load the variable t_207 - lw $v0, -104($fp) - sw $v0, -108($fp) - - # assign (add here the expr.to_string) to t_209 - #load the variable v_181 - lw $v0, -0($fp) - sw $v0, -112($fp) - - lw $v0, -112($fp) + lw $v0, -76($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_210 - # calling the method number of type Vertice - #load the variable t_209 - lw $v0, -112($fp) + # assign (add here the expr.to_string) to t_495 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 44($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -116($fp) - - # assign (add here the expr.to_string) to t_211 - #load the variable t_210 - lw $v0, -116($fp) - sw $v0, -120($fp) + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # assign (add here the expr.to_string) to t_212 - #load the variable succ_197 - lw $v0, -64($fp) - sw $v0, -124($fp) + sw $v0, -80($fp) - # assign (add here the expr.to_string) to t_213 - #load the variable weight_201 + # assign (add here the expr.to_string) to t_492 + #load the variable t_495 lw $v0, -80($fp) - sw $v0, -128($fp) + sw $v0, -68($fp) - lw $v0, -108($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 + j ifend_34 + then_34: + # assign (add here the expr.to_string) to t_496 + #load the string str_55 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_55 + sw $v1, 4($v0) + sw $v0, -84($fp) - lw $v0, -120($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_497 + #load the variable t_496 + lw $v0, -84($fp) + sw $v0, -88($fp) - lw $v0, -124($fp) + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -128($fp) + lw $v0, -88($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_214 - # calling the method init of type Edge - #load the variable t_208 - lw $v0, -108($fp) + # assign (add here the expr.to_string) to t_498 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 40($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -3951,37 +8852,40 @@ parse_line_Parse: addi $sp $sp 4 lw $v1, 0($sp) - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) + sw $v0, -92($fp) - sw $v0, -132($fp) + # assign (add here the expr.to_string) to t_492 + #load the variable t_498 + lw $v0, -92($fp) + sw $v0, -68($fp) - # assign (add here the expr.to_string) to t_215 - #load the variable t_214 - lw $v0, -132($fp) - sw $v0, -136($fp) + ifend_34: + # assign (add here the expr.to_string) to t_499 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -96($fp) + # assign (add here the expr.to_string) to t_500 + #load the variable t_499 lw $v0, -96($fp) + sw $v0, -100($fp) + + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -136($fp) + lw $v0, -100($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_216 - # calling the method add_out of type Vertice - #load the variable t_205 - lw $v0, -96($fp) + # assign (add here the expr.to_string) to t_501 + # calling the method class_type of type Main + #load the variable self_Main + lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 52($t0) + lw $v1, 56($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -3991,72 +8895,58 @@ parse_line_Parse: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -140($fp) - - # assign (add here the expr.to_string) to t_196 - #load the variable t_216 - lw $v0, -140($fp) - sw $v0, -60($fp) - - j while_1 - pool_1: - # assign (add here the expr.to_string) to t_217 - #load the variable v_181 - lw $v0, -0($fp) - sw $v0, -144($fp) - - # return the value of the function in the register $v0 - #load the variable t_217 - lw $v0, -144($fp) - move $v0, $v0 + sw $v0, -104($fp) - # restore the stack pointer, frame pointer y return address - addu $sp $sp 148 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # pop the top of the stack to $ra + # assign (add here the expr.to_string) to t_502 + # calling the method menu of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 40($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra + lw $v1, 0($sp) - .text -c2i_Parse: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + sw $v0, -108($fp) - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 + # Setting value of the attribute char in the instance self_Main to t_502 + #load the variable t_502 + lw $v0, -108($fp) + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 4($v1) - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 168 + # assign (add here the expr.to_string) to t_503 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -112($fp) - # assign (add here the expr.to_string) to t_219 - #load the string str_7 + # assign (add here the expr.to_string) to t_504 + #load the string str_56 li $a0, 8 li $v0, 9 syscall la $v1, String sw $v1, 0($v0) - la $v1, str_7 + la $v1, str_56 sw $v1, 4($v0) - sw $v0, -0($fp) + sw $v0, -116($fp) - # assign (add here the expr.to_string) to t_220 - #load the variable char_218 - lw $v0, 12($fp) + # assign (add here the expr.to_string) to t_505 + #load the variable t_503 + lw $v0, -112($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - #load the variable t_219 - lw $v0, -0($fp) + #load the variable t_504 + lw $v0, -116($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 @@ -4070,36 +8960,41 @@ c2i_Parse: addi $sp $sp 4 lw $t0, 0($sp) - sw $v0, -4($fp) + sw $v0, -120($fp) - # assign (add here the expr.to_string) to t_221 - #load the variable t_220 - lw $v0, -4($fp) - sw $v0, -8($fp) + # assign (add here the expr.to_string) to t_506 + #load the variable t_505 + lw $v0, -120($fp) + sw $v0, -124($fp) - lw $t1, -8($fp) + lw $t1, -124($fp) lw $t0, 4($t1) - bne $t0, $zero, then_1 - # assign (add here the expr.to_string) to t_223 - #load the string str_8 + bne $t0, $zero, then_35 + # assign (add here the expr.to_string) to t_508 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -132($fp) + + # assign (add here the expr.to_string) to t_509 + #load the string str_57 li $a0, 8 li $v0, 9 syscall la $v1, String sw $v1, 0($v0) - la $v1, str_8 + la $v1, str_57 sw $v1, 4($v0) - sw $v0, -16($fp) + sw $v0, -136($fp) - # assign (add here the expr.to_string) to t_224 - #load the variable char_218 - lw $v0, 12($fp) + # assign (add here the expr.to_string) to t_510 + #load the variable t_508 + lw $v0, -132($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - #load the variable t_223 - lw $v0, -16($fp) + #load the variable t_509 + lw $v0, -136($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 @@ -4113,36 +9008,41 @@ c2i_Parse: addi $sp $sp 4 lw $t0, 0($sp) - sw $v0, -20($fp) + sw $v0, -140($fp) - # assign (add here the expr.to_string) to t_225 - #load the variable t_224 - lw $v0, -20($fp) - sw $v0, -24($fp) + # assign (add here the expr.to_string) to t_511 + #load the variable t_510 + lw $v0, -140($fp) + sw $v0, -144($fp) - lw $t1, -24($fp) + lw $t1, -144($fp) lw $t0, 4($t1) - bne $t0, $zero, then_2 - # assign (add here the expr.to_string) to t_227 - #load the string str_9 + bne $t0, $zero, then_36 + # assign (add here the expr.to_string) to t_513 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -152($fp) + + # assign (add here the expr.to_string) to t_514 + #load the string str_58 li $a0, 8 li $v0, 9 syscall la $v1, String sw $v1, 0($v0) - la $v1, str_9 + la $v1, str_58 sw $v1, 4($v0) - sw $v0, -32($fp) + sw $v0, -156($fp) - # assign (add here the expr.to_string) to t_228 - #load the variable char_218 - lw $v0, 12($fp) + # assign (add here the expr.to_string) to t_515 + #load the variable t_513 + lw $v0, -152($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - #load the variable t_227 - lw $v0, -32($fp) + #load the variable t_514 + lw $v0, -156($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 @@ -4156,36 +9056,41 @@ c2i_Parse: addi $sp $sp 4 lw $t0, 0($sp) - sw $v0, -36($fp) + sw $v0, -160($fp) - # assign (add here the expr.to_string) to t_229 - #load the variable t_228 - lw $v0, -36($fp) - sw $v0, -40($fp) + # assign (add here the expr.to_string) to t_516 + #load the variable t_515 + lw $v0, -160($fp) + sw $v0, -164($fp) - lw $t1, -40($fp) + lw $t1, -164($fp) lw $t0, 4($t1) - bne $t0, $zero, then_3 - # assign (add here the expr.to_string) to t_231 - #load the string str_10 + bne $t0, $zero, then_37 + # assign (add here the expr.to_string) to t_518 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -172($fp) + + # assign (add here the expr.to_string) to t_519 + #load the string str_59 li $a0, 8 li $v0, 9 syscall la $v1, String sw $v1, 0($v0) - la $v1, str_10 + la $v1, str_59 sw $v1, 4($v0) - sw $v0, -48($fp) + sw $v0, -176($fp) - # assign (add here the expr.to_string) to t_232 - #load the variable char_218 - lw $v0, 12($fp) + # assign (add here the expr.to_string) to t_520 + #load the variable t_518 + lw $v0, -172($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - #load the variable t_231 - lw $v0, -48($fp) + #load the variable t_519 + lw $v0, -176($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 @@ -4199,36 +9104,41 @@ c2i_Parse: addi $sp $sp 4 lw $t0, 0($sp) - sw $v0, -52($fp) + sw $v0, -180($fp) - # assign (add here the expr.to_string) to t_233 - #load the variable t_232 - lw $v0, -52($fp) - sw $v0, -56($fp) + # assign (add here the expr.to_string) to t_521 + #load the variable t_520 + lw $v0, -180($fp) + sw $v0, -184($fp) - lw $t1, -56($fp) + lw $t1, -184($fp) lw $t0, 4($t1) - bne $t0, $zero, then_4 - # assign (add here the expr.to_string) to t_235 - #load the string str_11 + bne $t0, $zero, then_38 + # assign (add here the expr.to_string) to t_523 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -192($fp) + + # assign (add here the expr.to_string) to t_524 + #load the string str_60 li $a0, 8 li $v0, 9 syscall la $v1, String sw $v1, 0($v0) - la $v1, str_11 + la $v1, str_60 sw $v1, 4($v0) - sw $v0, -64($fp) + sw $v0, -196($fp) - # assign (add here the expr.to_string) to t_236 - #load the variable char_218 - lw $v0, 12($fp) + # assign (add here the expr.to_string) to t_525 + #load the variable t_523 + lw $v0, -192($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - #load the variable t_235 - lw $v0, -64($fp) + #load the variable t_524 + lw $v0, -196($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 @@ -4242,36 +9152,41 @@ c2i_Parse: addi $sp $sp 4 lw $t0, 0($sp) - sw $v0, -68($fp) + sw $v0, -200($fp) - # assign (add here the expr.to_string) to t_237 - #load the variable t_236 - lw $v0, -68($fp) - sw $v0, -72($fp) + # assign (add here the expr.to_string) to t_526 + #load the variable t_525 + lw $v0, -200($fp) + sw $v0, -204($fp) - lw $t1, -72($fp) + lw $t1, -204($fp) lw $t0, 4($t1) - bne $t0, $zero, then_5 - # assign (add here the expr.to_string) to t_239 - #load the string str_12 + bne $t0, $zero, then_39 + # assign (add here the expr.to_string) to t_528 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -212($fp) + + # assign (add here the expr.to_string) to t_529 + #load the string str_61 li $a0, 8 li $v0, 9 syscall la $v1, String sw $v1, 0($v0) - la $v1, str_12 + la $v1, str_61 sw $v1, 4($v0) - sw $v0, -80($fp) + sw $v0, -216($fp) - # assign (add here the expr.to_string) to t_240 - #load the variable char_218 - lw $v0, 12($fp) + # assign (add here the expr.to_string) to t_530 + #load the variable t_528 + lw $v0, -212($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - #load the variable t_239 - lw $v0, -80($fp) + #load the variable t_529 + lw $v0, -216($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 @@ -4285,36 +9200,41 @@ c2i_Parse: addi $sp $sp 4 lw $t0, 0($sp) - sw $v0, -84($fp) + sw $v0, -220($fp) - # assign (add here the expr.to_string) to t_241 - #load the variable t_240 - lw $v0, -84($fp) - sw $v0, -88($fp) + # assign (add here the expr.to_string) to t_531 + #load the variable t_530 + lw $v0, -220($fp) + sw $v0, -224($fp) - lw $t1, -88($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_6 - # assign (add here the expr.to_string) to t_243 - #load the string str_13 + lw $t1, -224($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_40 + # assign (add here the expr.to_string) to t_533 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -232($fp) + + # assign (add here the expr.to_string) to t_534 + #load the string str_62 li $a0, 8 li $v0, 9 syscall la $v1, String sw $v1, 0($v0) - la $v1, str_13 + la $v1, str_62 sw $v1, 4($v0) - sw $v0, -96($fp) + sw $v0, -236($fp) - # assign (add here the expr.to_string) to t_244 - #load the variable char_218 - lw $v0, 12($fp) + # assign (add here the expr.to_string) to t_535 + #load the variable t_533 + lw $v0, -232($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - #load the variable t_243 - lw $v0, -96($fp) + #load the variable t_534 + lw $v0, -236($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 @@ -4328,36 +9248,41 @@ c2i_Parse: addi $sp $sp 4 lw $t0, 0($sp) - sw $v0, -100($fp) + sw $v0, -240($fp) - # assign (add here the expr.to_string) to t_245 - #load the variable t_244 - lw $v0, -100($fp) - sw $v0, -104($fp) + # assign (add here the expr.to_string) to t_536 + #load the variable t_535 + lw $v0, -240($fp) + sw $v0, -244($fp) - lw $t1, -104($fp) + lw $t1, -244($fp) lw $t0, 4($t1) - bne $t0, $zero, then_7 - # assign (add here the expr.to_string) to t_247 - #load the string str_14 + bne $t0, $zero, then_41 + # assign (add here the expr.to_string) to t_538 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -252($fp) + + # assign (add here the expr.to_string) to t_539 + #load the string str_63 li $a0, 8 li $v0, 9 syscall la $v1, String sw $v1, 0($v0) - la $v1, str_14 + la $v1, str_63 sw $v1, 4($v0) - sw $v0, -112($fp) + sw $v0, -256($fp) - # assign (add here the expr.to_string) to t_248 - #load the variable char_218 - lw $v0, 12($fp) + # assign (add here the expr.to_string) to t_540 + #load the variable t_538 + lw $v0, -252($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - #load the variable t_247 - lw $v0, -112($fp) + #load the variable t_539 + lw $v0, -256($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 @@ -4371,36 +9296,41 @@ c2i_Parse: addi $sp $sp 4 lw $t0, 0($sp) - sw $v0, -116($fp) + sw $v0, -260($fp) - # assign (add here the expr.to_string) to t_249 - #load the variable t_248 - lw $v0, -116($fp) - sw $v0, -120($fp) + # assign (add here the expr.to_string) to t_541 + #load the variable t_540 + lw $v0, -260($fp) + sw $v0, -264($fp) - lw $t1, -120($fp) + lw $t1, -264($fp) lw $t0, 4($t1) - bne $t0, $zero, then_8 - # assign (add here the expr.to_string) to t_251 - #load the string str_15 + bne $t0, $zero, then_42 + # assign (add here the expr.to_string) to t_543 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -272($fp) + + # assign (add here the expr.to_string) to t_544 + #load the string str_64 li $a0, 8 li $v0, 9 syscall la $v1, String sw $v1, 0($v0) - la $v1, str_15 + la $v1, str_64 sw $v1, 4($v0) - sw $v0, -128($fp) + sw $v0, -276($fp) - # assign (add here the expr.to_string) to t_252 - #load the variable char_218 - lw $v0, 12($fp) + # assign (add here the expr.to_string) to t_545 + #load the variable t_543 + lw $v0, -272($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - #load the variable t_251 - lw $v0, -128($fp) + #load the variable t_544 + lw $v0, -276($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 @@ -4414,36 +9344,41 @@ c2i_Parse: addi $sp $sp 4 lw $t0, 0($sp) - sw $v0, -132($fp) + sw $v0, -280($fp) - # assign (add here the expr.to_string) to t_253 - #load the variable t_252 - lw $v0, -132($fp) - sw $v0, -136($fp) + # assign (add here the expr.to_string) to t_546 + #load the variable t_545 + lw $v0, -280($fp) + sw $v0, -284($fp) - lw $t1, -136($fp) + lw $t1, -284($fp) lw $t0, 4($t1) - bne $t0, $zero, then_9 - # assign (add here the expr.to_string) to t_255 - #load the string str_16 + bne $t0, $zero, then_43 + # assign (add here the expr.to_string) to t_548 + lw $v1, 12($fp) + lw $v0, 4($v1) + sw $v0, -292($fp) + + # assign (add here the expr.to_string) to t_549 + #load the string str_65 li $a0, 8 li $v0, 9 syscall la $v1, String sw $v1, 0($v0) - la $v1, str_16 + la $v1, str_65 sw $v1, 4($v0) - sw $v0, -144($fp) + sw $v0, -296($fp) - # assign (add here the expr.to_string) to t_256 - #load the variable char_218 - lw $v0, 12($fp) + # assign (add here the expr.to_string) to t_550 + #load the variable t_548 + lw $v0, -292($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - #load the variable t_255 - lw $v0, -144($fp) + #load the variable t_549 + lw $v0, -296($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 @@ -4457,209 +9392,135 @@ c2i_Parse: addi $sp $sp 4 lw $t0, 0($sp) - sw $v0, -148($fp) + sw $v0, -300($fp) - # assign (add here the expr.to_string) to t_257 - #load the variable t_256 - lw $v0, -148($fp) - sw $v0, -152($fp) + # assign (add here the expr.to_string) to t_551 + #load the variable t_550 + lw $v0, -300($fp) + sw $v0, -304($fp) - lw $t1, -152($fp) + lw $t1, -304($fp) lw $t0, 4($t1) - bne $t0, $zero, then_10 - lw $v0, 16($fp) + bne $t0, $zero, then_44 + # assign (add here the expr.to_string) to t_553 + li $a0, 8 + li $v0, 9 + syscall + la $a0, A + sw $a0, 0($v0) + sw $v0, -312($fp) + + lw $v0, -312($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_259 - # calling the method abort of type Parse - #load the variable self_Parse - lw $v0, 16($fp) + # assign (add here the expr.to_string) to t_554 + # calling the method Init_A of type A + #load the variable t_553 + lw $v0, -312($fp) lw $t0, 0($v0) - lw $v1, 12($t0) + lw $v1, 8($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -160($fp) - - # assign (add here the expr.to_string) to t_258 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -156($fp) - - j ifend_10 - then_10: - # assign (add here the expr.to_string) to t_258 - # Creating Int instance for atomic 9 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 9 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -156($fp) - - ifend_10: - # assign (add here the expr.to_string) to t_254 - #load the variable t_258 - lw $v0, -156($fp) - sw $v0, -140($fp) - - j ifend_9 - then_9: - # assign (add here the expr.to_string) to t_254 - # Creating Int instance for atomic 8 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 8 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -140($fp) - - ifend_9: - # assign (add here the expr.to_string) to t_250 - #load the variable t_254 - lw $v0, -140($fp) - sw $v0, -124($fp) - - j ifend_8 - then_8: - # assign (add here the expr.to_string) to t_250 - # Creating Int instance for atomic 7 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 7 - sw $t0, 0($v0) - sw $t1, 4($v0) + sw $v0, -316($fp) - sw $v0, -124($fp) + # assign (add here the expr.to_string) to t_555 + #load the variable t_554 + lw $v0, -316($fp) + sw $v0, -320($fp) - ifend_8: - # assign (add here the expr.to_string) to t_246 - #load the variable t_250 - lw $v0, -124($fp) - sw $v0, -108($fp) + # assign (add here the expr.to_string) to t_556 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -324($fp) - j ifend_7 - then_7: - # assign (add here the expr.to_string) to t_246 - # Creating Int instance for atomic 6 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 6 - sw $t0, 0($v0) - sw $t1, 4($v0) + # assign (add here the expr.to_string) to t_557 + #load the variable t_556 + lw $v0, -324($fp) + sw $v0, -328($fp) - sw $v0, -108($fp) + lw $v0, -328($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - ifend_7: - # assign (add here the expr.to_string) to t_242 - #load the variable t_246 - lw $v0, -108($fp) - sw $v0, -92($fp) + # assign (add here the expr.to_string) to t_558 + # calling the method value of type A + #load the variable t_557 + lw $v0, -328($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - j ifend_6 - then_6: - # assign (add here the expr.to_string) to t_242 - # Creating Int instance for atomic 5 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 5 - sw $t0, 0($v0) - sw $t1, 4($v0) + sw $v0, -332($fp) - sw $v0, -92($fp) + # assign (add here the expr.to_string) to t_559 + #load the variable t_558 + lw $v0, -332($fp) + sw $v0, -336($fp) - ifend_6: - # assign (add here the expr.to_string) to t_238 - #load the variable t_242 - lw $v0, -92($fp) - sw $v0, -76($fp) + lw $v0, -320($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - j ifend_5 - then_5: - # assign (add here the expr.to_string) to t_238 - # Creating Int instance for atomic 4 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 4 - sw $t0, 0($v0) - sw $t1, 4($v0) + lw $v0, -336($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - sw $v0, -76($fp) + # assign (add here the expr.to_string) to t_560 + # calling the method method1 of type A + #load the variable t_555 + lw $v0, -320($fp) + lw $t0, 0($v0) + lw $v1, 32($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - ifend_5: - # assign (add here the expr.to_string) to t_234 - #load the variable t_238 - lw $v0, -76($fp) - sw $v0, -60($fp) + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - j ifend_4 - then_4: - # assign (add here the expr.to_string) to t_234 - # Creating Int instance for atomic 3 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 3 - sw $t0, 0($v0) - sw $t1, 4($v0) + sw $v0, -340($fp) - sw $v0, -60($fp) + # Setting value of the attribute avar in the instance self_Main to t_560 + #load the variable t_560 + lw $v0, -340($fp) + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 8($v1) - ifend_4: - # assign (add here the expr.to_string) to t_230 - #load the variable t_234 - lw $v0, -60($fp) - sw $v0, -44($fp) + # assign (add here the expr.to_string) to t_552 + #load the variable t_560 + lw $v0, -340($fp) + sw $v0, -308($fp) - j ifend_3 - then_3: - # assign (add here the expr.to_string) to t_230 - # Creating Int instance for atomic 2 + j ifend_44 + then_44: + # assign (add here the expr.to_string) to t_561 + # Creating Int instance for atomic 0 li $a0, 8 li $v0, 9 syscall la $t0, Int - li $t1, 2 + li $t1, 0 sw $t0, 0($v0) sw $t1, 4($v0) - sw $v0, -44($fp) - - ifend_3: - # assign (add here the expr.to_string) to t_226 - #load the variable t_230 - lw $v0, -44($fp) - sw $v0, -28($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - j ifend_2 - then_2: - # assign (add here the expr.to_string) to t_226 # Creating Int instance for atomic 1 li $a0, 8 li $v0, 9 @@ -4669,80 +9530,202 @@ c2i_Parse: sw $t0, 0($v0) sw $t1, 4($v0) - sw $v0, -28($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - ifend_2: - # assign (add here the expr.to_string) to t_222 - #load the variable t_226 - lw $v0, -28($fp) - sw $v0, -12($fp) + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) - j ifend_1 - then_1: - # assign (add here the expr.to_string) to t_222 - # Creating Int instance for atomic 0 + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -344($fp) + + # Setting value of the attribute flag in the instance self_Main to t_561 + #load the variable t_561 + lw $v0, -344($fp) + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 16($v1) + + # assign (add here the expr.to_string) to t_552 + #load the variable t_561 + lw $v0, -344($fp) + sw $v0, -308($fp) + + ifend_44: + # assign (add here the expr.to_string) to t_547 + #load the variable t_552 + lw $v0, -308($fp) + sw $v0, -288($fp) + + j ifend_43 + then_43: + # assign (add here the expr.to_string) to t_562 li $a0, 8 li $v0, 9 syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) + la $a0, A + sw $a0, 0($v0) + sw $v0, -348($fp) - sw $v0, -12($fp) + lw $v0, -348($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - ifend_1: - # assign (add here the expr.to_string) to t_260 - #load the variable t_222 - lw $v0, -12($fp) - sw $v0, -164($fp) + # assign (add here the expr.to_string) to t_563 + # calling the method Init_A of type A + #load the variable t_562 + lw $v0, -348($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # return the value of the function in the register $v0 - #load the variable t_260 - lw $v0, -164($fp) - move $v0, $v0 + sw $v0, -352($fp) - # restore the stack pointer, frame pointer y return address - addu $sp $sp 168 - # pop the top of the stack to $fp + # Setting value of the attribute avar in the instance self_Main to t_563 + #load the variable t_563 + lw $v0, -352($fp) + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 8($v1) + + # assign (add here the expr.to_string) to t_547 + #load the variable t_563 + lw $v0, -352($fp) + sw $v0, -288($fp) + + ifend_43: + # assign (add here the expr.to_string) to t_542 + #load the variable t_547 + lw $v0, -288($fp) + sw $v0, -268($fp) + + j ifend_42 + then_42: + # assign (add here the expr.to_string) to t_565 + li $a0, 8 + li $v0, 9 + syscall + la $a0, E + sw $a0, 0($v0) + sw $v0, -360($fp) + + lw $v0, -360($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_566 + # calling the method Init_E of type E + #load the variable t_565 + lw $v0, -360($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $fp, 0($sp) + lw $v1, 0($sp) - # pop the top of the stack to $ra + sw $v0, -364($fp) + + # assign (add here the expr.to_string) to t_567 + #load the variable t_566 + lw $v0, -364($fp) + sw $v0, -368($fp) + + # assign (add here the expr.to_string) to t_568 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -372($fp) + + # assign (add here the expr.to_string) to t_569 + #load the variable t_568 + lw $v0, -372($fp) + sw $v0, -376($fp) + + lw $v0, -376($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_570 + # calling the method value of type A + #load the variable t_569 + lw $v0, -376($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $ra, 0($sp) + lw $v1, 0($sp) - jr $ra + sw $v0, -380($fp) - .text -a2i_Parse: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) + # assign (add here the expr.to_string) to t_571 + #load the variable t_570 + lw $v0, -380($fp) + sw $v0, -384($fp) + + lw $v0, -368($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # push $fp to the stack - sw $fp, 0($sp) + lw $v0, -384($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 176 + # assign (add here the expr.to_string) to t_572 + # calling the method method6 of type E + #load the variable t_567 + lw $v0, -368($fp) + lw $t0, 0($v0) + lw $v1, 56($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # assign (add here the expr.to_string) to t_262 - #load the variable s_261 - lw $v0, 12($fp) - sw $v0, -0($fp) + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - lw $v0, -0($fp) + sw $v0, -388($fp) + + # assign (add here the expr.to_string) to x_564 + #load the variable t_572 + lw $v0, -388($fp) + sw $v0, -356($fp) + + # assign (add here the expr.to_string) to t_574 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -396($fp) + + # assign (add here the expr.to_string) to t_575 + #load the variable t_574 + lw $v0, -396($fp) + sw $v0, -400($fp) + + lw $v0, -400($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_263 - # calling the method length of type String - #load the variable t_262 - lw $v0, -0($fp) + # assign (add here the expr.to_string) to t_576 + # calling the method value of type A + #load the variable t_575 + lw $v0, -400($fp) lw $t0, 0($v0) lw $v1, 24($t0) jal $v1 @@ -4750,97 +9733,206 @@ a2i_Parse: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -4($fp) + sw $v0, -404($fp) - # assign (add here the expr.to_string) to t_264 - #load the variable t_263 - lw $v0, -4($fp) + # assign (add here the expr.to_string) to t_577 + #load the variable x_564 + lw $v0, -356($fp) + sw $v0, -408($fp) + + lw $v0, -408($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # Creating Int instance for atomic 0 + # assign (add here the expr.to_string) to t_578 + # calling the method value of type A + #load the variable t_577 + lw $v0, -408($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -412($fp) + + # assign (add here the expr.to_string) to t_579 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_578 + lw $v0, -412($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + # Creating Int instance for atomic 8 li $a0, 8 li $v0, 9 syscall la $t0, Int - li $t1, 0 + li $t1, 8 sw $t0, 0($v0) sw $t1, 4($v0) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare + lw $t1, 4($v0) # pop the top of the stack to $t0 addi $sp $sp 4 lw $t0, 0($sp) + mult $t0, $t1 + mflo $t0 + li $a0, 8 + li $v0, 9 + syscall + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -416($fp) + + # assign (add here the expr.to_string) to t_580 + # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 + #load the variable t_576 + lw $v0, -404($fp) + lw $t0, 4($v0) + # push $t0 to the stack + sw $t0, 0($sp) + addi $sp $sp -4 + + #load the variable t_579 + lw $v0, -416($fp) + lw $t1, 4($v0) # pop the top of the stack to $t0 addi $sp $sp 4 lw $t0, 0($sp) - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to t_265 - #load the variable t_264 - lw $v0, -8($fp) - sw $v0, -12($fp) - - lw $t1, -12($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_11 - # assign (add here the expr.to_string) to t_267 - #load the variable s_261 - lw $v0, 12($fp) - sw $v0, -20($fp) - - # assign (add here the expr.to_string) to t_268 - # Creating Int instance for atomic 0 + sub $t0, $t0, $t1 li $a0, 8 li $v0, 9 syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) + la $t1, Int + sw $t1, 0($v0) + sw $t0, 4($v0) + sw $v0, -420($fp) - sw $v0, -24($fp) + # assign (add here the expr.to_string) to r_573 + #load the variable t_580 + lw $v0, -420($fp) + sw $v0, -392($fp) - # assign (add here the expr.to_string) to t_269 - # Creating Int instance for atomic 1 + # assign (add here the expr.to_string) to t_581 + #load the string str_66 li $a0, 8 li $v0, 9 syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) + la $v1, String + sw $v1, 0($v0) + la $v1, str_66 + sw $v1, 4($v0) + sw $v0, -424($fp) - sw $v0, -28($fp) + # assign (add here the expr.to_string) to t_582 + #load the variable t_581 + lw $v0, -424($fp) + sw $v0, -428($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -428($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_583 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -432($fp) + + # assign (add here the expr.to_string) to t_584 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -436($fp) + + # assign (add here the expr.to_string) to t_585 + #load the variable t_584 + lw $v0, -436($fp) + sw $v0, -440($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -440($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_586 + # calling the method print of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 60($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -444($fp) + + # assign (add here the expr.to_string) to t_587 + #load the string str_67 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_67 + sw $v1, 4($v0) + sw $v0, -448($fp) - lw $v0, -20($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_588 + #load the variable t_587 + lw $v0, -448($fp) + sw $v0, -452($fp) - lw $v0, -24($fp) + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -28($fp) + lw $v0, -452($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_270 - # calling the method substr of type String - #load the variable t_267 - lw $v0, -20($fp) + # assign (add here the expr.to_string) to t_589 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 32($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -4850,105 +9942,140 @@ a2i_Parse: addi $sp $sp 4 lw $v1, 0($sp) + sw $v0, -456($fp) + + # assign (add here the expr.to_string) to t_590 + #load the variable x_564 + lw $v0, -356($fp) + sw $v0, -460($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -460($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_591 + # calling the method print of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 60($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -32($fp) + sw $v0, -464($fp) - # assign (add here the expr.to_string) to t_271 - #load the string str_17 + # assign (add here the expr.to_string) to t_592 + #load the string str_68 li $a0, 8 li $v0, 9 syscall la $v1, String sw $v1, 0($v0) - la $v1, str_17 + la $v1, str_68 sw $v1, 4($v0) - sw $v0, -36($fp) + sw $v0, -468($fp) - # assign (add here the expr.to_string) to t_272 - #load the variable t_270 - lw $v0, -32($fp) + # assign (add here the expr.to_string) to t_593 + #load the variable t_592 + lw $v0, -468($fp) + sw $v0, -472($fp) + + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - #load the variable t_271 - lw $v0, -36($fp) + lw $v0, -472($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - jal compare - # pop the top of the stack to $t0 + # assign (add here the expr.to_string) to t_594 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $t0, 0($sp) + lw $v1, 0($sp) - # pop the top of the stack to $t0 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -40($fp) - - # assign (add here the expr.to_string) to t_273 - #load the variable t_272 - lw $v0, -40($fp) - sw $v0, -44($fp) - - lw $t1, -44($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_12 - # assign (add here the expr.to_string) to t_275 - #load the variable s_261 - lw $v0, 12($fp) - sw $v0, -52($fp) - - # assign (add here the expr.to_string) to t_276 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) + lw $v1, 0($sp) - sw $v0, -56($fp) + sw $v0, -476($fp) - # assign (add here the expr.to_string) to t_277 - # Creating Int instance for atomic 1 - li $a0, 8 + # assign (add here the expr.to_string) to t_596 + li $a0, 4 li $v0, 9 syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -60($fp) + la $a0, A2I + sw $a0, 0($v0) + sw $v0, -484($fp) - lw $v0, -52($fp) + lw $v0, -484($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -56($fp) + # assign (add here the expr.to_string) to t_597 + # calling the method Init_A2I of type A2I + #load the variable t_596 + lw $v0, -484($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -488($fp) + + # assign (add here the expr.to_string) to a_595 + #load the variable t_597 + lw $v0, -488($fp) + sw $v0, -480($fp) + + # assign (add here the expr.to_string) to t_598 + #load the variable a_595 + lw $v0, -480($fp) + sw $v0, -492($fp) + + # assign (add here the expr.to_string) to t_599 + #load the variable r_573 + lw $v0, -392($fp) + sw $v0, -496($fp) + + lw $v0, -492($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -60($fp) + lw $v0, -496($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_278 - # calling the method substr of type String - #load the variable t_275 - lw $v0, -52($fp) + # assign (add here the expr.to_string) to t_600 + # calling the method i2a of type A2I + #load the variable t_598 + lw $v0, -492($fp) lw $t0, 0($v0) - lw $v1, 32($t0) + lw $v1, 40($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -4958,76 +10085,72 @@ a2i_Parse: addi $sp $sp 4 lw $v1, 0($sp) - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -64($fp) + sw $v0, -500($fp) - # assign (add here the expr.to_string) to t_279 - #load the string str_18 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_18 - sw $v1, 4($v0) - sw $v0, -68($fp) + # assign (add here the expr.to_string) to t_601 + #load the variable t_600 + lw $v0, -500($fp) + sw $v0, -504($fp) - # assign (add here the expr.to_string) to t_280 - #load the variable t_278 - lw $v0, -64($fp) + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - #load the variable t_279 - lw $v0, -68($fp) + lw $v0, -504($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - jal compare - # pop the top of the stack to $t0 + # assign (add here the expr.to_string) to t_602 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $t0, 0($sp) + lw $v1, 0($sp) - # pop the top of the stack to $t0 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $t0, 0($sp) + lw $v1, 0($sp) - sw $v0, -72($fp) + sw $v0, -508($fp) - # assign (add here the expr.to_string) to t_281 - #load the variable t_280 - lw $v0, -72($fp) - sw $v0, -76($fp) + # assign (add here the expr.to_string) to t_603 + #load the string str_69 + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_69 + sw $v1, 4($v0) + sw $v0, -512($fp) - lw $t1, -76($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_13 - # assign (add here the expr.to_string) to t_283 - #load the variable s_261 - lw $v0, 12($fp) - sw $v0, -84($fp) + # assign (add here the expr.to_string) to t_604 + #load the variable t_603 + lw $v0, -512($fp) + sw $v0, -516($fp) - lw $v0, 16($fp) + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -84($fp) + lw $v0, -516($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_284 - # calling the method a2i_aux of type Parse - #load the variable self_Parse - lw $v0, 16($fp) + # assign (add here the expr.to_string) to t_605 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 56($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -5037,46 +10160,78 @@ a2i_Parse: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -88($fp) + sw $v0, -520($fp) - # assign (add here the expr.to_string) to t_282 - #load the variable t_284 - lw $v0, -88($fp) - sw $v0, -80($fp) + # Setting value of the attribute avar in the instance self_Main to x_564 + #load the variable x_564 + lw $v0, -356($fp) + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 8($v1) - j ifend_13 - then_13: - # assign (add here the expr.to_string) to t_285 - #load the variable s_261 - lw $v0, 12($fp) - sw $v0, -92($fp) + # assign (add here the expr.to_string) to t_542 + #load the variable x_564 + lw $v0, -356($fp) + sw $v0, -268($fp) - # assign (add here the expr.to_string) to t_286 - # Creating Int instance for atomic 1 + ifend_42: + # assign (add here the expr.to_string) to t_537 + #load the variable t_542 + lw $v0, -268($fp) + sw $v0, -248($fp) + + j ifend_41 + then_41: + # assign (add here the expr.to_string) to t_606 li $a0, 8 li $v0, 9 syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) + la $a0, D + sw $a0, 0($v0) + sw $v0, -524($fp) - sw $v0, -96($fp) + lw $v0, -524($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # assign (add here the expr.to_string) to t_287 - #load the variable s_261 - lw $v0, 12($fp) - sw $v0, -100($fp) + # assign (add here the expr.to_string) to t_607 + # calling the method Init_D of type D + #load the variable t_606 + lw $v0, -524($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - lw $v0, -100($fp) + sw $v0, -528($fp) + + # assign (add here the expr.to_string) to t_608 + #load the variable t_607 + lw $v0, -528($fp) + sw $v0, -532($fp) + + # assign (add here the expr.to_string) to t_609 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -536($fp) + + # assign (add here the expr.to_string) to t_610 + #load the variable t_609 + lw $v0, -536($fp) + sw $v0, -540($fp) + + lw $v0, -540($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_288 - # calling the method length of type String - #load the variable t_287 - lw $v0, -100($fp) + # assign (add here the expr.to_string) to t_611 + # calling the method value of type A + #load the variable t_610 + lw $v0, -540($fp) lw $t0, 0($v0) lw $v1, 24($t0) jal $v1 @@ -5084,66 +10239,80 @@ a2i_Parse: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -104($fp) + sw $v0, -544($fp) - # assign (add here the expr.to_string) to t_289 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_288 - lw $v0, -104($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) + # assign (add here the expr.to_string) to t_612 + #load the variable t_611 + lw $v0, -544($fp) + sw $v0, -548($fp) + + lw $v0, -532($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) + lw $v0, -548($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - lw $t1, 4($v0) - # pop the top of the stack to $t0 + # assign (add here the expr.to_string) to t_613 + # calling the method method7 of type D + #load the variable t_608 + lw $v0, -532($fp) + lw $t0, 0($v0) + lw $v1, 52($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $t0, 0($sp) + lw $v1, 0($sp) - sub $t0, $t0, $t1 + sw $v0, -552($fp) + + # assign (add here the expr.to_string) to t_614 + #load the variable t_613 + lw $v0, -552($fp) + sw $v0, -556($fp) + + lw $t1, -556($fp) + lw $t0, 4($t1) + bne $t0, $zero, then_45 + # assign (add here the expr.to_string) to t_616 + #load the string str_70 li $a0, 8 li $v0, 9 syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -108($fp) - - # assign (add here the expr.to_string) to t_290 - #load the variable t_289 - lw $v0, -108($fp) - sw $v0, -112($fp) + la $v1, String + sw $v1, 0($v0) + la $v1, str_70 + sw $v1, 4($v0) + sw $v0, -564($fp) - lw $v0, -92($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_617 + #load the variable t_616 + lw $v0, -564($fp) + sw $v0, -568($fp) - lw $v0, -96($fp) + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -112($fp) + lw $v0, -568($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_291 - # calling the method substr of type String - #load the variable t_285 - lw $v0, -92($fp) + # assign (add here the expr.to_string) to t_618 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 32($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -5153,33 +10322,34 @@ a2i_Parse: addi $sp $sp 4 lw $v1, 0($sp) - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) + sw $v0, -572($fp) - sw $v0, -116($fp) + # assign (add here the expr.to_string) to t_619 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -576($fp) - # assign (add here the expr.to_string) to t_292 - #load the variable t_291 - lw $v0, -116($fp) - sw $v0, -120($fp) + # assign (add here the expr.to_string) to t_620 + #load the variable t_619 + lw $v0, -576($fp) + sw $v0, -580($fp) - lw $v0, 16($fp) + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -120($fp) + lw $v0, -580($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_293 - # calling the method a2i of type Parse - #load the variable self_Parse - lw $v0, 16($fp) + # assign (add here the expr.to_string) to t_621 + # calling the method print of type Main + #load the variable self_Main + lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 52($t0) + lw $v1, 60($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -5189,52 +10359,38 @@ a2i_Parse: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -124($fp) - - # assign (add here the expr.to_string) to t_282 - #load the variable t_293 - lw $v0, -124($fp) - sw $v0, -80($fp) - - ifend_13: - # assign (add here the expr.to_string) to t_274 - #load the variable t_282 - lw $v0, -80($fp) - sw $v0, -48($fp) - - j ifend_12 - then_12: - # assign (add here the expr.to_string) to t_294 - #load the variable s_261 - lw $v0, 12($fp) - sw $v0, -128($fp) + sw $v0, -584($fp) - # assign (add here the expr.to_string) to t_295 - # Creating Int instance for atomic 1 + # assign (add here the expr.to_string) to t_622 + #load the string str_71 li $a0, 8 li $v0, 9 syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) + la $v1, String + sw $v1, 0($v0) + la $v1, str_71 + sw $v1, 4($v0) + sw $v0, -588($fp) - sw $v0, -132($fp) + # assign (add here the expr.to_string) to t_623 + #load the variable t_622 + lw $v0, -588($fp) + sw $v0, -592($fp) - # assign (add here the expr.to_string) to t_296 - #load the variable s_261 lw $v0, 12($fp) - sw $v0, -136($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - lw $v0, -136($fp) + lw $v0, -592($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_297 - # calling the method length of type String - #load the variable t_296 - lw $v0, -136($fp) + # assign (add here the expr.to_string) to t_624 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) lw $t0, 0($v0) lw $v1, 24($t0) jal $v1 @@ -5242,66 +10398,51 @@ a2i_Parse: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -140($fp) - - # assign (add here the expr.to_string) to t_298 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_297 - lw $v0, -140($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) + sw $v0, -596($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) + # assign (add here the expr.to_string) to t_615 + #load the variable t_624 + lw $v0, -596($fp) + sw $v0, -560($fp) - sub $t0, $t0, $t1 + j ifend_45 + then_45: + # assign (add here the expr.to_string) to t_625 + #load the string str_72 li $a0, 8 li $v0, 9 syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -144($fp) - - # assign (add here the expr.to_string) to t_299 - #load the variable t_298 - lw $v0, -144($fp) - sw $v0, -148($fp) + la $v1, String + sw $v1, 0($v0) + la $v1, str_72 + sw $v1, 4($v0) + sw $v0, -600($fp) - lw $v0, -128($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_626 + #load the variable t_625 + lw $v0, -600($fp) + sw $v0, -604($fp) - lw $v0, -132($fp) + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -148($fp) + lw $v0, -604($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_300 - # calling the method substr of type String - #load the variable t_294 - lw $v0, -128($fp) + # assign (add here the expr.to_string) to t_627 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 32($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -5311,33 +10452,34 @@ a2i_Parse: addi $sp $sp 4 lw $v1, 0($sp) - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) + sw $v0, -608($fp) - sw $v0, -152($fp) + # assign (add here the expr.to_string) to t_628 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -612($fp) - # assign (add here the expr.to_string) to t_301 - #load the variable t_300 - lw $v0, -152($fp) - sw $v0, -156($fp) + # assign (add here the expr.to_string) to t_629 + #load the variable t_628 + lw $v0, -612($fp) + sw $v0, -616($fp) - lw $v0, 16($fp) + lw $v0, 12($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -156($fp) + lw $v0, -616($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_302 - # calling the method a2i_aux of type Parse - #load the variable self_Parse - lw $v0, 16($fp) + # assign (add here the expr.to_string) to t_630 + # calling the method print of type Main + #load the variable self_Main + lw $v0, 12($fp) lw $t0, 0($v0) - lw $v1, 56($t0) + lw $v1, 60($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -5347,134 +10489,120 @@ a2i_Parse: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -160($fp) - - # assign (add here the expr.to_string) to t_303 - #load the variable t_302 - lw $v0, -160($fp) - sw $v0, -164($fp) - - # assign (add here the expr.to_string) to t_304 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_303 - lw $v0, -164($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -168($fp) - - # assign (add here the expr.to_string) to t_274 - #load the variable t_304 - lw $v0, -168($fp) - sw $v0, -48($fp) - - ifend_12: - # assign (add here the expr.to_string) to t_266 - #load the variable t_274 - lw $v0, -48($fp) - sw $v0, -16($fp) + sw $v0, -620($fp) - j ifend_11 - then_11: - # assign (add here the expr.to_string) to t_266 - # Creating Int instance for atomic 0 + # assign (add here the expr.to_string) to t_631 + #load the string str_73 li $a0, 8 li $v0, 9 syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) + la $v1, String + sw $v1, 0($v0) + la $v1, str_73 + sw $v1, 4($v0) + sw $v0, -624($fp) - sw $v0, -16($fp) + # assign (add here the expr.to_string) to t_632 + #load the variable t_631 + lw $v0, -624($fp) + sw $v0, -628($fp) - ifend_11: - # assign (add here the expr.to_string) to t_305 - #load the variable t_266 - lw $v0, -16($fp) - sw $v0, -172($fp) + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # return the value of the function in the register $v0 - #load the variable t_305 - lw $v0, -172($fp) - move $v0, $v0 + lw $v0, -628($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # restore the stack pointer, frame pointer y return address - addu $sp $sp 176 - # pop the top of the stack to $fp + # assign (add here the expr.to_string) to t_633 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $fp, 0($sp) + lw $v1, 0($sp) - # pop the top of the stack to $ra + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $ra, 0($sp) + lw $v1, 0($sp) - jr $ra + sw $v0, -632($fp) - .text -a2i_aux_Parse: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_615 + #load the variable t_633 + lw $v0, -632($fp) + sw $v0, -560($fp) - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 + ifend_45: + # assign (add here the expr.to_string) to t_537 + #load the variable t_615 + lw $v0, -560($fp) + sw $v0, -248($fp) - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 216 + ifend_41: + # assign (add here the expr.to_string) to t_532 + #load the variable t_537 + lw $v0, -248($fp) + sw $v0, -228($fp) - # assign (add here the expr.to_string) to int_307 - # Creating Int instance for atomic 0 + j ifend_40 + then_40: + # assign (add here the expr.to_string) to t_634 li $a0, 8 li $v0, 9 syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) + la $a0, C + sw $a0, 0($v0) + sw $v0, -636($fp) - sw $v0, -0($fp) + lw $v0, -636($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # assign (add here the expr.to_string) to t_309 - #load the variable s_306 - lw $v0, 12($fp) - sw $v0, -8($fp) + # assign (add here the expr.to_string) to t_635 + # calling the method Init_C of type C + #load the variable t_634 + lw $v0, -636($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - lw $v0, -8($fp) + sw $v0, -640($fp) + + # assign (add here the expr.to_string) to t_636 + #load the variable t_635 + lw $v0, -640($fp) + sw $v0, -644($fp) + + # assign (add here the expr.to_string) to t_637 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -648($fp) + + # assign (add here the expr.to_string) to t_638 + #load the variable t_637 + lw $v0, -648($fp) + sw $v0, -652($fp) + + lw $v0, -652($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_310 - # calling the method length of type String - #load the variable t_309 - lw $v0, -8($fp) + # assign (add here the expr.to_string) to t_639 + # calling the method value of type A + #load the variable t_638 + lw $v0, -652($fp) lw $t0, 0($v0) lw $v1, 24($t0) jal $v1 @@ -5482,110 +10610,137 @@ a2i_aux_Parse: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to j_308 - #load the variable t_310 - lw $v0, -12($fp) - sw $v0, -4($fp) + sw $v0, -656($fp) - # assign (add here the expr.to_string) to i_311 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) + # assign (add here the expr.to_string) to t_640 + #load the variable t_639 + lw $v0, -656($fp) + sw $v0, -660($fp) - sw $v0, -16($fp) + lw $v0, -644($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - while_2: - # assign (add here the expr.to_string) to t_312 - #load the variable i_311 - lw $v0, -16($fp) - move $t1, $v0 - lw $t1, 4($t1) - # push $t1 to the stack - sw $t1, 0($sp) + lw $v0, -660($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - #load the variable j_308 - lw $v0, -4($fp) - # pop the top of the stack to $t1 + # assign (add here the expr.to_string) to t_641 + # calling the method method5 of type C + la $t0, C + lw $v1, 48($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $t1, 0($sp) + lw $v1, 0($sp) - move $t2, $v0 - lw $t2, 4($t2) - slt $t3, $t1, $t2 - la $t4, Bool - li $a0, 8 - li $v0, 9 - syscall - sw $t4, 0($v0) - sw $t3, 4($v0) - sw $v0, -20($fp) + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # assign (add here the expr.to_string) to t_313 - #load the variable t_312 - lw $v0, -20($fp) - sw $v0, -24($fp) + sw $v0, -664($fp) - lw $t1, -24($fp) - lw $t0, 4($t1) - bne $t0, $zero, body_2 - j pool_2 - body_2: - # assign (add here the expr.to_string) to t_316 - #load the variable s_306 - lw $v0, 12($fp) - sw $v0, -36($fp) + # Setting value of the attribute avar in the instance self_Main to t_641 + #load the variable t_641 + lw $v0, -664($fp) + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 8($v1) - # assign (add here the expr.to_string) to t_317 - #load the variable i_311 - lw $v0, -16($fp) - sw $v0, -40($fp) + # assign (add here the expr.to_string) to t_532 + #load the variable t_641 + lw $v0, -664($fp) + sw $v0, -228($fp) - # assign (add here the expr.to_string) to t_318 - # Creating Int instance for atomic 1 + ifend_40: + # assign (add here the expr.to_string) to t_527 + #load the variable t_532 + lw $v0, -228($fp) + sw $v0, -208($fp) + + j ifend_39 + then_39: + # assign (add here the expr.to_string) to t_642 li $a0, 8 li $v0, 9 syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -44($fp) + la $a0, C + sw $a0, 0($v0) + sw $v0, -668($fp) - lw $v0, -36($fp) + lw $v0, -668($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -40($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_643 + # calling the method Init_C of type C + #load the variable t_642 + lw $v0, -668($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - lw $v0, -44($fp) + sw $v0, -672($fp) + + # assign (add here the expr.to_string) to t_644 + #load the variable t_643 + lw $v0, -672($fp) + sw $v0, -676($fp) + + # assign (add here the expr.to_string) to t_645 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -680($fp) + + # assign (add here the expr.to_string) to t_646 + #load the variable t_645 + lw $v0, -680($fp) + sw $v0, -684($fp) + + lw $v0, -684($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_319 - # calling the method substr of type String - #load the variable t_316 - lw $v0, -36($fp) + # assign (add here the expr.to_string) to t_647 + # calling the method value of type A + #load the variable t_646 + lw $v0, -684($fp) lw $t0, 0($v0) - lw $v1, 32($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) + sw $v0, -688($fp) + + # assign (add here the expr.to_string) to t_648 + #load the variable t_647 + lw $v0, -688($fp) + sw $v0, -692($fp) + + lw $v0, -676($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + lw $v0, -692($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_649 + # calling the method method5 of type B + la $t0, B + lw $v1, 48($t0) + jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) @@ -5594,211 +10749,343 @@ a2i_aux_Parse: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -48($fp) + sw $v0, -696($fp) - # assign (add here the expr.to_string) to c_315 - #load the variable t_319 - lw $v0, -48($fp) - sw $v0, -32($fp) + # Setting value of the attribute avar in the instance self_Main to t_649 + #load the variable t_649 + lw $v0, -696($fp) + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 8($v1) - # assign (add here the expr.to_string) to t_320 - #load the string str_19 + # assign (add here the expr.to_string) to t_527 + #load the variable t_649 + lw $v0, -696($fp) + sw $v0, -208($fp) + + ifend_39: + # assign (add here the expr.to_string) to t_522 + #load the variable t_527 + lw $v0, -208($fp) + sw $v0, -188($fp) + + j ifend_38 + then_38: + # assign (add here the expr.to_string) to t_650 li $a0, 8 li $v0, 9 syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_19 - sw $v1, 4($v0) - sw $v0, -52($fp) + la $a0, C + sw $a0, 0($v0) + sw $v0, -700($fp) - # assign (add here the expr.to_string) to t_321 - #load the variable c_315 - lw $v0, -32($fp) + lw $v0, -700($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - #load the variable t_320 - lw $v0, -52($fp) + # assign (add here the expr.to_string) to t_651 + # calling the method Init_C of type C + #load the variable t_650 + lw $v0, -700($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -704($fp) + + # assign (add here the expr.to_string) to t_652 + #load the variable t_651 + lw $v0, -704($fp) + sw $v0, -708($fp) + + # assign (add here the expr.to_string) to t_653 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -712($fp) + + # assign (add here the expr.to_string) to t_654 + #load the variable t_653 + lw $v0, -712($fp) + sw $v0, -716($fp) + + lw $v0, -716($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 + # assign (add here the expr.to_string) to t_655 + # calling the method value of type A + #load the variable t_654 + lw $v0, -716($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -56($fp) + lw $v1, 0($sp) - # assign (add here the expr.to_string) to t_322 - #load the variable t_321 - lw $v0, -56($fp) - sw $v0, -60($fp) + sw $v0, -720($fp) - lw $t1, -60($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_14 - # assign (add here the expr.to_string) to t_324 - #load the string str_20 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_20 - sw $v1, 4($v0) - sw $v0, -68($fp) + # assign (add here the expr.to_string) to t_656 + #load the variable t_655 + lw $v0, -720($fp) + sw $v0, -724($fp) - # assign (add here the expr.to_string) to t_325 - #load the variable c_315 - lw $v0, -32($fp) + lw $v0, -708($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - #load the variable t_324 - lw $v0, -68($fp) + lw $v0, -724($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - jal compare - # pop the top of the stack to $t0 + # assign (add here the expr.to_string) to t_657 + # calling the method method5 of type A + la $t0, A + lw $v1, 48($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $t0, 0($sp) + lw $v1, 0($sp) - # pop the top of the stack to $t0 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $t0, 0($sp) + lw $v1, 0($sp) - sw $v0, -72($fp) + sw $v0, -728($fp) - # assign (add here the expr.to_string) to t_326 - #load the variable t_325 - lw $v0, -72($fp) - sw $v0, -76($fp) + # Setting value of the attribute avar in the instance self_Main to t_657 + #load the variable t_657 + lw $v0, -728($fp) + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 8($v1) - lw $t1, -76($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_15 - # assign (add here the expr.to_string) to t_328 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable int_307 - lw $v0, -0($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_522 + #load the variable t_657 + lw $v0, -728($fp) + sw $v0, -188($fp) - # Creating Int instance for atomic 10 + ifend_38: + # assign (add here the expr.to_string) to t_517 + #load the variable t_522 + lw $v0, -188($fp) + sw $v0, -168($fp) + + j ifend_37 + then_37: + # assign (add here the expr.to_string) to t_658 li $a0, 8 li $v0, 9 syscall - la $t0, Int - li $t1, 10 - sw $t0, 0($v0) - sw $t1, 4($v0) + la $a0, A + sw $a0, 0($v0) + sw $v0, -732($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 + lw $v0, -732($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_659 + # calling the method Init_A of type A + #load the variable t_658 + lw $v0, -732($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $t0, 0($sp) + lw $v1, 0($sp) - mult $t0, $t1 - mflo $t0 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -84($fp) + sw $v0, -736($fp) + + # assign (add here the expr.to_string) to t_660 + #load the variable t_659 + lw $v0, -736($fp) + sw $v0, -740($fp) - # assign (add here the expr.to_string) to t_329 - #load the variable s_306 lw $v0, 12($fp) - sw $v0, -88($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # assign (add here the expr.to_string) to t_330 - #load the variable i_311 - lw $v0, -16($fp) - sw $v0, -92($fp) + # assign (add here the expr.to_string) to t_661 + # calling the method get_int of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 48($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # assign (add here the expr.to_string) to t_331 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) + sw $v0, -744($fp) - sw $v0, -96($fp) + # assign (add here the expr.to_string) to t_662 + #load the variable t_661 + lw $v0, -744($fp) + sw $v0, -748($fp) - lw $v0, -88($fp) + lw $v0, -740($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -92($fp) + lw $v0, -748($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -96($fp) + # assign (add here the expr.to_string) to t_663 + # calling the method set_var of type A + #load the variable t_660 + lw $v0, -740($fp) + lw $t0, 0($v0) + lw $v1, 28($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -752($fp) + + # Setting value of the attribute a_var in the instance self_Main to t_663 + #load the variable t_663 + lw $v0, -752($fp) + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 12($v1) + + # assign (add here the expr.to_string) to t_664 + li $a0, 8 + li $v0, 9 + syscall + la $a0, D + sw $a0, 0($v0) + sw $v0, -756($fp) + + lw $v0, -756($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_332 - # calling the method substr of type String - #load the variable t_329 - lw $v0, -88($fp) + # assign (add here the expr.to_string) to t_665 + # calling the method Init_D of type D + #load the variable t_664 + lw $v0, -756($fp) lw $t0, 0($v0) - lw $v1, 32($t0) + lw $v1, 8($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) + sw $v0, -760($fp) + + # assign (add here the expr.to_string) to t_666 + #load the variable t_665 + lw $v0, -760($fp) + sw $v0, -764($fp) + + # assign (add here the expr.to_string) to t_667 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -768($fp) + + # assign (add here the expr.to_string) to t_668 + #load the variable t_667 + lw $v0, -768($fp) + sw $v0, -772($fp) + + lw $v0, -772($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_669 + # calling the method value of type A + #load the variable t_668 + lw $v0, -772($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) + sw $v0, -776($fp) + + # assign (add here the expr.to_string) to t_670 + #load the variable t_669 + lw $v0, -776($fp) + sw $v0, -780($fp) + + # assign (add here the expr.to_string) to t_671 + lw $v1, 12($fp) + lw $v0, 12($v1) + sw $v0, -784($fp) + + # assign (add here the expr.to_string) to t_672 + #load the variable t_671 + lw $v0, -784($fp) + sw $v0, -788($fp) + + lw $v0, -788($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_673 + # calling the method value of type A + #load the variable t_672 + lw $v0, -788($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -100($fp) + sw $v0, -792($fp) - # assign (add here the expr.to_string) to t_333 - #load the variable t_332 - lw $v0, -100($fp) - sw $v0, -104($fp) + # assign (add here the expr.to_string) to t_674 + #load the variable t_673 + lw $v0, -792($fp) + sw $v0, -796($fp) - lw $v0, 16($fp) + lw $v0, -764($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -104($fp) + lw $v0, -780($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_334 - # calling the method c2i of type Parse - #load the variable self_Parse - lw $v0, 16($fp) + lw $v0, -796($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_675 + # calling the method method4 of type D + #load the variable t_666 + lw $v0, -764($fp) lw $t0, 0($v0) - lw $v1, 48($t0) + lw $v1, 44($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -5808,84 +11095,102 @@ a2i_aux_Parse: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -108($fp) + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # assign (add here the expr.to_string) to t_335 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_328 - lw $v0, -84($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 + sw $v0, -800($fp) - #load the variable t_334 - lw $v0, -108($fp) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) + # Setting value of the attribute avar in the instance self_Main to t_675 + #load the variable t_675 + lw $v0, -800($fp) + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 8($v1) - lw $t1, 4($v0) - add $t0, $t0, $t1 + # assign (add here the expr.to_string) to t_517 + #load the variable t_675 + lw $v0, -800($fp) + sw $v0, -168($fp) + + ifend_37: + # assign (add here the expr.to_string) to t_512 + #load the variable t_517 + lw $v0, -168($fp) + sw $v0, -148($fp) + + j ifend_36 + then_36: + # assign (add here the expr.to_string) to t_676 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -804($fp) + + # assign (add here the expr.to_string) to t_677 + #load the variable t_676 + lw $v0, -804($fp) + sw $v0, -808($fp) + + # assign (add here the expr.to_string) to t_678 li $a0, 8 li $v0, 9 syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -112($fp) - - # assign (add here the expr.to_string) to int_307 - #load the variable t_335 - lw $v0, -112($fp) - sw $v0, -0($fp) + move $t0, $v0 + #load the variable t_677 + lw $v0, -808($fp) + la $t1, type + lw $t2, 0($v0) + sw $t1, 0($t0) + sw $t2, 4($t0) + move $v0, $t0 + sw $v0, -812($fp) - # assign (add here the expr.to_string) to t_336 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable i_311 - lw $v0, -16($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) + # assign (add here the expr.to_string) to t_679 + #load the variable t_678 + lw $v0, -812($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # Creating Int instance for atomic 1 li $a0, 8 li $v0, 9 syscall - la $t0, Int - li $t1, 1 + la $t0, type + la $t1, C sw $t0, 0($v0) sw $t1, 4($v0) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + jal compare # pop the top of the stack to $t0 addi $sp $sp 4 lw $t0, 0($sp) - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -116($fp) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) - # assign (add here the expr.to_string) to i_311 - #load the variable t_336 - lw $v0, -116($fp) - sw $v0, -16($fp) + sw $v0, -816($fp) - # assign (add here the expr.to_string) to t_337 - #load the variable i_311 - lw $v0, -16($fp) + lw $t1, -816($fp) + lw $t0, 4($t1) + bne $t0, $zero, case_1_C + # assign (add here the expr.to_string) to t_679 + #load the variable t_678 + lw $v0, -812($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - #load the variable j_308 - lw $v0, -4($fp) + li $a0, 8 + li $v0, 9 + syscall + la $t0, type + la $t1, A + sw $t0, 0($v0) + sw $t1, 4($v0) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 @@ -5899,401 +11204,386 @@ a2i_aux_Parse: addi $sp $sp 4 lw $t0, 0($sp) - sw $v0, -120($fp) - - # assign (add here the expr.to_string) to t_338 - #load the variable t_337 - lw $v0, -120($fp) - sw $v0, -124($fp) + sw $v0, -816($fp) - lw $t1, -124($fp) + lw $t1, -816($fp) lw $t0, 4($t1) - bne $t0, $zero, then_16 - # assign (add here the expr.to_string) to t_340 - #load the string str_21 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_21 - sw $v1, 4($v0) - sw $v0, -132($fp) - - # assign (add here the expr.to_string) to t_339 - #load the variable t_340 - lw $v0, -132($fp) - sw $v0, -128($fp) + bne $t0, $zero, case_1_A + # assign (add here the expr.to_string) to t_679 + #load the variable t_678 + lw $v0, -812($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - j ifend_16 - then_16: - # assign (add here the expr.to_string) to t_341 - #load the string str_22 li $a0, 8 li $v0, 9 syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_22 - sw $v1, 4($v0) - sw $v0, -136($fp) - - # Setting value of the attribute rest in the instance self_Parse to t_341 - #load the variable t_341 - lw $v0, -136($fp) - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 8($v1) - - # assign (add here the expr.to_string) to t_339 - #load the variable t_341 - lw $v0, -136($fp) - sw $v0, -128($fp) - - ifend_16: - # assign (add here the expr.to_string) to t_327 - #load the variable t_339 - lw $v0, -128($fp) - sw $v0, -80($fp) + la $t0, type + la $t1, B + sw $t0, 0($v0) + sw $t1, 4($v0) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - j ifend_15 - then_15: - # assign (add here the expr.to_string) to t_342 - #load the variable s_306 - lw $v0, 12($fp) - sw $v0, -140($fp) + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) - # assign (add here the expr.to_string) to t_343 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable i_311 - lw $v0, -16($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + + sw $v0, -816($fp) + + lw $t1, -816($fp) + lw $t0, 4($t1) + bne $t0, $zero, case_1_A + # assign (add here the expr.to_string) to t_679 + #load the variable t_678 + lw $v0, -812($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # Creating Int instance for atomic 1 li $a0, 8 li $v0, 9 syscall - la $t0, Int - li $t1, 1 + la $t0, type + la $t1, D sw $t0, 0($v0) sw $t1, 4($v0) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + jal compare # pop the top of the stack to $t0 addi $sp $sp 4 lw $t0, 0($sp) - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -144($fp) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) - # assign (add here the expr.to_string) to t_344 - #load the variable t_343 - lw $v0, -144($fp) - sw $v0, -148($fp) + sw $v0, -816($fp) - # assign (add here the expr.to_string) to t_345 - #load the variable s_306 - lw $v0, 12($fp) - sw $v0, -152($fp) + lw $t1, -816($fp) + lw $t0, 4($t1) + bne $t0, $zero, case_1_A + # assign (add here the expr.to_string) to t_679 + #load the variable t_678 + lw $v0, -812($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - lw $v0, -152($fp) + li $a0, 8 + li $v0, 9 + syscall + la $t0, type + la $t1, E + sw $t0, 0($v0) + sw $t1, 4($v0) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_346 - # calling the method length of type String - #load the variable t_345 - lw $v0, -152($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 + jal compare + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -156($fp) - - # assign (add here the expr.to_string) to t_347 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_346 - lw $v0, -156($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 + lw $t0, 0($sp) - #load the variable i_311 - lw $v0, -16($fp) - lw $t1, 4($v0) # pop the top of the stack to $t0 addi $sp $sp 4 lw $t0, 0($sp) - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -160($fp) + sw $v0, -816($fp) - # assign (add here the expr.to_string) to t_348 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_347 - lw $v0, -160($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) + lw $t1, -816($fp) + lw $t0, 4($t1) + bne $t0, $zero, case_1_A + # assign (add here the expr.to_string) to t_679 + #load the variable t_678 + lw $v0, -812($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # Creating Int instance for atomic 1 li $a0, 8 li $v0, 9 syscall - la $t0, Int - li $t1, 1 + la $t0, type + la $t1, Object sw $t0, 0($v0) sw $t1, 4($v0) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - lw $t1, 4($v0) + jal compare # pop the top of the stack to $t0 addi $sp $sp 4 lw $t0, 0($sp) - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -164($fp) - - # assign (add here the expr.to_string) to t_349 - #load the variable t_348 - lw $v0, -164($fp) - sw $v0, -168($fp) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) - lw $v0, -140($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 + sw $v0, -816($fp) - lw $v0, -148($fp) + lw $t1, -816($fp) + lw $t0, 4($t1) + bne $t0, $zero, case_1_Object + # assign (add here the expr.to_string) to t_679 + #load the variable t_678 + lw $v0, -812($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -168($fp) + li $a0, 8 + li $v0, 9 + syscall + la $t0, type + la $t1, A2I + sw $t0, 0($v0) + sw $t1, 4($v0) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_350 - # calling the method substr of type String - #load the variable t_342 - lw $v0, -140($fp) - lw $t0, 0($v0) - lw $v1, 32($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 + jal compare + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $v1, 0($sp) + lw $t0, 0($sp) - # pop the top of the stack to $v1 + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $v1, 0($sp) + lw $t0, 0($sp) - sw $v0, -172($fp) + sw $v0, -816($fp) - # Setting value of the attribute rest in the instance self_Parse to t_350 - #load the variable t_350 - lw $v0, -172($fp) - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 8($v1) + lw $t1, -816($fp) + lw $t0, 4($t1) + bne $t0, $zero, case_1_Object + # assign (add here the expr.to_string) to t_679 + #load the variable t_678 + lw $v0, -812($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # assign (add here the expr.to_string) to i_311 - #load the variable j_308 - lw $v0, -4($fp) - sw $v0, -16($fp) + li $a0, 8 + li $v0, 9 + syscall + la $t0, type + la $t1, Bool + sw $t0, 0($v0) + sw $t1, 4($v0) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # assign (add here the expr.to_string) to t_327 - #load the variable i_311 - lw $v0, -16($fp) - sw $v0, -80($fp) + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) - ifend_15: - # assign (add here the expr.to_string) to t_323 - #load the variable t_327 - lw $v0, -80($fp) - sw $v0, -64($fp) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) - j ifend_14 - then_14: - # assign (add here the expr.to_string) to t_351 - #load the variable s_306 - lw $v0, 12($fp) - sw $v0, -176($fp) + sw $v0, -816($fp) - # assign (add here the expr.to_string) to t_352 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable i_311 - lw $v0, -16($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) + lw $t1, -816($fp) + lw $t0, 4($t1) + bne $t0, $zero, case_1_Object + # assign (add here the expr.to_string) to t_679 + #load the variable t_678 + lw $v0, -812($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # Creating Int instance for atomic 1 li $a0, 8 li $v0, 9 syscall - la $t0, Int - li $t1, 1 + la $t0, type + la $t1, String sw $t0, 0($v0) sw $t1, 4($v0) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) # pop the top of the stack to $t0 addi $sp $sp 4 lw $t0, 0($sp) - lw $t1, 4($v0) - add $t0, $t0, $t1 + sw $v0, -816($fp) + + lw $t1, -816($fp) + lw $t0, 4($t1) + bne $t0, $zero, case_1_Object + # assign (add here the expr.to_string) to t_679 + #load the variable t_678 + lw $v0, -812($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + li $a0, 8 li $v0, 9 syscall + la $t0, type la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -180($fp) - - # assign (add here the expr.to_string) to t_353 - #load the variable t_352 - lw $v0, -180($fp) - sw $v0, -184($fp) - - # assign (add here the expr.to_string) to t_354 - #load the variable s_306 - lw $v0, 12($fp) - sw $v0, -188($fp) - - lw $v0, -188($fp) + sw $t0, 0($v0) + sw $t1, 4($v0) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_355 - # calling the method length of type String - #load the variable t_354 - lw $v0, -188($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 + jal compare + # pop the top of the stack to $t0 addi $sp $sp 4 - lw $v1, 0($sp) + lw $t0, 0($sp) - sw $v0, -192($fp) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) - # assign (add here the expr.to_string) to t_356 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_355 - lw $v0, -192($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) + sw $v0, -816($fp) + + lw $t1, -816($fp) + lw $t0, 4($t1) + bne $t0, $zero, case_1_Object + # assign (add here the expr.to_string) to t_679 + #load the variable t_678 + lw $v0, -812($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + li $a0, 8 + li $v0, 9 + syscall + la $t0, type + la $t1, IO + sw $t0, 0($v0) + sw $t1, 4($v0) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - #load the variable i_311 - lw $v0, -16($fp) - lw $t1, 4($v0) + jal compare + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) + # pop the top of the stack to $t0 addi $sp $sp 4 lw $t0, 0($sp) - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -196($fp) + sw $v0, -816($fp) - # assign (add here the expr.to_string) to t_357 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_356 - lw $v0, -196($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) + lw $t1, -816($fp) + lw $t0, 4($t1) + bne $t0, $zero, case_1_Object + # assign (add here the expr.to_string) to t_679 + #load the variable t_678 + lw $v0, -812($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # Creating Int instance for atomic 1 li $a0, 8 li $v0, 9 syscall - la $t0, Int - li $t1, 1 + la $t0, type + la $t1, Main sw $t0, 0($v0) sw $t1, 4($v0) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - lw $t1, 4($v0) + jal compare # pop the top of the stack to $t0 addi $sp $sp 4 lw $t0, 0($sp) - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -200($fp) + # pop the top of the stack to $t0 + addi $sp $sp 4 + lw $t0, 0($sp) - # assign (add here the expr.to_string) to t_358 - #load the variable t_357 - lw $v0, -200($fp) - sw $v0, -204($fp) + sw $v0, -816($fp) - lw $v0, -176($fp) + lw $t1, -816($fp) + lw $t0, 4($t1) + bne $t0, $zero, case_1_Object + case_1_C: + # assign (add here the expr.to_string) to c_681 + #load the variable t_676 + lw $v0, -804($fp) + sw $v0, -824($fp) + + # assign (add here the expr.to_string) to t_682 + #load the variable c_681 + lw $v0, -824($fp) + sw $v0, -828($fp) + + # assign (add here the expr.to_string) to t_683 + #load the variable c_681 + lw $v0, -824($fp) + sw $v0, -832($fp) + + lw $v0, -832($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -184($fp) + # assign (add here the expr.to_string) to t_684 + # calling the method value of type C + #load the variable t_683 + lw $v0, -832($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, -836($fp) + + # assign (add here the expr.to_string) to t_685 + #load the variable t_684 + lw $v0, -836($fp) + sw $v0, -840($fp) + + lw $v0, -828($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - lw $v0, -204($fp) + lw $v0, -840($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_359 - # calling the method substr of type String - #load the variable t_351 - lw $v0, -176($fp) + # assign (add here the expr.to_string) to t_686 + # calling the method method6 of type C + #load the variable t_682 + lw $v0, -828($fp) lw $t0, 0($v0) - lw $v1, 32($t0) + lw $v1, 52($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 @@ -6303,217 +11593,262 @@ a2i_aux_Parse: addi $sp $sp 4 lw $v1, 0($sp) - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -208($fp) + sw $v0, -844($fp) - # Setting value of the attribute rest in the instance self_Parse to t_359 - #load the variable t_359 - lw $v0, -208($fp) + # Setting value of the attribute avar in the instance self_Main to t_686 + #load the variable t_686 + lw $v0, -844($fp) move $s2, $v0 - lw $v1, 16($fp) + lw $v1, 12($fp) sw $s2, 8($v1) - # assign (add here the expr.to_string) to i_311 - #load the variable j_308 - lw $v0, -4($fp) - sw $v0, -16($fp) - - # assign (add here the expr.to_string) to t_323 - #load the variable i_311 - lw $v0, -16($fp) - sw $v0, -64($fp) - - ifend_14: - # assign (add here the expr.to_string) to t_314 - #load the variable t_323 - lw $v0, -64($fp) - sw $v0, -28($fp) - - j while_2 - pool_2: - # assign (add here the expr.to_string) to t_360 - #load the variable int_307 - lw $v0, -0($fp) - sw $v0, -212($fp) - - # return the value of the function in the register $v0 - #load the variable t_360 - lw $v0, -212($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 216 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra + # assign (add here the expr.to_string) to t_680 + #load the variable t_686 + lw $v0, -844($fp) + sw $v0, -820($fp) - .text -Init_Parse: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + j case_1_end + case_1_A: + # assign (add here the expr.to_string) to a_687 + #load the variable t_676 + lw $v0, -804($fp) + sw $v0, -848($fp) - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_688 + #load the variable a_687 + lw $v0, -848($fp) + sw $v0, -852($fp) - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 12 + # assign (add here the expr.to_string) to t_689 + #load the variable a_687 + lw $v0, -848($fp) + sw $v0, -856($fp) - lw $v0, 12($fp) + lw $v0, -856($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to self_Parse - jal Init_IO + # assign (add here the expr.to_string) to t_690 + # calling the method value of type A + #load the variable t_689 + lw $v0, -856($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, 12($fp) + sw $v0, -860($fp) - # assign (add here the expr.to_string) to t_151 - li $a0, 4 - li $v0, 9 - syscall - la $a0, BoolOp - sw $a0, 0($v0) - sw $v0, -0($fp) + # assign (add here the expr.to_string) to t_691 + #load the variable t_690 + lw $v0, -860($fp) + sw $v0, -864($fp) - lw $v0, -0($fp) + lw $v0, -852($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_152 - # calling the method Init_BoolOp of type BoolOp - #load the variable t_151 - lw $v0, -0($fp) + lw $v0, -864($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_692 + # calling the method method3 of type A + #load the variable t_688 + lw $v0, -852($fp) lw $t0, 0($v0) - lw $v1, 8($t0) + lw $v1, 40($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -4($fp) + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # Setting value of the attribute boolop in the instance self_Parse to t_152 - #load the variable t_152 - lw $v0, -4($fp) + sw $v0, -868($fp) + + # Setting value of the attribute avar in the instance self_Main to t_692 + #load the variable t_692 + lw $v0, -868($fp) move $s2, $v0 lw $v1, 12($fp) - sw $s2, 4($v1) + sw $s2, 8($v1) - # assign (add here the expr.to_string) to t_361 - #load the string str_empty + # assign (add here the expr.to_string) to t_680 + #load the variable t_692 + lw $v0, -868($fp) + sw $v0, -820($fp) + + j case_1_end + case_1_Object: + # assign (add here the expr.to_string) to o_693 + #load the variable t_676 + lw $v0, -804($fp) + sw $v0, -872($fp) + + # assign (add here the expr.to_string) to t_694 + #load the string str_74 li $a0, 8 li $v0, 9 syscall la $v1, String sw $v1, 0($v0) - la $v1, str_empty + la $v1, str_74 sw $v1, 4($v0) - sw $v0, -8($fp) + sw $v0, -876($fp) - # Setting value of the attribute rest in the instance self_Parse to t_361 - #load the variable t_361 - lw $v0, -8($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 8($v1) + # assign (add here the expr.to_string) to t_695 + #load the variable t_694 + lw $v0, -876($fp) + sw $v0, -880($fp) - # return the value of the function in the register $v0 - #load the variable self_Parse lw $v0, 12($fp) - move $v0, $v0 + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # restore the stack pointer, frame pointer y return address - addu $sp $sp 12 - # pop the top of the stack to $fp + lw $v0, -880($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_696 + # calling the method out_string of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $fp, 0($sp) + lw $v1, 0($sp) - # pop the top of the stack to $ra + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $ra, 0($sp) + lw $v1, 0($sp) - jr $ra + sw $v0, -884($fp) - .text -main_Main: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_697 + # calling the method abort of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 12($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 28 + sw $v0, -888($fp) - # assign (add here the expr.to_string) to t_363 - lw $v1, 12($fp) - lw $v0, 12($v1) - sw $v0, -0($fp) + # assign (add here the expr.to_string) to t_680 + # Creating Int instance for atomic 0 + li $a0, 8 + li $v0, 9 + syscall + la $t0, Int + li $t1, 0 + sw $t0, 0($v0) + sw $t1, 4($v0) - # assign (add here the expr.to_string) to t_364 - #load the variable t_363 - lw $v0, -0($fp) - sw $v0, -4($fp) + sw $v0, -820($fp) - lw $v0, -4($fp) + j case_1_end + case_1_end: + # assign (add here the expr.to_string) to t_512 + #load the variable t_680 + lw $v0, -820($fp) + sw $v0, -148($fp) + + ifend_36: + # assign (add here the expr.to_string) to t_507 + #load the variable t_512 + lw $v0, -148($fp) + sw $v0, -128($fp) + + j ifend_35 + then_35: + # assign (add here the expr.to_string) to t_698 + li $a0, 8 + li $v0, 9 + syscall + la $a0, A + sw $a0, 0($v0) + sw $v0, -892($fp) + + lw $v0, -892($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_365 - # calling the method print_V of type Graph - #load the variable t_364 - lw $v0, -4($fp) + # assign (add here the expr.to_string) to t_699 + # calling the method Init_A of type A + #load the variable t_698 + lw $v0, -892($fp) lw $t0, 0($v0) - lw $v1, 32($t0) + lw $v1, 8($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -8($fp) + sw $v0, -896($fp) - # assign (add here the expr.to_string) to t_366 - lw $v1, 12($fp) - lw $v0, 12($v1) - sw $v0, -12($fp) + # assign (add here the expr.to_string) to t_700 + #load the variable t_699 + lw $v0, -896($fp) + sw $v0, -900($fp) + + lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_701 + # calling the method get_int of type Main + #load the variable self_Main + lw $v0, 12($fp) + lw $t0, 0($v0) + lw $v1, 48($t0) + jal $v1 + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # assign (add here the expr.to_string) to t_367 - #load the variable t_366 - lw $v0, -12($fp) - sw $v0, -16($fp) + sw $v0, -904($fp) - lw $v0, -16($fp) + # assign (add here the expr.to_string) to t_702 + #load the variable t_701 + lw $v0, -904($fp) + sw $v0, -908($fp) + + lw $v0, -900($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_368 - # calling the method print_E of type Graph - #load the variable t_367 - lw $v0, -16($fp) + lw $v0, -908($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to t_703 + # calling the method set_var of type A + #load the variable t_700 + lw $v0, -900($fp) lw $t0, 0($v0) lw $v1, 28($t0) jal $v1 @@ -6521,186 +11856,184 @@ main_Main: addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -20($fp) - - # assign (add here the expr.to_string) to t_369 - #load the variable t_368 - lw $v0, -20($fp) - sw $v0, -24($fp) - - # return the value of the function in the register $v0 - #load the variable t_369 - lw $v0, -24($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 28 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra + lw $v1, 0($sp) - .text -Init_Main: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + sw $v0, -912($fp) - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 + # Setting value of the attribute a_var in the instance self_Main to t_703 + #load the variable t_703 + lw $v0, -912($fp) + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 12($v1) - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 4 + # assign (add here the expr.to_string) to t_704 + li $a0, 8 + li $v0, 9 + syscall + la $a0, B + sw $a0, 0($v0) + sw $v0, -916($fp) - lw $v0, 12($fp) + lw $v0, -916($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to self_Main - jal Init_Parse + # assign (add here the expr.to_string) to t_705 + # calling the method Init_B of type B + #load the variable t_704 + lw $v0, -916($fp) + lw $t0, 0($v0) + lw $v1, 8($t0) + jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, 12($fp) + sw $v0, -920($fp) - lw $v0, 12($fp) + # assign (add here the expr.to_string) to t_706 + #load the variable t_705 + lw $v0, -920($fp) + sw $v0, -924($fp) + + # assign (add here the expr.to_string) to t_707 + lw $v1, 12($fp) + lw $v0, 8($v1) + sw $v0, -928($fp) + + # assign (add here the expr.to_string) to t_708 + #load the variable t_707 + lw $v0, -928($fp) + sw $v0, -932($fp) + + lw $v0, -932($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # assign (add here the expr.to_string) to t_362 - # calling the method read_input of type Main - #load the variable self_Main - lw $v0, 12($fp) + # assign (add here the expr.to_string) to t_709 + # calling the method value of type A + #load the variable t_708 + lw $v0, -932($fp) lw $t0, 0($v0) - lw $v1, 40($t0) + lw $v1, 24($t0) jal $v1 # pop the top of the stack to $v1 addi $sp $sp 4 lw $v1, 0($sp) - sw $v0, -0($fp) + sw $v0, -936($fp) - # Setting value of the attribute g in the instance self_Main to t_362 - #load the variable t_362 - lw $v0, -0($fp) - move $s2, $v0 + # assign (add here the expr.to_string) to t_710 + #load the variable t_709 + lw $v0, -936($fp) + sw $v0, -940($fp) + + # assign (add here the expr.to_string) to t_711 lw $v1, 12($fp) - sw $s2, 12($v1) + lw $v0, 12($v1) + sw $v0, -944($fp) - # return the value of the function in the register $v0 - #load the variable self_Main - lw $v0, 12($fp) - move $v0, $v0 + # assign (add here the expr.to_string) to t_712 + #load the variable t_711 + lw $v0, -944($fp) + sw $v0, -948($fp) - # restore the stack pointer, frame pointer y return address - addu $sp $sp 4 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) + lw $v0, -948($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 - # pop the top of the stack to $ra + # assign (add here the expr.to_string) to t_713 + # calling the method value of type A + #load the variable t_712 + lw $v0, -948($fp) + lw $t0, 0($v0) + lw $v1, 24($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $ra, 0($sp) + lw $v1, 0($sp) - jr $ra + sw $v0, -952($fp) - .text -and_BoolOp: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 + # assign (add here the expr.to_string) to t_714 + #load the variable t_713 + lw $v0, -952($fp) + sw $v0, -956($fp) - # push $fp to the stack - sw $fp, 0($sp) + lw $v0, -924($fp) + # push $v0 to the stack + sw $v0, 0($sp) addi $sp $sp -4 - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 16 - - # assign (add here the expr.to_string) to t_372 - #load the variable b1_370 - lw $v0, 16($fp) - sw $v0, -0($fp) - - lw $t1, -0($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_17 - # assign (add here the expr.to_string) to t_374 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - + lw $v0, -940($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - + lw $v0, -956($fp) # push $v0 to the stack sw $v0, 0($sp) addi $sp $sp -4 - jal compare - # pop the top of the stack to $t0 + # assign (add here the expr.to_string) to t_715 + # calling the method method2 of type B + #load the variable t_706 + lw $v0, -924($fp) + lw $t0, 0($v0) + lw $v1, 36($t0) + jal $v1 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $t0, 0($sp) + lw $v1, 0($sp) - # pop the top of the stack to $t0 + # pop the top of the stack to $v1 addi $sp $sp 4 - lw $t0, 0($sp) + lw $v1, 0($sp) - sw $v0, -8($fp) + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) - # assign (add here the expr.to_string) to t_373 - #load the variable t_374 - lw $v0, -8($fp) - sw $v0, -4($fp) + sw $v0, -960($fp) - j ifend_17 - then_17: - # assign (add here the expr.to_string) to t_373 - #load the variable b2_371 - lw $v0, 12($fp) - sw $v0, -4($fp) + # Setting value of the attribute avar in the instance self_Main to t_715 + #load the variable t_715 + lw $v0, -960($fp) + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 8($v1) - ifend_17: - # assign (add here the expr.to_string) to t_375 - #load the variable t_373 - lw $v0, -4($fp) - sw $v0, -12($fp) + # assign (add here the expr.to_string) to t_507 + #load the variable t_715 + lw $v0, -960($fp) + sw $v0, -128($fp) + + ifend_35: + # assign (add here the expr.to_string) to t_479 + #load the variable t_507 + lw $v0, -128($fp) + sw $v0, -16($fp) + + j while_2 + pool_2: + # assign (add here the expr.to_string) to t_716 + #load the variable t_479 + lw $v0, -16($fp) + sw $v0, -964($fp) # return the value of the function in the register $v0 - #load the variable t_375 - lw $v0, -12($fp) + #load the variable t_716 + lw $v0, -964($fp) move $v0, $v0 # restore the stack pointer, frame pointer y return address - addu $sp $sp 16 + addu $sp $sp 968 # pop the top of the stack to $fp addi $sp $sp 4 lw $fp, 0($sp) @@ -6712,7 +12045,7 @@ and_BoolOp: jr $ra .text -or_BoolOp: +Init_Main: # save the return address and frame pointer # push $ra to the stack sw $ra, 0($sp) @@ -6724,24 +12057,40 @@ or_BoolOp: # update the frame pointer and allocate the frame in the stack move $fp $sp - subu $sp $sp 16 - - # assign (add here the expr.to_string) to t_378 - #load the variable b1_376 - lw $v0, 16($fp) - sw $v0, -0($fp) + subu $sp $sp 8 - lw $t1, -0($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_18 - # assign (add here the expr.to_string) to t_379 - #load the variable b2_377 lw $v0, 12($fp) + # push $v0 to the stack + sw $v0, 0($sp) + addi $sp $sp -4 + + # assign (add here the expr.to_string) to self_Main + jal Init_IO + # pop the top of the stack to $v1 + addi $sp $sp 4 + lw $v1, 0($sp) + + sw $v0, 12($fp) + + # assign (add here the expr.to_string) to t_717 + #load the string str_empty + li $a0, 8 + li $v0, 9 + syscall + la $v1, String + sw $v1, 0($v0) + la $v1, str_empty + sw $v1, 4($v0) sw $v0, -4($fp) - j ifend_18 - then_18: - # assign (add here the expr.to_string) to t_380 + # Setting value of the attribute char in the instance self_Main to t_717 + #load the variable t_717 + lw $v0, -4($fp) + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 4($v1) + + # assign (add here the expr.to_string) to t_311 # Creating Int instance for atomic 0 li $a0, 8 li $v0, 9 @@ -6777,58 +12126,22 @@ or_BoolOp: addi $sp $sp 4 lw $t0, 0($sp) - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to t_379 - #load the variable t_380 - lw $v0, -8($fp) - sw $v0, -4($fp) - - ifend_18: - # assign (add here the expr.to_string) to t_381 - #load the variable t_379 - lw $v0, -4($fp) - sw $v0, -12($fp) - - # return the value of the function in the register $v0 - #load the variable t_381 - lw $v0, -12($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 16 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -Init_BoolOp: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 + sw $v0, -0($fp) - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 0 + # Setting value of the attribute flag in the instance self_Main to t_311 + #load the variable t_311 + lw $v0, -0($fp) + move $s2, $v0 + lw $v1, 12($fp) + sw $s2, 16($v1) # return the value of the function in the register $v0 - #load the variable self_BoolOp + #load the variable self_Main lw $v0, 12($fp) move $v0, $v0 # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 + addu $sp $sp 8 # pop the top of the stack to $fp addi $sp $sp 4 lw $fp, 0($sp) From 34f60cd76f3be8d13602fb653442747287a012a8 Mon Sep 17 00:00:00 2001 From: Victor Manuel <61758132+Vitico99@users.noreply.github.com> Date: Tue, 1 Mar 2022 20:53:35 -0500 Subject: [PATCH 68/81] Add basic report --- doc/report/architecture.png | Bin 0 -> 25884 bytes doc/report/inheritance_memory.png | Bin 0 -> 28326 bytes doc/report/memory.png | Bin 0 -> 12369 bytes doc/report/report.md | 415 ++++++++++++++++++++++++++++++ 4 files changed, 415 insertions(+) create mode 100644 doc/report/architecture.png create mode 100644 doc/report/inheritance_memory.png create mode 100644 doc/report/memory.png create mode 100644 doc/report/report.md diff --git a/doc/report/architecture.png b/doc/report/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..0c6fbb230da8039d87eaddc217492e8e7f796767 GIT binary patch literal 25884 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 CYW!RP literal 0 HcmV?d00001 diff --git a/doc/report/inheritance_memory.png b/doc/report/inheritance_memory.png new file mode 100644 index 0000000000000000000000000000000000000000..8cecf34f19802e99a189e66c416abc2173ba7d2b GIT binary patch literal 28326 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 l07V8~)&0c3u1dRp{{9Laxo|SagagdqH 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 lgfz#Q +``` + + + +## 2. Arquitectura del compilador + +El objetivo del presente software es dado un programa escrito en el lenguaje COOL generar un programa equivalente escrito en MIPS que pueda ser ejecutado en SPIM. + +El proceso de convertir lenguaje COOL a lenguaje MIPS se dividió en un total de 5 fases repartidas en 3 fases principales: + +- Parsing + - Análisis Léxico + - Análisis Sintáctico +- Análisis semántico +- Generación de código + - Generación de CIL + - Generación de MIPS + +Cada una de estas fases principales se corresponde con un módulo del compilador encargado de su ejecución por lo que la estructura del compilador sería la siguiente. +``` +src/ +┣ codegen/ +┣ parsing/ +┣ semantics/ +┣ utils/ +┗ cool.py +``` +Por último el archivo `cool.py` se encarga de crear el *pipeline* entre el archivo de entrada, los módulos del compilador y el archivo de salida siguiendo el flujo mostrado en la siguiente imágen. + +![architecture](architecture.png) + + +## 3. Módulos del compilador + +### 3.1 parsing + +El proceso de parsing del programa se divide en dos fases: el análisis lexicográfico y el análisis sintático. Para la implementación de este módulo se decidió utilizar `ply` el cual es una implementación en python de las herramientas de construcción de compiladores `lex` y `yacc`. Este módulo recibe como entrada un string y en caso de dicho string pertencer al lenguaje COOL devuelve el árbol de sintaxis abstracta del programa, en caso negativo devuelve una lista con los errores encontrados. + + +**Análisis lexicográfico:** + +----- + +Utilizando la herramienta `lex` se implementó el tokenizador de texto utilizando expresiones regulares para reconocer los tokens, esto resulta conveniente dado que la mayoría de componentes del lenguaje son reconocibles mediante estas, no obstante existen excepciones como los comentarios (multilínea y de una sola línea) y los strings debido a que estos elementos se defininen como un lenguaje de la forma $a^nb^n$. Para estos casos especiales se optó por reconocer el símbolo inicial del elemento y luego procesar el resto del texto sin utilizar el autómata hasta encontrar el símbolo que cierra el elemento para luego reanudar el procesamiento utilizando el autómata. + +**Análisis sintáctico:** + +---- + +La herramienta `yacc` permite la creación de parsers con gramáticas LALR(1) y la construcción del árbol de sintaxis abstracta mediante gramáticas atributadas. En esta fase se definió la gramatica y la jerarquía de clases a utilizar para construir el AST. + +A continuación definimos la gramática LALR(1) utilizada. + +``` +S -> program +program -> class_list +class_list -> def_class +class_list -> dec_class class_list +def_class -> CLASS TYPEID OCUR feature_list CCUR SEMICOLON +feature_list -> ε +feature_list -> def_attr feature_list +feature_list -> def_func feature_list +def_attr -> OBJECTID COLON TYPEID SEMICOLON +def_attr -> OBJECTID COLON TYPEID ASSIGN exp SEMICOLON +def_func -> OBJECTID OPAR CPAR COLON TYPEID OCUR exp CCUR SEMICOLON +def_func -> OBJECTID OPAR param_list CPAR COLON TYPEID OCUR exp CCUR SEMICOLON +param_list -> param +param_list -> param COMMA param_list +param -> OBJECTID COLON TYPEID +exp -> OBJECTID ASSIGN exp +exp -> LET ident_list IN exp +iden_list -> iden +iden_list -> iden COMMA ident_list +iden -> OBJECTID COLON TYPEID +iden -> OBJECTID COLON TYPEID ASSIGN exp +case_list -> branch +case_list -> branch case_list +branch -> OBJECTID COLON TYPEID CASSIGN exp SEMICOLON +exp -> NOT exp +exp -> comp +comp -> arith +comp -> arith LOWER arith +comp -> arith LEQ arith +comp -> arith EQUAL arith +comp -> arith EQUAL NOT exp +arith -> term +arith -> arith PLUS term +arith -> arith MINUS term +term -> factor +term -> term STAR factor +term -> term DIV factor +factor -> atom +factor -> TILDE factor +factor -> CASE exp OF case_list ESAC +factor -> WHILE exp LOOP exp POOL +factor -> OCUR exp_list CCUR +exp_list -> exp SEMICOLON +exp_list -> exp SEMICOLON exp_list +factor -> IF exp THEN exp ELSE exp FI +factor -> ISVOID factor +atom -> INT_CONST +atom -> STRING_CONST +atom -> TRUE +atom -> FALSE +atom -> OBJECTID +atom -> NEW TYPEID +atom -> func_call +atom -> OPAR exp CPAR +func_call -> OBJECTID OPAR arg_list CPAR +func_call -> atom DOT OBJECTID OPAR arg_list CPAR +func_call -> atom AT TYPEID DOT OBJECTID OPAR arg_list CPAR +arg_list -> ε +arg_list -> arg_list_not_empty +arg_list_not_empty -> exp +arg_list_not_empty -> exp COMMA arg_list_not_empty +``` + +### 3.2 semantics + +El módulo `semantics` implementa la fase de análisis semántico del compilador, este recibe como entrada el árbol de sintaxis abstracta producido por el parser y tiene como salida una lista de errores la cual si es vacía indica que el programa es válido. + +**Análisis semántico** + +----- + +Para realizar el análisis se definieron 3 clases las cuales implementan un patrón *visitor* para recorrer el AST, cada una de estas clases realiza un recorrido sobre el árbol comprobando distintas reglas del lenguaje en cada caso. + +1. `TypeCollector`: este primer recorrido es el encargado de recolectar los identificadores de los tipos definidos por las clases declaradas en el código y verifica que no hayan clases que tengan con el mismo nombre. + +2. `TypeBuilder`: es el encargado de validar las declaraciones hechas dentro de los tipos creados en el recorrido anterior. Verifica que los atributos y métodos declarados no sean redefinidos dentro de la misma clase y que los tipos presentes en estas definiciones existan. Además realiza comprobaciones de integridad sobre la jerarquía de tipos comprobando la no existencia de ciclos en la herencia y que toda clase base haya sido definida. + +3. `TypeChecker`: se encarga de analizar el cuerpo de las definiciones de los métodos y las expresiones de las definiciones de los atributos de las clases. Se analiza la signatura de los métodos para validar la reescritura de métodos en casos de herencia y. que los atributos heredados no se encuentren definidos nuevamente. Además comprueba que las reglas de cálculo de tipos para expresiones definidas en el manual del lenguje COOL. + +Para la realización de estos recorridos fue necesaria la implementación de representaciones de los elementos semánticos del programa como los tipos (`Type`), atributos (`Attribute`), métodos (`Method`), etc... además de contenedores que nos permitiesen acceder a esta información de una forma efectiva y sencilla como `Context` y `Scope`. Estas clases se encuentran en el archivo `semantic.py` y fueron implementadas siguiendo las ideas del temario de análisis semántico visto en el curso. + +Luego de haber realizado los diferentes recorridos por el AST el módulo devuelve una lista la cual contiene los errores semánticos encontrados en el programa. + + +### 3.3 codegen + +Luego de comprobar que el código porporcionado por el usuario no contenga errores, se procede a la generación de código de máquina. + +La generación de código está dividida en dos partes: primero se genera un código intermedio CIL y luego, a partir de este, se genera el código MIPS. Esto nos va a permitir generar código del programa de forma más sencilla, ya que el salto directamente desde COOL a MIPS es demasiado complejo. El AST devuelto por el parser se recorre y se van formando los nodos de un nuevo AST con nodos que representan las definiciones, instrucciones y expresiones de CIL. Por último, a partir de este AST se procede a generar el código MIPS en donde se incluye el trabajo con la memoria. + + +**Generación de código CIL** + +----- + +EL lenguaje CIL está dividido en tres secciones: + +**1.** type: Se definen los tipos (clases) con sus atributos y el encabezado de sus métodos como se explica en la bibliogarfia de la asignatura. + +Se conoce que el ast producido por el parser tiene como nodo raiz un ProgramNode que está formado por nodos ClassDeclarationNode que son las clases, y estos a su vez por nodos AttrDeclarationNode y FunctionDeclarationNode que son las definiciones de los atributos y los métodos de una clase. Cuando se visita un ClassDeclarationNode, se crean los nodos CILTypeNode que contienen una lista de CILAttributesNode y una lista de CILMethodNode, los cuales solo contienen el nombre del método y el nombre de la función que lo defino en la sección code. + +``` +type A { + attribute x ; + method f : f1; +} +``` + +Como se sabe los métodos y los atributos de un tipo deben siempre definirse en un mismo orden y si un tipo A hereda de B, A debe tener acceso a los atributos y métodos de su padre y de los demás ancestros de él hasta llegar a Object. Para lograr esto se tomaron en orden topológico todos los nodos de las clases y al recorrerlo se fueron agregando los atributos del padre y métodos en el mismo orden, y por último los suyos. De esta forma, cuando se llega a un nodo su padre tiene ya todos sus atributos y métodos definidos, asi como los del los ancestros en orden de aparición. Además, por una mayor comodidad en la implentación, todas las variables o atributos almacenan un tipo además de su nombre, dejando el trabajo de la memorio para la segunda fase de generación. + +Además a cada tipo se le añade un método especial, el init, que va a ser llamado cada vez que se inicialice una clase desde el código de COOL. Por cada atributo declarado en la clase y que se le asigna una expresión, se van a añadir las instrucciones responsables de inicializar esos valores. Este método va a ser invocado pasándole como argumento la referencia de la variable a la que se le desea asignar este tipo. + +Para el caso de los tipos basicos Int, String y Bool, además de añadir el método init, se define un atributo value que contendrá su valor, asignándole cero en la función si no se provee de ninguna expresión de definición; y para el tipo Object e IO, el método init solo se encarga de retornar la instancia de la clase. + +Los tipos built-in quedan implementadas de la siguiente forma: + +``` +type Object { + method init : init_Object; + method abort : abort_Object; + method type_name : type_name_Object; + method copy : copy_Object; +} + +type Int { + attribute value; + + method init : init_Int; + method abort : abort_Object; + method type_name : type_name_Object; + method copy : copy_Object; +} + +type String { + attribute value; + + method init : init_String; + method abort : abort_Object; + method type_name : type_name_Object; + method copy : copy_Object; + method length : length_String; + method concat : concat_String; + method substr : substr_String; +} + +type Bool { + attribute value; + + method init : init_Bool; + method abort : abort_Object; + method type_name : type_name_Object; + method copy : copy_Object; +} + +type IO { + method init : init_IO; + method abort : abort_Object; + method type_name : type_name_Object; + method copy : copy_Object; + method out_string : out_string_IO; + method out_int : out_int_IO; + method in_string : in_string_IO; + method in_int : in_int_IO; +} +``` + + + +**2.** data: En esta sección se guardan los string que se van encontrando en el AST y se almacenan en una variable para su posterior uso. + +**3. ** code: Esta sección contiene la definición de todas las funciones, sus parámetros, las variables locales que se utilizan y el retorno. + +Un método en el AST devuelto por el parser es un FunctionDeclarationNode este en CIL se convertirá en un CILFuntionDeclarationNode, como se mencionó se deben guardar en una parte de la sección code las variables para esto se creará una subsección .local para las mismas y una sección subsección del .code también pero anterior a la .local es .param en donde están todos los parámetros de la función delcarada. Para crear las variables se utiliza un alias que depende de su nombre original, esto se realizó porque una variable de un método o un argumento pueden llamarse como un atributo de la clase y a la vez en una expresión let pueden utilizarse nombres de variables que estén en los parámetros o en otro let más externo, este alias posibillita que la variable al crearla sea única y no sobrescriba variables creadas en otro entorno accesible. + +Como se conoce en el lenguaje COOL solo existen expresiones y en el lenguaje CIL se tienen tanto expresiones como instrucciones, por tanto una expresión COOL se traduce a una lista de istrucciones CIL ya sean de asignación o de cambio del valor de un atributo, ifgoto, goto, label, entre otras. Una asignación en CIL puede ser la traducción de una asignación de COOL o puede ser creada para llevar una expresión de Cool distinta de asignacion a una instrucción en CIL, ejemplo cuando queremos realizar una operación suma en COOL cuando una de las partes izquierda o derecha no es un nodo atómico debemos separar en en una asignación a una nueva variable creada en CIL que guarde la expresión de esa parte que no es un nodo atómico y luego a esta sumarla con la parte que si es atómica. + +Un caso de especial consideración dentro de las expresiones de COOL es el `case`, el comportamiento esperado es que se compute el tipo dinámico de la expresión de del `case` y se seleccione la rama del tipo ancestro más cercano a dicho tipo. Para resolver esto se recorrieron las ramas del case en orden topológico inverso de acuerdo a su tipo, por lo que visitamos los tipos más especializadas primero, y por cada de rama generamos código para que los descendientes que no tienen una rama asignada sean dirigidos a esta rama. Al final se genera el código de la expresión resultado de cada rama. A continuación presentamos un sencillo pseudocódigo con la idea general del algoritmo + +``` +branches = {} +for type in reversed_toplogic_order(case.types): + branches[type] = type + for heir in type.heirs(): + try: + branches[heir] + except: + branches[heir] = type + +for type, branch_type in branches: + assign_branch(type, branch_type) + +for branch in case: + generate_code() +``` + + + +**Generación de código MIPS** + +---- + + +La generación de código MIPS se realiza mediante dos recorridos al árbol de sintaxis abstracta del lenguaje CIL, el primer recorrido se encarga de construir la información de las estructuras en memoria utilizadas por el compilador y el segundo recorrido genera el código utilizando la información contextual generada por el primero. + +El primer recorrido del AST del lenguaje CIL se realiza con el objetivo de crear un objeto `MIPSContext`, en esta clase almacenaremos la información relativa a la representación en memoria de los tipos, sus instancias y del manejo de memoria durante el llamado de funciones. + +A continuación definiremos las ideas seguidas para la representación de los tipos en memoria. +1. El valor de los atributos de una clase son independientes para cada instancia de la clase, sin embargo, los métodos de la clase son globales para todas las instancias. Esto permite separar la información global del tipo en memoria estática y la información de las instancias en memoria dinámica. + +2. Los identificadores de las clases en COOL son únicos y por tanto los identificadores de los tipos también lo son. Esto permite utilizar su nombre como alias a la dirección de memoria donde se almacena la información del tipo. La información que se decidió almacenar sobre los tipos fue su tamaño (para la creación dinámica de instancias mediante `copy`), su representación como string (para la implementación de `type_name`) y las direcciones de los métodos del tipo. + + ```mips + .data + : .asciiz + .data + .align 4 + : .word ... + ``` + +3. La representación de una instancia de tipo `` es un bloque de memoria de tamaño `` localizado en memoria dinámica. La primera palabra de este bloque contienen la dirección representada por `` las siguientes palabras del bloque contienen direcciones de memoria apuntando al valor de los atributos de la instancia en el orden en que fueron declarados. + + ![memory](memory.png) + +4. El orden de los atributos y métodos en un tipo debe de respetar el orden en que se declaran en su tipo padre. Esto permite definir reglas precisas para obtener las direcciones de los atributos y métodos. + + $$ + attribute\_address_i = 4i + instance\_address\\ + method\_address_i = 4(i + 1) + type\_address + $$ + + Nos referiremos a este índice $i$ como offset. + + A continuación mostramos un ejemplo de la representación de la herencia en memoria. + + ![inheritance_memory](inheritance_memory.png) + +Esta representación se implementa como una clase `TypeInfo` la cual ofrece métodos para el cálculo de las direcciones en memoria de los atributos y métodos. + +```python +class TypeInfo: + def __init__(self, typex: CILTypeNode): + # This is obvious + self.id = typex.id + + # Memory to allocate for an instance of the type + self.size = (len(typex.attributes) + 1) * WSIZE + + # Use this offset to calculate the attribute address + self.attrs_offset = {attr.id : i for i, attr in enumerate(typex.attributes, start=1)} + + # Use this offset to calculate the method address + self.methods_offset = { m.id : i for i, m in enumerate(typex.methods, start=1) } + + def get_attr_addr(self, attr, register): + offset = self.attrs_offset[attr] + return f'{(offset) * WSIZE}({register})' + + def get_method_addr(self, method, register): + offset = self.methods_offset[method] + return f'{(offset + 1) * WSIZE}({register})' +``` +Otro aspecto fundamental a tener en cuenta durante la generación de MIPS es el manejo de memoria durante el llamado a funciones, para la resolución de este problema es común la adopción de convenciones por lo que en este caso nos hemos adherido a las convenciones propuestas por `gcc`. Estas convenciones se definen en torno a una estructura llamada *procedure call frame* la cual definimos a continuación. + +Un *procedure call frame* es un bloque de memoria localizado en la pila el cual se encarga de proveer espacio para las variables locales del procedimiento, además su dirección es utilizada para acceder a los argumentos de la función. + +Convenciones seguidas por la función que llama a otra (*caller*): + +1. Guardar todos los registros utilizados los cuales puedan ser modificados por la función llamada. +2. Pasar los argumentos a la función llamada a través de la pila respetando el orden en que fueron declarados. +3. Llamar a la función. +4. Restablecer el estado de la pila extrayendo los argumentos pasados y los registros guardados + + +Convenciones seguidas por la función que es llamada (*called*): + +1. Guardar la dirección de retorno en la pila `$ra` +2. Guardar el puntero al bloque en la pila `$fp` +3. Actualizar `$fp` con el valor de `$sp` +4. Restar el tamaño del call frame a `$sp` +5. Realizar sus instrucciones +6. Actualizar `$sp` con el valor de `$fp` +7. Restaurar el puntero al bloque de la pila `$fp` +8. Restuarar la dirección de retorno en la pila `$ra` + +Debio a estas convenciones el offset de los argumentos se calcula teniendo en cuenta la estructura LIFO de la pila por lo que el último argumento tiene offset 1 y los parámetros su offset se va asignando de forma ascendente respecto al orden al cual fueron declarados empezando desde 0, obteniendo así expresiones para el cómputo de las direcciones de argumentos y parámetros. + +$$ + arg\_addr_i = 4(i + 2) + frame\_addr\\ + param\_addr_i = -4i + frame\_addr +$$ + +Esta estructura es implementada por la clase `ProcCallFrame` la cual permite el cálculo de direcciones de argumentos y parámetros. + +```python +class ProcCallFrame: + def __init__(self,name, nargs, nvars): + self.name = name + self.nargs = nargs + self.size = WSIZE * nvars + self.args = {} # Associates each argument with the offset to be accessed in the stack + self.vars = {} # Associates each parameter with the offset to be accessed in the stack + + def add_argument(self, idx): + self.args[idx] = self.nargs - len(self.args) + + def add_variable(self, idx): + self.vars[idx] = len(self.vars) + + def arg_addr(self, id): + offset = self.args[id] + return f'{(2 + offset) * WSIZE}($fp)' + + def var_addr(self, id): + offset = self.vars[id] + return f'-{offset * WSIZE}($fp)' + + def get_addr(self, id): + try: + return self.arg_addr(id) + except KeyError: + return self.var_addr(id) +``` + +Por tanto este primer recorrido construye instancias de estas clases y las asocia con su correspondiente tipo o función creando un contexto con la información necesaria para manejar la memoria. + +El segundo recorrido se encarga de generar el código MIPS del programa, la idea de este recorrido es bastante simple dado que es solo traducir instrucciones o expresiones muy sencillas de CIL a mips, sin embargo existen ciertos casos de particular interés los cuales expondremos a continuación. + +- Reservar memoria: representada por la instrucción CIL `ALLOCATE `, cuando se reserva memoria para una instancia de la clase de tipo `` el compilador reserva `` espacio y copia la dirección de memoria de la información del tipo en la primera palabra del espacio reservado. + +- Dispatch: representada por la instrucción CIL `VCALL T f` este puede ocurrir de dos formas en dependencia de la especificación del dispatch, en específico del uso del símbolo @. Cuando se realiza el llamado a una función de COOL el primer argumento que es pasado es la dirección de memoria de la instancia desde la cual el método es llamado. Dado que el `VCALL T f` tiene el identificador del tipo estático y de la función a llamar se puede utilizar esta información para calcular la dirección del método con la clase `TypeInfo` del `MIPSContext`, la diferencia radica a partir de que dirección se calcula la posición del método, en el caso de que el dispatch no utilice @ se busca el método a partir de la dirección del tipo dinámico de la instancia, en caso contrario se busca el método a partir de la dirección del tipo ``. + +- Operador `=` : Esta operación puede producirse entre diferentes tipos, a diferencia de otros operaciones como las aritméticas o el resto de operaciones de comparación. Esta particularidad se resolvió definiendo la comparación como un procedimiento built-in principalmente para evitar generar un código con muchas ramas condicionales dado las comparaciones son distintas en dependencia del tipo dinámico de la instancia. + +- Retorno de operadores: Dado que los operadores tienen un tipo de retorno bien definido debido a las reglas de tipado de COOL los operadores se encarga de almacenar el resultado de la operacion en instancias de la clase de su tipo, las operaciones aritméticas crean instancias de tipo `Int` y las operaciones de comparación de tipo `Bool`. + + + + + + + + + + + + + + + + + + From 97c5525369b00eb2353f076eb89ae6eb4040b785 Mon Sep 17 00:00:00 2001 From: Amy Date: Tue, 1 Mar 2022 21:37:31 -0500 Subject: [PATCH 69/81] update report --- doc/report/report.md | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/doc/report/report.md b/doc/report/report.md index 92feb13a4..efa1a5901 100644 --- a/doc/report/report.md +++ b/doc/report/report.md @@ -56,7 +56,7 @@ Utilizando la herramienta `lex` se implementó el tokenizador de texto utilizand ---- -La herramienta `yacc` permite la creación de parsers con gramáticas LALR(1) y la construcción del árbol de sintaxis abstracta mediante gramáticas atributadas. En esta fase se definió la gramatica y la jerarquía de clases a utilizar para construir el AST. +La herramienta `yacc` permite la creación de parsers con gramáticas LALR(1) y la construcción del árbol de sintaxis abstracta mediante gramáticas atributadas. En esta fase se definió la gramática y la jerarquía de clases a utilizar para construir el AST. A continuación definimos la gramática LALR(1) utilizada. @@ -160,7 +160,7 @@ EL lenguaje CIL está dividido en tres secciones: **1.** type: Se definen los tipos (clases) con sus atributos y el encabezado de sus métodos como se explica en la bibliogarfia de la asignatura. -Se conoce que el ast producido por el parser tiene como nodo raiz un ProgramNode que está formado por nodos ClassDeclarationNode que son las clases, y estos a su vez por nodos AttrDeclarationNode y FunctionDeclarationNode que son las definiciones de los atributos y los métodos de una clase. Cuando se visita un ClassDeclarationNode, se crean los nodos CILTypeNode que contienen una lista de CILAttributesNode y una lista de CILMethodNode, los cuales solo contienen el nombre del método y el nombre de la función que lo defino en la sección code. +Se conoce que el ast producido por el parser tiene como nodo raíz un ProgramNode que está formado por nodos ClassDeclarationNode que son las clases, y estos a su vez por nodos AttrDeclarationNode y FunctionDeclarationNode que son las definiciones de los atributos y los métodos de una clase. Cuando se visita un ClassDeclarationNode, se crean los nodos CILTypeNode que contienen una lista de CILAttributesNode y una lista de CILMethodNode, los cuales solo contienen el nombre del método y el nombre de la función que lo defino en la sección code. ``` type A { @@ -169,11 +169,11 @@ type A { } ``` -Como se sabe los métodos y los atributos de un tipo deben siempre definirse en un mismo orden y si un tipo A hereda de B, A debe tener acceso a los atributos y métodos de su padre y de los demás ancestros de él hasta llegar a Object. Para lograr esto se tomaron en orden topológico todos los nodos de las clases y al recorrerlo se fueron agregando los atributos del padre y métodos en el mismo orden, y por último los suyos. De esta forma, cuando se llega a un nodo su padre tiene ya todos sus atributos y métodos definidos, asi como los del los ancestros en orden de aparición. Además, por una mayor comodidad en la implentación, todas las variables o atributos almacenan un tipo además de su nombre, dejando el trabajo de la memorio para la segunda fase de generación. +Como se sabe los métodos y los atributos de un tipo deben siempre definirse en un mismo orden y si un tipo A hereda de B, A debe tener acceso a los atributos y métodos de su padre y de los demás ancestros de él hasta llegar a Object. Para lograr esto se tomaron en orden topológico todos los nodos de las clases y al recorrerlo se fueron agregando los atributos del padre y métodos en el mismo orden, y por último los suyos. De esta forma, cuando se llega a un nodo su padre tiene ya todos sus atributos y métodos definidos, asi como los del los ancestros en orden de aparición. Además, por una mayor comodidad en la implementación, todas las variables o atributos almacenan un tipo además de su nombre, dejando el trabajo de la memoria para la segunda fase de generación. Además a cada tipo se le añade un método especial, el init, que va a ser llamado cada vez que se inicialice una clase desde el código de COOL. Por cada atributo declarado en la clase y que se le asigna una expresión, se van a añadir las instrucciones responsables de inicializar esos valores. Este método va a ser invocado pasándole como argumento la referencia de la variable a la que se le desea asignar este tipo. -Para el caso de los tipos basicos Int, String y Bool, además de añadir el método init, se define un atributo value que contendrá su valor, asignándole cero en la función si no se provee de ninguna expresión de definición; y para el tipo Object e IO, el método init solo se encarga de retornar la instancia de la clase. +Para el caso de los tipos basicos Int, String y Bool, además de añadir el método init, se define un atributo value que contendrá su valor, asignándole cero en la función si no se provee de ninguna expresión de definición; y para el tipo Object e IO, el método init solo se encarga de retornar la instancia de la clase,este mismo método init es el llamado cuando en el lenguaje COOL se utiliza la expresión "new". Los tipos built-in quedan implementadas de la siguiente forma: @@ -235,7 +235,7 @@ type IO { Un método en el AST devuelto por el parser es un FunctionDeclarationNode este en CIL se convertirá en un CILFuntionDeclarationNode, como se mencionó se deben guardar en una parte de la sección code las variables para esto se creará una subsección .local para las mismas y una sección subsección del .code también pero anterior a la .local es .param en donde están todos los parámetros de la función delcarada. Para crear las variables se utiliza un alias que depende de su nombre original, esto se realizó porque una variable de un método o un argumento pueden llamarse como un atributo de la clase y a la vez en una expresión let pueden utilizarse nombres de variables que estén en los parámetros o en otro let más externo, este alias posibillita que la variable al crearla sea única y no sobrescriba variables creadas en otro entorno accesible. -Como se conoce en el lenguaje COOL solo existen expresiones y en el lenguaje CIL se tienen tanto expresiones como instrucciones, por tanto una expresión COOL se traduce a una lista de istrucciones CIL ya sean de asignación o de cambio del valor de un atributo, ifgoto, goto, label, entre otras. Una asignación en CIL puede ser la traducción de una asignación de COOL o puede ser creada para llevar una expresión de Cool distinta de asignacion a una instrucción en CIL, ejemplo cuando queremos realizar una operación suma en COOL cuando una de las partes izquierda o derecha no es un nodo atómico debemos separar en en una asignación a una nueva variable creada en CIL que guarde la expresión de esa parte que no es un nodo atómico y luego a esta sumarla con la parte que si es atómica. +Como se conoce en el lenguaje COOL solo existen expresiones y en el lenguaje CIL se tienen tanto expresiones como instrucciones, por tanto una expresión COOL se traduce a una lista de istrucciones CIL ya sean de asignación o de cambio del valor de un atributo, ifgoto, goto, label, entre otras. Una asignación en CIL puede ser la traducción de una `asignación` de COOL o puede ser creada para llevar una expresión de Cool distinta de asignacion a una instrucción en CIL, ejemplo cuando queremos realizar una operación suma en COOL cuando una de las partes izquierda o derecha no es un nodo atómico debemos separar en en una asignación a una nueva variable creada en CIL que guarde la expresión de esa parte que no es un nodo atómico y luego a esta sumarla con la parte que si es atómica, lo mismo pasa para todas las expresiones binarias. Un caso de especial consideración dentro de las expresiones de COOL es el `case`, el comportamiento esperado es que se compute el tipo dinámico de la expresión de del `case` y se seleccione la rama del tipo ancestro más cercano a dicho tipo. Para resolver esto se recorrieron las ramas del case en orden topológico inverso de acuerdo a su tipo, por lo que visitamos los tipos más especializadas primero, y por cada de rama generamos código para que los descendientes que no tienen una rama asignada sean dirigidos a esta rama. Al final se genera el código de la expresión resultado de cada rama. A continuación presentamos un sencillo pseudocódigo con la idea general del algoritmo @@ -256,7 +256,13 @@ for branch in case: generate_code() ``` +En el caso de una expresión `block` en cool , para llevarla a CIL recorremos todas las exresiones que la compongan , cada una sabe como convertirse al lenguaje CIl y luego retornamos la q devolvió la última expresión del `block`. +En el caso del `let` se debe crear un nuevo ámbito de variable que te permita definir varibles que ya están definidas y a la ves utilizar las anteriores creadas, luego se crean tantas variables como tenga el `let` y tambien para cada una de las expresiones de las mismas y a estas se les asigna lo q devuelve cada una de las expresiones y luego se procede a crear una nueva variable que guarde lo q retorne el recorrido q se le realiza a la expresión in del `let `. + +Para las expresiones unarias en el caso del `prime` lo que se hace es restarle al valor cero la expresión que devuelve el recorrido de la expresión del `prime`, en el caso del `not` se devuelve una nueva variable que guarda el valor de un nuevo NodoCIL CILNotNode que guarda la expresión del `not` la segunda parte de generación de código es el encargado de procesar dicha expresión . En la expresion `isvoid` se recorre la variable y se crea una nueva para asignarle el resultado de este proceso para luego esta pasarla como parámetro y llamar a una función creada llamada `isvoid` que se implementará en la segunda parte de generación de código. El proceso de llamado de funciones en CIL a traves de las expresiones VCALL o CALL estas se utilizan en dependencia de cómo lo necesite la segunda parte de generación de código. + +Cuando se encuentra un nodo string en el ast se agrega a la seccion .`data` y para utilizarlo se utiliza la función `load` de CIL que es agregada a la lista de instrucciones. Para los valores boleanos se crean un expresión `equals` entre 0 y 1 para el False y entre 0 y 0 para el True , esta expresión se le asigna a una nueva variable y es lo que se retorna. En el caso de las variables si esta es un atributo se crea una nueva variable que se e asignará el resultado de hacer `get attr` y si es una varible local se busca en el scope. Cada vez q se crea una varible esta se añade al scope y a esta se le asigna el valor de una expresión que esta expresión es un nuevo nodo creado que pertenece al lenguaje CIL , estas asignaciónes se añaden a la lista de instrucciones al igual que aquellas instrucciones de CIL que se necesitan para convertir una expresión del leguaje COOL a CIL. **Generación de código MIPS** @@ -271,7 +277,7 @@ A continuación definiremos las ideas seguidas para la representación de los ti 1. El valor de los atributos de una clase son independientes para cada instancia de la clase, sin embargo, los métodos de la clase son globales para todas las instancias. Esto permite separar la información global del tipo en memoria estática y la información de las instancias en memoria dinámica. 2. Los identificadores de las clases en COOL son únicos y por tanto los identificadores de los tipos también lo son. Esto permite utilizar su nombre como alias a la dirección de memoria donde se almacena la información del tipo. La información que se decidió almacenar sobre los tipos fue su tamaño (para la creación dinámica de instancias mediante `copy`), su representación como string (para la implementación de `type_name`) y las direcciones de los métodos del tipo. - + ```mips .data : .asciiz @@ -396,8 +402,7 @@ El segundo recorrido se encarga de generar el código MIPS del programa, la idea - Retorno de operadores: Dado que los operadores tienen un tipo de retorno bien definido debido a las reglas de tipado de COOL los operadores se encarga de almacenar el resultado de la operacion en instancias de la clase de su tipo, las operaciones aritméticas crean instancias de tipo `Int` y las operaciones de comparación de tipo `Bool`. - - + ​ From 29f963ca7eda8a842cc055d035275d3c4e11db3c Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Tue, 1 Mar 2022 23:04:04 -0500 Subject: [PATCH 70/81] Cleaning working directory --- src/code_generator/formatter.py | 75 - src/code_generator/mips_built_in.py | 103 - src/code_generator/saved.txt | 57 - src/{code_generator => codegen}/ast_CIL.py | 0 .../cil_codegen.py | 2 +- .../generate_ast.py | 85 +- .../mips_built_in.txt | 0 src/{code_generator => codegen}/spim_scope.py | 2 +- .../spim_visitor.py | 13 +- src/{code_generator => codegen}/utils.py | 2 +- src/cool.py | 21 +- src/output.cil | 237 - src/program.cl | 430 - src/program.mips | 12934 ---------------- src/result.s | 10318 ------------ src/{tours => semantics}/TypeBuilder.py | 6 +- src/{tours => semantics}/TypeChecker.py | 6 +- src/{tours => semantics}/TypeCollector.py | 6 +- src/{cmp => semantics}/semantic.py | 0 src/{tours => semantics}/utils.py | 2 +- src/test.txt | 8 - src/test1.txt | 10 - src/test2.txt | 8 - src/test3.txt | 7 - src/test4.txt | 25 - src/test5.txt | 18 - src/test6.txt | 68 - src/{cmp => utils}/visitor.py | 0 28 files changed, 30 insertions(+), 24413 deletions(-) delete mode 100644 src/code_generator/formatter.py delete mode 100644 src/code_generator/mips_built_in.py delete mode 100644 src/code_generator/saved.txt rename src/{code_generator => codegen}/ast_CIL.py (100%) rename src/{code_generator => codegen}/cil_codegen.py (99%) rename src/{code_generator => codegen}/generate_ast.py (81%) rename src/{code_generator => codegen}/mips_built_in.txt (100%) rename src/{code_generator => codegen}/spim_scope.py (99%) rename src/{code_generator => codegen}/spim_visitor.py (98%) rename src/{code_generator => codegen}/utils.py (99%) delete mode 100644 src/output.cil delete mode 100644 src/program.cl delete mode 100644 src/program.mips delete mode 100644 src/result.s rename src/{tours => semantics}/TypeBuilder.py (97%) rename src/{tours => semantics}/TypeChecker.py (97%) rename src/{tours => semantics}/TypeCollector.py (93%) rename src/{cmp => semantics}/semantic.py (100%) rename src/{tours => semantics}/utils.py (90%) delete mode 100644 src/test.txt delete mode 100644 src/test1.txt delete mode 100755 src/test2.txt delete mode 100644 src/test3.txt delete mode 100644 src/test4.txt delete mode 100644 src/test5.txt delete mode 100644 src/test6.txt rename src/{cmp => utils}/visitor.py (100%) diff --git a/src/code_generator/formatter.py b/src/code_generator/formatter.py deleted file mode 100644 index cc59252f5..000000000 --- a/src/code_generator/formatter.py +++ /dev/null @@ -1,75 +0,0 @@ -FP = "$fp" -SP = "$sp" -RA = "$ra" -A0 = "$a0" -A1 = "$a1" -A2 = "$a2" -A3 = "$a3" -A4 = "$a4" -A5 = "$a5" -A6 = "$a6" -V0 = "$v0" -V1 = "$v1" -V2 = "$v2" -V3 = "$v3" -V4 = "$v4" -V5 = "$v5" -V6 = "$v6" -V7 = "$v7" - -class MIPSFormatter: - def __init__(self): - self.code = "" - - def reset(self): - self.code = "" - - def new_line(self): - self.code += '\n' - - def move(self, reg1, reg2): - self.code += f"\tmove {reg1}, {reg2}\n" - - def load_int(self, reg, val): - self.code += f"\tli {reg}, {val}\n" - - def syscall(self): - self.code += f"\tsyscall\n" - - def push(self, val): - self.code += f"\tsw {val}, 0($sp)\n" - self.code += f"\taddu $sp, $sp, -4\n" - - def pop(self, reg): - self.code += f"\tlw {reg}, 0($sp)\n" - self.code += f"\taddu $sp, $sp, 4\n" - - def label(self, label): - self.code += f"{label}:\n" - - def load_byte(self, reg, val): - self.code += f"\tlb {reg}, {val}\n" - - def jump(self, label): - self.code += f"\tj {label}\n" - - def jump_return(self): - self.code += f"\tjr $ra\n" - - def jal(self, proc): - self.code += f"\tjal proc\n" - - def load_word(self, reg, addr): - self.code += f"\tlw {reg}, {addr}\n" - - def save_word(self, reg, addr): - self.code += f"\tsw {reg}, {addr}\n" - - def addu(self, dst, op1, op2): - self.code += f"\taddu {dst}, {op1}, {op2}\n" - - def bgtz(self, reg, label): - self.code += f"\tbgtz {reg}, {label}\t" - - def addr(self, offset, reg): - return f'{offset}({reg})' diff --git a/src/code_generator/mips_built_in.py b/src/code_generator/mips_built_in.py deleted file mode 100644 index 3cd13b10b..000000000 --- a/src/code_generator/mips_built_in.py +++ /dev/null @@ -1,103 +0,0 @@ -from .formatter import * - -coder = MIPSFormatter() -coder.label("Object_abort") -coder.load_int(V0, 55) -coder.move(A0, "ObjectErrorMessage") -coder.load_int(A1, 0) -coder.syscall() -coder.new_line() -coder.load_int(V0, 17) -coder.load_int(A0, 1) -coder.syscall() - -OBJECT_ABORT = coder.code - -coder.reset() - -coder.label("Object_type_name") -coder.push(RA) -coder.push(FP) -coder.move(FP, SP) - -coder.new_line() -coder.load_word(V7, '12($fp})') -coder.load_word(V6, '0($v7)') - -coder.new_line() -coder.load_word(A0, '4($v6)') -coder.load_int(V0, 4) -coder.syscall() - -coder.new_line() -coder.move(SP, FP) -coder.pop(FP) -coder.pop(RA) -coder.jump_return() - -OBJECT_TYPE_NAME = coder.code - -coder.reset() - -coder.label("copy_Object") -coder.load_word(V7, '12($fp)') -coder.load_word(V6, '0($v7)') -coder.load_word(V5, '0($v6)') - -coder.new_line() -coder.move(A0, V7) -coder.load_int(V0, 9) -coder.syscall() - -coder.move(V6, V0) -coder.label("copy_Object_loop") -coder.load_word(V4, '0($v7)') -coder.save_word(V4, '0($v6)') -coder.addu(V7, V7, 4) -coder.addu(V6, V6, 4) -coder.addu(V5, V5, -4) -coder.bgtz(V5, "copy_Object_loop") -coder.jump_return() - -OBJECT_COPY = coder.code - -coder.reset() -coder.label("out_string_IO") -coder.load_word(A0, '12($fp)') -coder.move(V0, 4) -coder.syscall() -coder.jump_return() - -IO_OUT_STRING = coder.code - -coder.reset() -coder.label("out_int_IO") -coder.load_word(V1, '12($fp)') -coder.load_word(A0, '4($v1)') -coder.load_int(V0, 1) -coder.syscall() -coder.jump_return() - -IO_OUT_INT = coder.code - -coder.reset() -coder.label("strlen_String") -coder.load_word(A0, '12($fp)') - - - -coder.label("in_string_IO") -coder.move(A0, "IO_Buffer") -coder.load_int(A1, 300) -coder.syscall() - - - - - - - - - - - diff --git a/src/code_generator/saved.txt b/src/code_generator/saved.txt deleted file mode 100644 index 8eae30c85..000000000 --- a/src/code_generator/saved.txt +++ /dev/null @@ -1,57 +0,0 @@ -in_string_IO: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - # Read the string to the buffer - la $a0, IO_Buffer - li $a1, 1000 - li $v0, 8 - syscall - - # get the length of the string to allocate the memory - la $t0, IO_Buffer - sw $t0, 0($sp) - addi $sp, $sp, -4 - jal strlen - addi $sp, $sp, 4 - lw $t0, 0($sp) # the length is now in $v0 - - addi $v0, $v0, 1 - move $a0, $v0 - li $v0, 9 - syscall # in $v0 is the address of the value string - - la $t1, IO_Buffer # copy the string value from the buffer to the heap - move $t2, $v0 - in_string_IO_loop: - lb $t3, 0($t1) - sb $t3, 0($t2) - addi $t1, $t1, 1 - addi $t2, $t2, 1 - bgtz $t3, in_string_IO_loop - addi $t2, $t2, -2 - li $t3, 0 - sb $t3, 0($t2) - - move $t0, $v0 - - li $a0, 8 - li $v0, 9 - syscall - - la $t1, String - sw $t0, 4($v0) - sw $t1, 0($v0) - - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra diff --git a/src/code_generator/ast_CIL.py b/src/codegen/ast_CIL.py similarity index 100% rename from src/code_generator/ast_CIL.py rename to src/codegen/ast_CIL.py diff --git a/src/code_generator/cil_codegen.py b/src/codegen/cil_codegen.py similarity index 99% rename from src/code_generator/cil_codegen.py rename to src/codegen/cil_codegen.py index f82a09beb..0f9e46deb 100644 --- a/src/code_generator/cil_codegen.py +++ b/src/codegen/cil_codegen.py @@ -1,4 +1,4 @@ -import cmp.visitor as visitor +import utils.visitor as visitor from .ast_CIL import * eol = '\n' diff --git a/src/code_generator/generate_ast.py b/src/codegen/generate_ast.py similarity index 81% rename from src/code_generator/generate_ast.py rename to src/codegen/generate_ast.py index 57677a247..4a8d9d7f2 100644 --- a/src/code_generator/generate_ast.py +++ b/src/codegen/generate_ast.py @@ -2,8 +2,8 @@ from parsing.ast import * from .ast_CIL import * from .utils import * -from cmp.semantic import IOType, IntType, StringType, BoolType, ObjectType -import cmp.visitor as visitor +from semantics.semantic import IOType, IntType, StringType, BoolType, ObjectType +import utils.visitor as visitor @@ -307,86 +307,7 @@ def visit(self, node): return var_result - # @visitor.when(CaseNode) - # def visit(self, node): - # self.scope.aux_lo = [] - # expr = self.visit(node.expr) - # self.expression_var_case = expr - # print("lolllllllllllllllllllllllllllllll") - # new_cases, valid = return_list_valid_case(node, self.to, self.table) - # print(new_cases) - # print("lolllllllllllllllllllllllllllllll") - # name = self.scope.add_new_local(node.expr.computed_type.name) - # var = CILVariableNode(name) - - # self.scope.instructions.append(CILAssignNode(var, expr)) - - # expr_type_of = CILTypeOfNode(var) - # name_type_expr = self.scope.add_new_local(node.expr.computed_type.name) - # self.scope.instructions.append(CILAssignNode(CILVariableNode(name_type_expr), expr_type_of)) - - # name_return = self.scope.add_new_local(node.computed_type.name) - # return_ = CILVariableNode(name_return) - # keys = [ key.type for key in node.cases ] - # index = 0 - # expr = {} - # #aqui agrego las ramas originales - # for case in node.cases: - # name_var_condition = self.scope.add_new_local(None) - # var_condition = CILVariableNode(name_var_condition) - - # if index != 0: - # self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index - 1}')) - # case_expr_type_of = CILTypeConstantNode(case.type) - # self.scope.instructions.append(CILAssignNode(var_condition, CILNotEqualsNode(CILVariableNode(name_type_expr),case_expr_type_of))) - - # if index == len(node.cases) - 1 and len(new_cases) == 0 : - # self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'case_end{self.scope.case_count}'))) - # else: - # self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'branch_{self.scope.case_count}_{index}'))) - # #aqui hay problema porque dentro del visit que llama al metodo que esta despues de este se crea un nuevo scope - # #las nuevaslocales estan all_locals - # expr_attr = self.visit(case) - # expr[case.type] = expr_attr - # self.scope.instructions.append(CILAssignNode(return_, expr_attr)) - # index += 1 - # artific = False - # type = [] - # for (new_branch,i) in new_cases : - # for name,j in zip(keys,range(0,len(keys))): - # try: - # can_ = False - # try: - # type.index(new_branch) - # except: - # can_= True - - # if can_ and new_branch not in keys and (new_branch,i) in valid[name]: - # type.append(new_branch) - # artific =True - # self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index-1}')) - # case_expr_type_of = CILTypeConstantNode(new_branch) - # self.scope.instructions.append(CILAssignNode(var_condition, CILNotEqualsNode(CILVariableNode(name_type_expr),case_expr_type_of))) - # if index == (len(node.cases) + len(new_cases)) : - # self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'case_end{self.scope.case_count}'))) - # else: - # self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'branch_{self.scope.case_count}_{index}'))) - # self.scope.instructions.append(CILAssignNode(CILVariableNode(self.scope.aux_lo[j]), self.expression_var_case)) - # self.scope.instructions.append(CILAssignNode(return_, expr[name])) - # self.scope.instructions.append(CILGotoNode(CILLabelNode(f'case_end{self.scope.case_count}'))) - # index +=1 - # except : - # pass - - # if artific: - # index-=1 - # self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index}')) - # self.scope.instructions.append(CILAssignNode(return_,CILExceptionNode("Errorrr"))) - # self.scope.instructions.append(CILGotoNode(CILLabelNode(f'case_end{self.scope.case_count}'))) - # self.scope.instructions.append(CILLabelNode(f'case_end{ self.scope.case_count}')) - # self.scope.case_count += 1 - # return return_ - # #self.scope.instructions.append(CILAssignNode(return_,CILExceptionNode("Exception in case "))) + @visitor.when(CaseAttrNode) def visit(self, node): diff --git a/src/code_generator/mips_built_in.txt b/src/codegen/mips_built_in.txt similarity index 100% rename from src/code_generator/mips_built_in.txt rename to src/codegen/mips_built_in.txt diff --git a/src/code_generator/spim_scope.py b/src/codegen/spim_scope.py similarity index 99% rename from src/code_generator/spim_scope.py rename to src/codegen/spim_scope.py index 22dde5c99..dc0077985 100644 --- a/src/code_generator/spim_scope.py +++ b/src/codegen/spim_scope.py @@ -1,4 +1,4 @@ -import cmp.visitor as visitor +import utils.visitor as visitor from .ast_CIL import * WSIZE = 4 diff --git a/src/code_generator/spim_visitor.py b/src/codegen/spim_visitor.py similarity index 98% rename from src/code_generator/spim_visitor.py rename to src/codegen/spim_visitor.py index 8dfc8c14d..3ecedcb75 100644 --- a/src/code_generator/spim_visitor.py +++ b/src/codegen/spim_visitor.py @@ -1,4 +1,4 @@ -import cmp.visitor as visitor +import utils.visitor as visitor from .spim_scope import * from .ast_CIL import * @@ -63,7 +63,7 @@ def visit(self, node: CILProgramNode, frame): self.visit(f, frame) self.add_line('') - with open('./code_generator/mips_built_in.txt') as file: + with open('./codegen/mips_built_in.txt') as file: self.code += file.read() @visitor.when(CILTypeNode) @@ -276,13 +276,8 @@ def visit(self, node: CILVCallNode, frame): # use the information of the static type to get the location of the method in memory t = self.scope.types[node.type] - try: - method_addr = t.get_method_addr(node.func, '$t0') - except: - print(node.func) - print(t.id) - print('shdglsdglsjdg0000000000000') - print(t.methods_offset) + method_addr = t.get_method_addr(node.func, '$t0') + self.add_line(f'lw $v1, {method_addr}') self.add_line(f'jal $v1') # calls the method and by convention methods return in $v0 diff --git a/src/code_generator/utils.py b/src/codegen/utils.py similarity index 99% rename from src/code_generator/utils.py rename to src/codegen/utils.py index 629b2ba4d..65b44fce9 100644 --- a/src/code_generator/utils.py +++ b/src/codegen/utils.py @@ -1,4 +1,4 @@ -from cmp.semantic import IntType, ObjectType, StringType, BoolType +from semantics.semantic import IntType, ObjectType, StringType, BoolType from .ast_CIL import * from collections import deque from itertools import chain diff --git a/src/cool.py b/src/cool.py index b6529d0be..b304c7441 100644 --- a/src/cool.py +++ b/src/cool.py @@ -1,13 +1,13 @@ import sys from parsing.parser import COOL_Parser from parsing.lexer import COOL_Lexer -from tours.TypeCollector import TypeCollector -from tours.TypeBuilder import TypeBuilder -from tours.TypeChecker import TypeChecker -from code_generator.generate_ast import CIL -from code_generator.cil_codegen import CILCodegen -from code_generator.spim_scope import MIPSScopeBuilder -from code_generator.spim_visitor import MIPSCodegen +from semantics.TypeCollector import TypeCollector +from semantics.TypeBuilder import TypeBuilder +from semantics.TypeChecker import TypeChecker +from codegen.generate_ast import CIL +from codegen.cil_codegen import CILCodegen +from codegen.spim_scope import MIPSScopeBuilder +from codegen.spim_visitor import MIPSCodegen input_file = sys.argv[1] with open(input_file, 'r') as f: s = f.read() @@ -51,8 +51,7 @@ #print(cil) cil_codegen = CILCodegen() code = cil_codegen.visit(cil) -with open(f'output.cil', 'w') as f: - f.write(code) + mips_scope_builder = MIPSScopeBuilder() scope = mips_scope_builder.visit(cil) @@ -60,8 +59,8 @@ mips_codegen = MIPSCodegen(scope) mips_codegen.visit(cil, None) #print(mips_codegen.code) -with open(f'output.out', 'w') as f: - f.write(mips_codegen.code) with open(f'{input_file[:-3]}.mips', 'w') as f: f.write(mips_codegen.code) +with open(f'{input_file[:-3]}.cil', 'w') as f: + f.write(code) exit(0) diff --git a/src/output.cil b/src/output.cil deleted file mode 100644 index bfa574fb0..000000000 --- a/src/output.cil +++ /dev/null @@ -1,237 +0,0 @@ -.TYPES - -type Main { - - method Init_Main : Init_Main; - method abort : abort_Object; - method type_name : type_name_Object; - method copy : copy_Object; - method out_string : out_string_IO; - method out_int : out_int_IO; - method in_string : in_string_IO; - method in_int : in_int_IO; - method main : main_Main; - method fib : fib_Main; -} - -type Object { - - method Init_Object : Init_Object; - method abort : abort_Object; - method type_name : type_name_Object; - method copy : copy_Object; -} - -type Int { - attribute value; - - method Init_Int : Init_Int; - method abort : abort_Object; - method type_name : type_name_Object; - method copy : copy_Object; -} - -type String { - attribute value; - - method Init_String : Init_String; - method abort : abort_Object; - method type_name : type_name_Object; - method copy : copy_Object; - method length : length_String; - method concat : concat_String; - method substr : substr_String; -} - -type Bool { - attribute value; - - method Init_Bool : Init_Bool; - method abort : abort_Object; - method type_name : type_name_Object; - method copy : copy_Object; -} - -type IO { - - method Init_IO : Init_IO; - method abort : abort_Object; - method type_name : type_name_Object; - method copy : copy_Object; - method out_string : out_string_IO; - method out_int : out_int_IO; - method in_string : in_string_IO; - method in_int : in_int_IO; -} - - -.DATA - -str_empty = ""; -str_0 = "Enter n to find nth fibonacci number!\n"; -str_1 = "\n"; - -.CODE - -function main { - - LOCAL m0; - LOCAL m1; - LOCAL m2; - - m0 = ALLOCATE Main; - ARG m0; - m1 = VCALL Main Init_Main; - ARG m1; - m2 = VCALL Main main; - RETURN m2; - -} - - -function main_Main { - PARAM self_Main; - - LOCAL t_0; - LOCAL t_1; - LOCAL t_2; - LOCAL t_3; - LOCAL t_4; - LOCAL t_5; - LOCAL t_6; - LOCAL t_7; - LOCAL t_8; - LOCAL t_9; - LOCAL t_10; - LOCAL t_11; - - t_0 = LOAD str_0; - t_1 = t_0; - ARG self_Main; - ARG t_1; - t_2 = VCALL Main out_string; - ARG self_Main; - t_3 = VCALL Main in_int; - t_4 = t_3; - ARG self_Main; - ARG t_4; - t_5 = VCALL Main fib; - t_6 = t_5; - ARG self_Main; - ARG t_6; - t_7 = VCALL Main out_int; - t_8 = LOAD str_1; - t_9 = t_8; - ARG self_Main; - ARG t_9; - t_10 = VCALL Main out_string; - t_11 = t_10; - RETURN t_11; - -} - - -function fib_Main { - PARAM self_Main; - PARAM i_12; - - LOCAL a_13; - LOCAL b_14; - LOCAL c_15; - LOCAL t_16; - LOCAL t_17; - LOCAL t_18; - LOCAL t_19; - LOCAL t_20; - LOCAL t_21; - LOCAL t_22; - LOCAL t_23; - - a_13 = 1; - b_14 = 0; - c_15 = 0; -while_0: - t_16 = i_12 == 0; - t_17 = t_16; - t_18 = ; - t_19 = t_18; - IF t_19 GOTO body_0; - GOTO pool_0; -body_0: - t_21 = a_13 + b_14; - c_15 = t_21; - t_22 = i_12 - 1; - i_12 = t_22; - b_14 = a_13; - a_13 = c_15; - t_20 = a_13; - GOTO while_0; -pool_0: - t_23 = c_15; - RETURN t_23; - -} - - -function Init_Main { - PARAM self_Main; - - - ARG self_Main; - self_Main = CALL Init_IO; - RETURN self_Main; - -} - - -function Init_Object { - PARAM self; - - - RETURN self; - -} - - -function Init_Int { - PARAM self; - PARAM v; - - - SETATTR self value v; - RETURN self; - -} - - -function Init_String { - PARAM self; - PARAM v; - - - SETATTR self value v; - RETURN self; - -} - - -function Init_Bool { - PARAM self; - PARAM v; - - - SETATTR self value v; - RETURN self; - -} - - -function Init_IO { - PARAM self; - - - RETURN self; - -} - - diff --git a/src/program.cl b/src/program.cl deleted file mode 100644 index af5951cf7..000000000 --- a/src/program.cl +++ /dev/null @@ -1,430 +0,0 @@ -(* - * A contribution from Anne Sheets (sheets@cory) - * - * Tests the arithmetic operations and various other things - *) - -class A { - - var : Int <- 0; - - value() : Int { var }; - - set_var(num : Int) : A{ - { - var <- num; - self; - } - }; - - method1(num : Int) : A { -- same - self - }; - - method2(num1 : Int, num2 : Int) : A { -- plus - (let x : Int in - { - x <- num1 + num2; - (new B).set_var(x); - } - ) - }; - - method3(num : Int) : A { -- negate - (let x : Int in - { - x <- ~num; - (new C).set_var(x); - } - ) - }; - - method4(num1 : Int, num2 : Int) : A { -- diff - if num2 < num1 then - (let x : Int in - { - x <- num1 - num2; - (new D).set_var(x); - } - ) - else - (let x : Int in - { - x <- num2 - num1; - (new D).set_var(x); - } - ) - fi - }; - - method5(num : Int) : A { -- factorial - (let x : Int <- 1 in - { - (let y : Int <- 1 in - while y <= num loop - { - x <- x * y; - y <- y + 1; - } - pool - ); - (new E).set_var(x); - } - ) - }; - -}; - -class B inherits A { -- B is a number squared - - method5(num : Int) : A { -- square - (let x : Int in - { - x <- num * num; - (new E).set_var(x); - } - ) - }; - -}; - -class C inherits B { - - method6(num : Int) : A { -- negate - (let x : Int in - { - x <- ~num; - (new A).set_var(x); - } - ) - }; - - method5(num : Int) : A { -- cube - (let x : Int in - { - x <- num * num * num; - (new E).set_var(x); - } - ) - }; - -}; - -class D inherits B { - - method7(num : Int) : Bool { -- divisible by 3 - (let x : Int <- num in - if x < 0 then method7(~x) else - if 0 = x then true else - if 1 = x then false else - if 2 = x then false else - method7(x - 3) - fi fi fi fi - ) - }; - -}; - -class E inherits D { - - method6(num : Int) : A { -- division - (let x : Int in - { - x <- num / 8; - (new A).set_var(x); - } - ) - }; - -}; - -(* The following code is from atoi.cl in ~cs164/examples *) - -(* - The class A2I provides integer-to-string and string-to-integer -conversion routines. To use these routines, either inherit them -in the class where needed, have a dummy variable bound to -something of type A2I, or simpl write (new A2I).method(argument). -*) - - -(* - c2i Converts a 1-character string to an integer. Aborts - if the string is not "0" through "9" -*) -class A2I { - - c2i(char : String) : Int { - if char = "0" then 0 else - if char = "1" then 1 else - if char = "2" then 2 else - if char = "3" then 3 else - if char = "4" then 4 else - if char = "5" then 5 else - if char = "6" then 6 else - if char = "7" then 7 else - if char = "8" then 8 else - if char = "9" then 9 else - { abort(); 0; } (* the 0 is needed to satisfy the - typchecker *) - fi fi fi fi fi fi fi fi fi fi - }; - -(* - i2c is the inverse of c2i. -*) - i2c(i : Int) : String { - if i = 0 then "0" else - if i = 1 then "1" else - if i = 2 then "2" else - if i = 3 then "3" else - if i = 4 then "4" else - if i = 5 then "5" else - if i = 6 then "6" else - if i = 7 then "7" else - if i = 8 then "8" else - if i = 9 then "9" else - { abort(); ""; } -- the "" is needed to satisfy the typchecker - fi fi fi fi fi fi fi fi fi fi - }; - -(* - a2i converts an ASCII string into an integer. The empty string -is converted to 0. Signed and unsigned strings are handled. The -method aborts if the string does not represent an integer. Very -long strings of digits produce strange answers because of arithmetic -overflow. - -*) - a2i(s : String) : Int { - if s.length() = 0 then 0 else - if s.substr(0,1) = "-" then ~a2i_aux(s.substr(1,s.length()-1)) else - if s.substr(0,1) = "+" then a2i_aux(s.substr(1,s.length()-1)) else - a2i_aux(s) - fi fi fi - }; - -(* a2i_aux converts the usigned portion of the string. As a - programming example, this method is written iteratively. *) - - - a2i_aux(s : String) : Int { - (let int : Int <- 0 in - { - (let j : Int <- s.length() in - (let i : Int <- 0 in - while i < j loop - { - int <- int * 10 + c2i(s.substr(i,1)); - i <- i + 1; - } - pool - ) - ); - int; - } - ) - }; - -(* i2a converts an integer to a string. Positive and negative - numbers are handled correctly. *) - - i2a(i : Int) : String { - if i = 0 then "0" else - if 0 < i then i2a_aux(i) else - "-".concat(i2a_aux(i * ~1)) - fi fi - }; - -(* i2a_aux is an example using recursion. *) - - i2a_aux(i : Int) : String { - if i = 0 then "" else - (let next : Int <- i / 10 in - i2a_aux(next).concat(i2c(i - next * 10)) - ) - fi - }; - -}; - -class Main inherits IO { - - char : String; - avar : A; - a_var : A; - flag : Bool <- true; - - - menu() : String { - { - out_string("\n\tTo add a number to "); - print(avar); - out_string("...enter a:\n"); - out_string("\tTo negate "); - print(avar); - out_string("...enter b:\n"); - out_string("\tTo find the difference between "); - print(avar); - out_string("and another number...enter c:\n"); - out_string("\tTo find the factorial of "); - print(avar); - out_string("...enter d:\n"); - out_string("\tTo square "); - print(avar); - out_string("...enter e:\n"); - out_string("\tTo cube "); - print(avar); - out_string("...enter f:\n"); - out_string("\tTo find out if "); - print(avar); - out_string("is a multiple of 3...enter g:\n"); - out_string("\tTo divide "); - print(avar); - out_string("by 8...enter h:\n"); - out_string("\tTo get a new number...enter j:\n"); - out_string("\tTo quit...enter q:\n\n"); - in_string(); - } - }; - - prompt() : String { - { - out_string("\n"); - out_string("Please enter a number... "); - in_string(); - } - }; - - get_int() : Int { - { - (let z : A2I <- new A2I in - (let s : String <- prompt() in - z.a2i(s) - ) - ); - } - }; - - is_even(num : Int) : Bool { - (let x : Int <- num in - if x < 0 then is_even(~x) else - if 0 = x then true else - if 1 = x then false else - is_even(x - 2) - fi fi fi - ) - }; - - class_type(var : A) : IO { - case var of - a : A => out_string("Class type is now A\n"); - b : B => out_string("Class type is now B\n"); - c : C => out_string("Class type is now C\n"); - d : D => out_string("Class type is now D\n"); - e : E => out_string("Class type is now E\n"); - o : Object => out_string("Oooops\n"); - esac - }; - - print(var : A) : IO { - (let z : A2I <- new A2I in - { - out_string(z.i2a(var.value())); - out_string(" "); - } - ) - }; - - main() : Object { - { - avar <- (new A); - while flag loop - { - -- avar <- (new A).set_var(get_int()); - out_string("number "); - print(avar); - if is_even(avar.value()) then - out_string("is even!\n") - else - out_string("is odd!\n") - fi; - -- print(avar); -- prints out answer - class_type(avar); - char <- menu(); - if char = "a" then -- add - { - a_var <- (new A).set_var(get_int()); - avar <- (new B).method2(avar.value(), a_var.value()); - } else - if char = "b" then -- negate - case avar of - c : C => avar <- c.method6(c.value()); - a : A => avar <- a.method3(a.value()); - o : Object => { - out_string("Oooops\n"); - abort(); 0; - }; - esac else - if char = "c" then -- diff - { - a_var <- (new A).set_var(get_int()); - avar <- (new D).method4(avar.value(), a_var.value()); - } else - if char = "d" then avar <- (new C)@A.method5(avar.value()) else - -- factorial - if char = "e" then avar <- (new C)@B.method5(avar.value()) else - -- square - if char = "f" then avar <- (new C)@C.method5(avar.value()) else - -- cube - if char = "g" then -- multiple of 3? - if ((new D).method7(avar.value())) - then -- avar <- (new A).method1(avar.value()) - { - out_string("number "); - print(avar); - out_string("is divisible by 3.\n"); - } - else -- avar <- (new A).set_var(0) - { - out_string("number "); - print(avar); - out_string("is not divisible by 3.\n"); - } - fi else - if char = "h" then - (let x : A in - { - x <- (new E).method6(avar.value()); - (let r : Int <- (avar.value() - (x.value() * 8)) in - { - out_string("number "); - print(avar); - out_string("is equal to "); - print(x); - out_string("times 8 with a remainder of "); - (let a : A2I <- new A2I in - { - out_string(a.i2a(r)); - out_string("\n"); - } - ); -- end let a: - } - ); -- end let r: - avar <- x; - } - ) -- end let x: - else - if char = "j" then avar <- (new A) - else - if char = "q" then flag <- false - else - avar <- (new A).method1(avar.value()) -- divide/8 - fi fi fi fi fi fi fi fi fi fi; - } - pool; - } - }; - -}; - diff --git a/src/program.mips b/src/program.mips deleted file mode 100644 index 0c28d4d0a..000000000 --- a/src/program.mips +++ /dev/null @@ -1,12934 +0,0 @@ - .data - .align 4 -type: .word 8 - - .data -_A: .asciiz "A\n" - .data - .align 4 -A: .word 8 _A Init_A abort_Object type_name_Object copy_Object value_A set_var_A method1_A method2_A method3_A method4_A method5_A - - .data -_B: .asciiz "B\n" - .data - .align 4 -B: .word 8 _B Init_B abort_Object type_name_Object copy_Object value_A set_var_A method1_A method2_A method3_A method4_A method5_B - - .data -_C: .asciiz "C\n" - .data - .align 4 -C: .word 8 _C Init_C abort_Object type_name_Object copy_Object value_A set_var_A method1_A method2_A method3_A method4_A method5_C method6_C - - .data -_D: .asciiz "D\n" - .data - .align 4 -D: .word 8 _D Init_D abort_Object type_name_Object copy_Object value_A set_var_A method1_A method2_A method3_A method4_A method5_B method7_D - - .data -_E: .asciiz "E\n" - .data - .align 4 -E: .word 8 _E Init_E abort_Object type_name_Object copy_Object value_A set_var_A method1_A method2_A method3_A method4_A method5_B method7_D method6_E - - .data -_A2I: .asciiz "A2I\n" - .data - .align 4 -A2I: .word 4 _A2I Init_A2I abort_Object type_name_Object copy_Object c2i_A2I i2c_A2I a2i_A2I a2i_aux_A2I i2a_A2I i2a_aux_A2I - - .data -_Main: .asciiz "Main\n" - .data - .align 4 -Main: .word 20 _Main Init_Main abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO menu_Main prompt_Main get_int_Main is_even_Main class_type_Main print_Main main_Main - - .data -_Object: .asciiz "Object\n" - .data - .align 4 -Object: .word 4 _Object Init_Object abort_Object type_name_Object copy_Object - - .data -_Int: .asciiz "Int\n" - .data - .align 4 -Int: .word 8 _Int Init_Int abort_Object type_name_Object copy_Object - - .data -_String: .asciiz "String\n" - .data - .align 4 -String: .word 8 _String Init_String abort_Object type_name_Object copy_Object length_String concat_String substr_String - - .data -_Bool: .asciiz "Bool\n" - .data - .align 4 -Bool: .word 8 _Bool Init_Bool abort_Object type_name_Object copy_Object - - .data -_IO: .asciiz "IO\n" - .data - .align 4 -IO: .word 4 _IO Init_IO abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO - - .data -ObjectAbortMessage : .asciiz "Abort called from class " - .data -IO_Buffer : .space 1001 - .data -str_empty: .asciiz "" - - .data -str_0: .asciiz "0" - - .data -str_1: .asciiz "1" - - .data -str_2: .asciiz "2" - - .data -str_3: .asciiz "3" - - .data -str_4: .asciiz "4" - - .data -str_5: .asciiz "5" - - .data -str_6: .asciiz "6" - - .data -str_7: .asciiz "7" - - .data -str_8: .asciiz "8" - - .data -str_9: .asciiz "9" - - .data -str_10: .asciiz "" - - .data -str_11: .asciiz "9" - - .data -str_12: .asciiz "8" - - .data -str_13: .asciiz "7" - - .data -str_14: .asciiz "6" - - .data -str_15: .asciiz "5" - - .data -str_16: .asciiz "4" - - .data -str_17: .asciiz "3" - - .data -str_18: .asciiz "2" - - .data -str_19: .asciiz "1" - - .data -str_20: .asciiz "0" - - .data -str_21: .asciiz "-" - - .data -str_22: .asciiz "+" - - .data -str_23: .asciiz "-" - - .data -str_24: .asciiz "0" - - .data -str_25: .asciiz "" - - .data -str_26: .asciiz "\n\tTo add a number to " - - .data -str_27: .asciiz "...enter a:\n" - - .data -str_28: .asciiz "\tTo negate " - - .data -str_29: .asciiz "...enter b:\n" - - .data -str_30: .asciiz "\tTo find the difference between " - - .data -str_31: .asciiz "and another number...enter c:\n" - - .data -str_32: .asciiz "\tTo find the factorial of " - - .data -str_33: .asciiz "...enter d:\n" - - .data -str_34: .asciiz "\tTo square " - - .data -str_35: .asciiz "...enter e:\n" - - .data -str_36: .asciiz "\tTo cube " - - .data -str_37: .asciiz "...enter f:\n" - - .data -str_38: .asciiz "\tTo find out if " - - .data -str_39: .asciiz "is a multiple of 3...enter g:\n" - - .data -str_40: .asciiz "\tTo divide " - - .data -str_41: .asciiz "by 8...enter h:\n" - - .data -str_42: .asciiz "\tTo get a new number...enter j:\n" - - .data -str_43: .asciiz "\tTo quit...enter q:\n\n" - - .data -str_44: .asciiz "\n" - - .data -str_45: .asciiz "Please enter a number... " - - .data -str_46: .asciiz "Class type is now A\n" - - .data -str_47: .asciiz "Class type is now B\n" - - .data -str_48: .asciiz "Class type is now C\n" - - .data -str_49: .asciiz "Class type is now D\n" - - .data -str_50: .asciiz "Class type is now E\n" - - .data -str_51: .asciiz "Oooops\n" - - .data -str_52: .asciiz " " - - .data -str_53: .asciiz "number " - - .data -str_54: .asciiz "is odd!\n" - - .data -str_55: .asciiz "is even!\n" - - .data -str_56: .asciiz "a" - - .data -str_57: .asciiz "b" - - .data -str_58: .asciiz "c" - - .data -str_59: .asciiz "d" - - .data -str_60: .asciiz "e" - - .data -str_61: .asciiz "f" - - .data -str_62: .asciiz "g" - - .data -str_63: .asciiz "h" - - .data -str_64: .asciiz "j" - - .data -str_65: .asciiz "q" - - .data -str_66: .asciiz "number " - - .data -str_67: .asciiz "is equal to " - - .data -str_68: .asciiz "times 8 with a remainder of " - - .data -str_69: .asciiz "\n" - - .data -str_70: .asciiz "number " - - .data -str_71: .asciiz "is not divisible by 3.\n" - - .data -str_72: .asciiz "number " - - .data -str_73: .asciiz "is divisible by 3.\n" - - .data -str_74: .asciiz "Oooops\n" - - .text -main: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 12 - - # assign (add here the expr.to_string) to m0 - li $a0, 20 - li $v0, 9 - syscall - la $a0, Main - sw $a0, 0($v0) - sw $v0, -0($fp) - - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to m1 - # calling the method Init_Main of type Main - #load the variable m0 - lw $v0, -0($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -4($fp) - - lw $v0, -4($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to m2 - # calling the method main of type Main - #load the variable m1 - lw $v0, -4($fp) - lw $t0, 0($v0) - lw $v1, 64($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -8($fp) - - # return the value of the function in the register $v0 - #load the variable m2 - lw $v0, -8($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 12 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - li $v0, 10 - syscall - - .text -value_A: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 8 - - # assign (add here the expr.to_string) to t_0 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_1 - #load the variable t_0 - lw $v0, -0($fp) - sw $v0, -4($fp) - - # return the value of the function in the register $v0 - #load the variable t_1 - lw $v0, -4($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 8 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -set_var_A: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 4 - - # Setting value of the attribute var in the instance self_A to num_2 - #load the variable num_2 - lw $v0, 12($fp) - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 4($v1) - - # assign (add here the expr.to_string) to t_3 - #load the variable self_A - lw $v0, 16($fp) - sw $v0, -0($fp) - - # return the value of the function in the register $v0 - #load the variable t_3 - lw $v0, -0($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 4 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -method1_A: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 4 - - # assign (add here the expr.to_string) to t_5 - #load the variable self_A - lw $v0, 16($fp) - sw $v0, -0($fp) - - # return the value of the function in the register $v0 - #load the variable t_5 - lw $v0, -0($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 4 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -method2_A: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 32 - - # assign (add here the expr.to_string) to x_8 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_9 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable num1_6 - lw $v0, 16($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable num2_7 - lw $v0, 12($fp) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to x_8 - #load the variable t_9 - lw $v0, -4($fp) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_10 - li $a0, 8 - li $v0, 9 - syscall - la $a0, B - sw $a0, 0($v0) - sw $v0, -8($fp) - - lw $v0, -8($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_11 - # calling the method Init_B of type B - #load the variable t_10 - lw $v0, -8($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_12 - #load the variable t_11 - lw $v0, -12($fp) - sw $v0, -16($fp) - - # assign (add here the expr.to_string) to t_13 - #load the variable x_8 - lw $v0, -0($fp) - sw $v0, -20($fp) - - lw $v0, -16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -20($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_14 - # calling the method set_var of type B - #load the variable t_12 - lw $v0, -16($fp) - lw $t0, 0($v0) - lw $v1, 28($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to t_15 - #load the variable t_14 - lw $v0, -24($fp) - sw $v0, -28($fp) - - # return the value of the function in the register $v0 - #load the variable t_15 - lw $v0, -28($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 32 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -method3_A: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 36 - - # assign (add here the expr.to_string) to x_17 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_18 - #load the variable num_16 - lw $v0, 12($fp) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_19 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_18 - lw $v0, -4($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to x_17 - #load the variable t_19 - lw $v0, -8($fp) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_20 - li $a0, 8 - li $v0, 9 - syscall - la $a0, C - sw $a0, 0($v0) - sw $v0, -12($fp) - - lw $v0, -12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_21 - # calling the method Init_C of type C - #load the variable t_20 - lw $v0, -12($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -16($fp) - - # assign (add here the expr.to_string) to t_22 - #load the variable t_21 - lw $v0, -16($fp) - sw $v0, -20($fp) - - # assign (add here the expr.to_string) to t_23 - #load the variable x_17 - lw $v0, -0($fp) - sw $v0, -24($fp) - - lw $v0, -20($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -24($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_24 - # calling the method set_var of type C - #load the variable t_22 - lw $v0, -20($fp) - lw $t0, 0($v0) - lw $v1, 28($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -28($fp) - - # assign (add here the expr.to_string) to t_25 - #load the variable t_24 - lw $v0, -28($fp) - sw $v0, -32($fp) - - # return the value of the function in the register $v0 - #load the variable t_25 - lw $v0, -32($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 36 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -method4_A: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 72 - - # assign (add here the expr.to_string) to t_28 - #load the variable num2_27 - lw $v0, 12($fp) - move $t1, $v0 - lw $t1, 4($t1) - # push $t1 to the stack - sw $t1, 0($sp) - addi $sp $sp -4 - - #load the variable num1_26 - lw $v0, 16($fp) - # pop the top of the stack to $t1 - addi $sp $sp 4 - lw $t1, 0($sp) - - move $t2, $v0 - lw $t2, 4($t2) - slt $t3, $t1, $t2 - la $t4, Bool - li $a0, 8 - li $v0, 9 - syscall - sw $t4, 0($v0) - sw $t3, 4($v0) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_29 - #load the variable t_28 - lw $v0, -0($fp) - sw $v0, -4($fp) - - lw $t1, -4($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_0 - # assign (add here the expr.to_string) to x_31 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_32 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable num2_27 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable num1_26 - lw $v0, 16($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -16($fp) - - # assign (add here the expr.to_string) to x_31 - #load the variable t_32 - lw $v0, -16($fp) - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_33 - li $a0, 8 - li $v0, 9 - syscall - la $a0, D - sw $a0, 0($v0) - sw $v0, -20($fp) - - lw $v0, -20($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_34 - # calling the method Init_D of type D - #load the variable t_33 - lw $v0, -20($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to t_35 - #load the variable t_34 - lw $v0, -24($fp) - sw $v0, -28($fp) - - # assign (add here the expr.to_string) to t_36 - #load the variable x_31 - lw $v0, -12($fp) - sw $v0, -32($fp) - - lw $v0, -28($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -32($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_37 - # calling the method set_var of type D - #load the variable t_35 - lw $v0, -28($fp) - lw $t0, 0($v0) - lw $v1, 28($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -36($fp) - - # assign (add here the expr.to_string) to t_30 - #load the variable t_37 - lw $v0, -36($fp) - sw $v0, -8($fp) - - j ifend_0 - then_0: - # assign (add here the expr.to_string) to x_38 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -40($fp) - - # assign (add here the expr.to_string) to t_39 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable num1_26 - lw $v0, 16($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable num2_27 - lw $v0, 12($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -44($fp) - - # assign (add here the expr.to_string) to x_38 - #load the variable t_39 - lw $v0, -44($fp) - sw $v0, -40($fp) - - # assign (add here the expr.to_string) to t_40 - li $a0, 8 - li $v0, 9 - syscall - la $a0, D - sw $a0, 0($v0) - sw $v0, -48($fp) - - lw $v0, -48($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_41 - # calling the method Init_D of type D - #load the variable t_40 - lw $v0, -48($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -52($fp) - - # assign (add here the expr.to_string) to t_42 - #load the variable t_41 - lw $v0, -52($fp) - sw $v0, -56($fp) - - # assign (add here the expr.to_string) to t_43 - #load the variable x_38 - lw $v0, -40($fp) - sw $v0, -60($fp) - - lw $v0, -56($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -60($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_44 - # calling the method set_var of type D - #load the variable t_42 - lw $v0, -56($fp) - lw $t0, 0($v0) - lw $v1, 28($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -64($fp) - - # assign (add here the expr.to_string) to t_30 - #load the variable t_44 - lw $v0, -64($fp) - sw $v0, -8($fp) - - ifend_0: - # assign (add here the expr.to_string) to t_45 - #load the variable t_30 - lw $v0, -8($fp) - sw $v0, -68($fp) - - # return the value of the function in the register $v0 - #load the variable t_45 - lw $v0, -68($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 72 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -method5_A: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 52 - - # assign (add here the expr.to_string) to x_47 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to y_48 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -4($fp) - - while_0: - # assign (add here the expr.to_string) to t_49 - #load the variable y_48 - lw $v0, -4($fp) - move $t1, $v0 - lw $t1, 4($t1) - # push $t1 to the stack - sw $t1, 0($sp) - addi $sp $sp -4 - - #load the variable num_46 - lw $v0, 12($fp) - # pop the top of the stack to $t1 - addi $sp $sp 4 - lw $t1, 0($sp) - - move $t2, $v0 - lw $t2, 4($t2) - slt $t4, $t2, $t1 - li $t3, 1 - xor $t3, $t3, $t4 - andi $t3, $t3, 0x01 - la $t4, Bool - li $a0, 8 - li $v0, 9 - syscall - sw $t4, 0($v0) - sw $t3, 4($v0) - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to t_50 - #load the variable t_49 - lw $v0, -8($fp) - sw $v0, -12($fp) - - lw $t1, -12($fp) - lw $t0, 4($t1) - bne $t0, $zero, body_0 - j pool_0 - body_0: - # assign (add here the expr.to_string) to t_52 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable x_47 - lw $v0, -0($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable y_48 - lw $v0, -4($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - mult $t0, $t1 - mflo $t0 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -20($fp) - - # assign (add here the expr.to_string) to x_47 - #load the variable t_52 - lw $v0, -20($fp) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_53 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable y_48 - lw $v0, -4($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to y_48 - #load the variable t_53 - lw $v0, -24($fp) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_51 - #load the variable y_48 - lw $v0, -4($fp) - sw $v0, -16($fp) - - j while_0 - pool_0: - # assign (add here the expr.to_string) to t_54 - li $a0, 8 - li $v0, 9 - syscall - la $a0, E - sw $a0, 0($v0) - sw $v0, -28($fp) - - lw $v0, -28($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_55 - # calling the method Init_E of type E - #load the variable t_54 - lw $v0, -28($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -32($fp) - - # assign (add here the expr.to_string) to t_56 - #load the variable t_55 - lw $v0, -32($fp) - sw $v0, -36($fp) - - # assign (add here the expr.to_string) to t_57 - #load the variable x_47 - lw $v0, -0($fp) - sw $v0, -40($fp) - - lw $v0, -36($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -40($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_58 - # calling the method set_var of type E - #load the variable t_56 - lw $v0, -36($fp) - lw $t0, 0($v0) - lw $v1, 28($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -44($fp) - - # assign (add here the expr.to_string) to t_59 - #load the variable t_58 - lw $v0, -44($fp) - sw $v0, -48($fp) - - # return the value of the function in the register $v0 - #load the variable t_59 - lw $v0, -48($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 52 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -Init_A: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 0 - - # Setting value of the attribute var in the instance self_A to 0 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 4($v1) - - # return the value of the function in the register $v0 - #load the variable self_A - lw $v0, 12($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -method5_B: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 32 - - # assign (add here the expr.to_string) to x_61 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_62 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable num_60 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable num_60 - lw $v0, 12($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - mult $t0, $t1 - mflo $t0 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to x_61 - #load the variable t_62 - lw $v0, -4($fp) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_63 - li $a0, 8 - li $v0, 9 - syscall - la $a0, E - sw $a0, 0($v0) - sw $v0, -8($fp) - - lw $v0, -8($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_64 - # calling the method Init_E of type E - #load the variable t_63 - lw $v0, -8($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_65 - #load the variable t_64 - lw $v0, -12($fp) - sw $v0, -16($fp) - - # assign (add here the expr.to_string) to t_66 - #load the variable x_61 - lw $v0, -0($fp) - sw $v0, -20($fp) - - lw $v0, -16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -20($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_67 - # calling the method set_var of type E - #load the variable t_65 - lw $v0, -16($fp) - lw $t0, 0($v0) - lw $v1, 28($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to t_68 - #load the variable t_67 - lw $v0, -24($fp) - sw $v0, -28($fp) - - # return the value of the function in the register $v0 - #load the variable t_68 - lw $v0, -28($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 32 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -Init_B: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 0 - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to self_B - jal Init_A - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, 12($fp) - - # return the value of the function in the register $v0 - #load the variable self_B - lw $v0, 12($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -method6_C: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 36 - - # assign (add here the expr.to_string) to x_70 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_71 - #load the variable num_69 - lw $v0, 12($fp) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_72 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_71 - lw $v0, -4($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to x_70 - #load the variable t_72 - lw $v0, -8($fp) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_73 - li $a0, 8 - li $v0, 9 - syscall - la $a0, A - sw $a0, 0($v0) - sw $v0, -12($fp) - - lw $v0, -12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_74 - # calling the method Init_A of type A - #load the variable t_73 - lw $v0, -12($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -16($fp) - - # assign (add here the expr.to_string) to t_75 - #load the variable t_74 - lw $v0, -16($fp) - sw $v0, -20($fp) - - # assign (add here the expr.to_string) to t_76 - #load the variable x_70 - lw $v0, -0($fp) - sw $v0, -24($fp) - - lw $v0, -20($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -24($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_77 - # calling the method set_var of type A - #load the variable t_75 - lw $v0, -20($fp) - lw $t0, 0($v0) - lw $v1, 28($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -28($fp) - - # assign (add here the expr.to_string) to t_78 - #load the variable t_77 - lw $v0, -28($fp) - sw $v0, -32($fp) - - # return the value of the function in the register $v0 - #load the variable t_78 - lw $v0, -32($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 36 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -method5_C: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 36 - - # assign (add here the expr.to_string) to x_80 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_81 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable num_79 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable num_79 - lw $v0, 12($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - mult $t0, $t1 - mflo $t0 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_82 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_81 - lw $v0, -4($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable num_79 - lw $v0, 12($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - mult $t0, $t1 - mflo $t0 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to x_80 - #load the variable t_82 - lw $v0, -8($fp) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_83 - li $a0, 8 - li $v0, 9 - syscall - la $a0, E - sw $a0, 0($v0) - sw $v0, -12($fp) - - lw $v0, -12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_84 - # calling the method Init_E of type E - #load the variable t_83 - lw $v0, -12($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -16($fp) - - # assign (add here the expr.to_string) to t_85 - #load the variable t_84 - lw $v0, -16($fp) - sw $v0, -20($fp) - - # assign (add here the expr.to_string) to t_86 - #load the variable x_80 - lw $v0, -0($fp) - sw $v0, -24($fp) - - lw $v0, -20($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -24($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_87 - # calling the method set_var of type E - #load the variable t_85 - lw $v0, -20($fp) - lw $t0, 0($v0) - lw $v1, 28($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -28($fp) - - # assign (add here the expr.to_string) to t_88 - #load the variable t_87 - lw $v0, -28($fp) - sw $v0, -32($fp) - - # return the value of the function in the register $v0 - #load the variable t_88 - lw $v0, -32($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 36 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -Init_C: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 0 - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to self_C - jal Init_B - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, 12($fp) - - # return the value of the function in the register $v0 - #load the variable self_C - lw $v0, 12($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -method7_D: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 96 - - # assign (add here the expr.to_string) to x_90 - #load the variable num_89 - lw $v0, 12($fp) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_91 - #load the variable x_90 - lw $v0, -0($fp) - move $t1, $v0 - lw $t1, 4($t1) - # push $t1 to the stack - sw $t1, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # pop the top of the stack to $t1 - addi $sp $sp 4 - lw $t1, 0($sp) - - move $t2, $v0 - lw $t2, 4($t2) - slt $t3, $t1, $t2 - la $t4, Bool - li $a0, 8 - li $v0, 9 - syscall - sw $t4, 0($v0) - sw $t3, 4($v0) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_92 - #load the variable t_91 - lw $v0, -4($fp) - sw $v0, -8($fp) - - lw $t1, -8($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_1 - # assign (add here the expr.to_string) to t_94 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable x_90 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -16($fp) - - # assign (add here the expr.to_string) to t_95 - #load the variable t_94 - lw $v0, -16($fp) - sw $v0, -20($fp) - - lw $t1, -20($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_2 - # assign (add here the expr.to_string) to t_97 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable x_90 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -28($fp) - - # assign (add here the expr.to_string) to t_98 - #load the variable t_97 - lw $v0, -28($fp) - sw $v0, -32($fp) - - lw $t1, -32($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_3 - # assign (add here the expr.to_string) to t_100 - # Creating Int instance for atomic 2 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 2 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable x_90 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -40($fp) - - # assign (add here the expr.to_string) to t_101 - #load the variable t_100 - lw $v0, -40($fp) - sw $v0, -44($fp) - - lw $t1, -44($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_4 - # assign (add here the expr.to_string) to t_103 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable x_90 - lw $v0, -0($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 3 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 3 - sw $t0, 0($v0) - sw $t1, 4($v0) - - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -52($fp) - - # assign (add here the expr.to_string) to t_104 - #load the variable t_103 - lw $v0, -52($fp) - sw $v0, -56($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -56($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_105 - # calling the method method7 of type D - #load the variable self_D - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 52($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -60($fp) - - # assign (add here the expr.to_string) to t_102 - #load the variable t_105 - lw $v0, -60($fp) - sw $v0, -48($fp) - - j ifend_4 - then_4: - # assign (add here the expr.to_string) to t_106 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -64($fp) - - # assign (add here the expr.to_string) to t_102 - #load the variable t_106 - lw $v0, -64($fp) - sw $v0, -48($fp) - - ifend_4: - # assign (add here the expr.to_string) to t_99 - #load the variable t_102 - lw $v0, -48($fp) - sw $v0, -36($fp) - - j ifend_3 - then_3: - # assign (add here the expr.to_string) to t_107 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -68($fp) - - # assign (add here the expr.to_string) to t_99 - #load the variable t_107 - lw $v0, -68($fp) - sw $v0, -36($fp) - - ifend_3: - # assign (add here the expr.to_string) to t_96 - #load the variable t_99 - lw $v0, -36($fp) - sw $v0, -24($fp) - - j ifend_2 - then_2: - # assign (add here the expr.to_string) to t_108 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -72($fp) - - # assign (add here the expr.to_string) to t_96 - #load the variable t_108 - lw $v0, -72($fp) - sw $v0, -24($fp) - - ifend_2: - # assign (add here the expr.to_string) to t_93 - #load the variable t_96 - lw $v0, -24($fp) - sw $v0, -12($fp) - - j ifend_1 - then_1: - # assign (add here the expr.to_string) to t_109 - #load the variable x_90 - lw $v0, -0($fp) - sw $v0, -76($fp) - - # assign (add here the expr.to_string) to t_110 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_109 - lw $v0, -76($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -80($fp) - - # assign (add here the expr.to_string) to t_111 - #load the variable t_110 - lw $v0, -80($fp) - sw $v0, -84($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -84($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_112 - # calling the method method7 of type D - #load the variable self_D - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 52($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -88($fp) - - # assign (add here the expr.to_string) to t_93 - #load the variable t_112 - lw $v0, -88($fp) - sw $v0, -12($fp) - - ifend_1: - # assign (add here the expr.to_string) to t_113 - #load the variable t_93 - lw $v0, -12($fp) - sw $v0, -92($fp) - - # return the value of the function in the register $v0 - #load the variable t_113 - lw $v0, -92($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 96 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -Init_D: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 0 - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to self_D - jal Init_B - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, 12($fp) - - # return the value of the function in the register $v0 - #load the variable self_D - lw $v0, 12($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -method6_E: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 32 - - # assign (add here the expr.to_string) to x_115 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_116 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable num_114 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 8 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 8 - sw $t0, 0($v0) - sw $t1, 4($v0) - - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - div $t0, $t1 - mflo $t0 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to x_115 - #load the variable t_116 - lw $v0, -4($fp) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_117 - li $a0, 8 - li $v0, 9 - syscall - la $a0, A - sw $a0, 0($v0) - sw $v0, -8($fp) - - lw $v0, -8($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_118 - # calling the method Init_A of type A - #load the variable t_117 - lw $v0, -8($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_119 - #load the variable t_118 - lw $v0, -12($fp) - sw $v0, -16($fp) - - # assign (add here the expr.to_string) to t_120 - #load the variable x_115 - lw $v0, -0($fp) - sw $v0, -20($fp) - - lw $v0, -16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -20($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_121 - # calling the method set_var of type A - #load the variable t_119 - lw $v0, -16($fp) - lw $t0, 0($v0) - lw $v1, 28($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to t_122 - #load the variable t_121 - lw $v0, -24($fp) - sw $v0, -28($fp) - - # return the value of the function in the register $v0 - #load the variable t_122 - lw $v0, -28($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 32 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -Init_E: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 0 - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to self_E - jal Init_D - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, 12($fp) - - # return the value of the function in the register $v0 - #load the variable self_E - lw $v0, 12($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -c2i_A2I: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 168 - - # assign (add here the expr.to_string) to t_124 - #load the string str_0 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_0 - sw $v1, 4($v0) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_125 - #load the variable char_123 - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_124 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_126 - #load the variable t_125 - lw $v0, -4($fp) - sw $v0, -8($fp) - - lw $t1, -8($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_5 - # assign (add here the expr.to_string) to t_128 - #load the string str_1 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_1 - sw $v1, 4($v0) - sw $v0, -16($fp) - - # assign (add here the expr.to_string) to t_129 - #load the variable char_123 - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_128 - lw $v0, -16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -20($fp) - - # assign (add here the expr.to_string) to t_130 - #load the variable t_129 - lw $v0, -20($fp) - sw $v0, -24($fp) - - lw $t1, -24($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_6 - # assign (add here the expr.to_string) to t_132 - #load the string str_2 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_2 - sw $v1, 4($v0) - sw $v0, -32($fp) - - # assign (add here the expr.to_string) to t_133 - #load the variable char_123 - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_132 - lw $v0, -32($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -36($fp) - - # assign (add here the expr.to_string) to t_134 - #load the variable t_133 - lw $v0, -36($fp) - sw $v0, -40($fp) - - lw $t1, -40($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_7 - # assign (add here the expr.to_string) to t_136 - #load the string str_3 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_3 - sw $v1, 4($v0) - sw $v0, -48($fp) - - # assign (add here the expr.to_string) to t_137 - #load the variable char_123 - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_136 - lw $v0, -48($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -52($fp) - - # assign (add here the expr.to_string) to t_138 - #load the variable t_137 - lw $v0, -52($fp) - sw $v0, -56($fp) - - lw $t1, -56($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_8 - # assign (add here the expr.to_string) to t_140 - #load the string str_4 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_4 - sw $v1, 4($v0) - sw $v0, -64($fp) - - # assign (add here the expr.to_string) to t_141 - #load the variable char_123 - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_140 - lw $v0, -64($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -68($fp) - - # assign (add here the expr.to_string) to t_142 - #load the variable t_141 - lw $v0, -68($fp) - sw $v0, -72($fp) - - lw $t1, -72($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_9 - # assign (add here the expr.to_string) to t_144 - #load the string str_5 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_5 - sw $v1, 4($v0) - sw $v0, -80($fp) - - # assign (add here the expr.to_string) to t_145 - #load the variable char_123 - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_144 - lw $v0, -80($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -84($fp) - - # assign (add here the expr.to_string) to t_146 - #load the variable t_145 - lw $v0, -84($fp) - sw $v0, -88($fp) - - lw $t1, -88($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_10 - # assign (add here the expr.to_string) to t_148 - #load the string str_6 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_6 - sw $v1, 4($v0) - sw $v0, -96($fp) - - # assign (add here the expr.to_string) to t_149 - #load the variable char_123 - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_148 - lw $v0, -96($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -100($fp) - - # assign (add here the expr.to_string) to t_150 - #load the variable t_149 - lw $v0, -100($fp) - sw $v0, -104($fp) - - lw $t1, -104($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_11 - # assign (add here the expr.to_string) to t_152 - #load the string str_7 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_7 - sw $v1, 4($v0) - sw $v0, -112($fp) - - # assign (add here the expr.to_string) to t_153 - #load the variable char_123 - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_152 - lw $v0, -112($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -116($fp) - - # assign (add here the expr.to_string) to t_154 - #load the variable t_153 - lw $v0, -116($fp) - sw $v0, -120($fp) - - lw $t1, -120($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_12 - # assign (add here the expr.to_string) to t_156 - #load the string str_8 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_8 - sw $v1, 4($v0) - sw $v0, -128($fp) - - # assign (add here the expr.to_string) to t_157 - #load the variable char_123 - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_156 - lw $v0, -128($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -132($fp) - - # assign (add here the expr.to_string) to t_158 - #load the variable t_157 - lw $v0, -132($fp) - sw $v0, -136($fp) - - lw $t1, -136($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_13 - # assign (add here the expr.to_string) to t_160 - #load the string str_9 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_9 - sw $v1, 4($v0) - sw $v0, -144($fp) - - # assign (add here the expr.to_string) to t_161 - #load the variable char_123 - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_160 - lw $v0, -144($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -148($fp) - - # assign (add here the expr.to_string) to t_162 - #load the variable t_161 - lw $v0, -148($fp) - sw $v0, -152($fp) - - lw $t1, -152($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_14 - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_164 - # calling the method abort of type A2I - #load the variable self_A2I - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 12($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -160($fp) - - # assign (add here the expr.to_string) to t_163 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -156($fp) - - j ifend_14 - then_14: - # assign (add here the expr.to_string) to t_163 - # Creating Int instance for atomic 9 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 9 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -156($fp) - - ifend_14: - # assign (add here the expr.to_string) to t_159 - #load the variable t_163 - lw $v0, -156($fp) - sw $v0, -140($fp) - - j ifend_13 - then_13: - # assign (add here the expr.to_string) to t_159 - # Creating Int instance for atomic 8 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 8 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -140($fp) - - ifend_13: - # assign (add here the expr.to_string) to t_155 - #load the variable t_159 - lw $v0, -140($fp) - sw $v0, -124($fp) - - j ifend_12 - then_12: - # assign (add here the expr.to_string) to t_155 - # Creating Int instance for atomic 7 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 7 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -124($fp) - - ifend_12: - # assign (add here the expr.to_string) to t_151 - #load the variable t_155 - lw $v0, -124($fp) - sw $v0, -108($fp) - - j ifend_11 - then_11: - # assign (add here the expr.to_string) to t_151 - # Creating Int instance for atomic 6 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 6 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -108($fp) - - ifend_11: - # assign (add here the expr.to_string) to t_147 - #load the variable t_151 - lw $v0, -108($fp) - sw $v0, -92($fp) - - j ifend_10 - then_10: - # assign (add here the expr.to_string) to t_147 - # Creating Int instance for atomic 5 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 5 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -92($fp) - - ifend_10: - # assign (add here the expr.to_string) to t_143 - #load the variable t_147 - lw $v0, -92($fp) - sw $v0, -76($fp) - - j ifend_9 - then_9: - # assign (add here the expr.to_string) to t_143 - # Creating Int instance for atomic 4 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 4 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -76($fp) - - ifend_9: - # assign (add here the expr.to_string) to t_139 - #load the variable t_143 - lw $v0, -76($fp) - sw $v0, -60($fp) - - j ifend_8 - then_8: - # assign (add here the expr.to_string) to t_139 - # Creating Int instance for atomic 3 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 3 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -60($fp) - - ifend_8: - # assign (add here the expr.to_string) to t_135 - #load the variable t_139 - lw $v0, -60($fp) - sw $v0, -44($fp) - - j ifend_7 - then_7: - # assign (add here the expr.to_string) to t_135 - # Creating Int instance for atomic 2 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 2 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -44($fp) - - ifend_7: - # assign (add here the expr.to_string) to t_131 - #load the variable t_135 - lw $v0, -44($fp) - sw $v0, -28($fp) - - j ifend_6 - then_6: - # assign (add here the expr.to_string) to t_131 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -28($fp) - - ifend_6: - # assign (add here the expr.to_string) to t_127 - #load the variable t_131 - lw $v0, -28($fp) - sw $v0, -12($fp) - - j ifend_5 - then_5: - # assign (add here the expr.to_string) to t_127 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -12($fp) - - ifend_5: - # assign (add here the expr.to_string) to t_165 - #load the variable t_127 - lw $v0, -12($fp) - sw $v0, -164($fp) - - # return the value of the function in the register $v0 - #load the variable t_165 - lw $v0, -164($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 168 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -i2c_A2I: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 172 - - # assign (add here the expr.to_string) to t_167 - #load the variable i_166 - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_168 - #load the variable t_167 - lw $v0, -0($fp) - sw $v0, -4($fp) - - lw $t1, -4($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_15 - # assign (add here the expr.to_string) to t_170 - #load the variable i_166 - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_171 - #load the variable t_170 - lw $v0, -12($fp) - sw $v0, -16($fp) - - lw $t1, -16($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_16 - # assign (add here the expr.to_string) to t_173 - #load the variable i_166 - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 2 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 2 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to t_174 - #load the variable t_173 - lw $v0, -24($fp) - sw $v0, -28($fp) - - lw $t1, -28($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_17 - # assign (add here the expr.to_string) to t_176 - #load the variable i_166 - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 3 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 3 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -36($fp) - - # assign (add here the expr.to_string) to t_177 - #load the variable t_176 - lw $v0, -36($fp) - sw $v0, -40($fp) - - lw $t1, -40($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_18 - # assign (add here the expr.to_string) to t_179 - #load the variable i_166 - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 4 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 4 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -48($fp) - - # assign (add here the expr.to_string) to t_180 - #load the variable t_179 - lw $v0, -48($fp) - sw $v0, -52($fp) - - lw $t1, -52($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_19 - # assign (add here the expr.to_string) to t_182 - #load the variable i_166 - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 5 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 5 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -60($fp) - - # assign (add here the expr.to_string) to t_183 - #load the variable t_182 - lw $v0, -60($fp) - sw $v0, -64($fp) - - lw $t1, -64($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_20 - # assign (add here the expr.to_string) to t_185 - #load the variable i_166 - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 6 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 6 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -72($fp) - - # assign (add here the expr.to_string) to t_186 - #load the variable t_185 - lw $v0, -72($fp) - sw $v0, -76($fp) - - lw $t1, -76($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_21 - # assign (add here the expr.to_string) to t_188 - #load the variable i_166 - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 7 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 7 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -84($fp) - - # assign (add here the expr.to_string) to t_189 - #load the variable t_188 - lw $v0, -84($fp) - sw $v0, -88($fp) - - lw $t1, -88($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_22 - # assign (add here the expr.to_string) to t_191 - #load the variable i_166 - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 8 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 8 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -96($fp) - - # assign (add here the expr.to_string) to t_192 - #load the variable t_191 - lw $v0, -96($fp) - sw $v0, -100($fp) - - lw $t1, -100($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_23 - # assign (add here the expr.to_string) to t_194 - #load the variable i_166 - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 9 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 9 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -108($fp) - - # assign (add here the expr.to_string) to t_195 - #load the variable t_194 - lw $v0, -108($fp) - sw $v0, -112($fp) - - lw $t1, -112($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_24 - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_197 - # calling the method abort of type A2I - #load the variable self_A2I - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 12($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -120($fp) - - # assign (add here the expr.to_string) to t_198 - #load the string str_10 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_10 - sw $v1, 4($v0) - sw $v0, -124($fp) - - # assign (add here the expr.to_string) to t_196 - #load the variable t_198 - lw $v0, -124($fp) - sw $v0, -116($fp) - - j ifend_24 - then_24: - # assign (add here the expr.to_string) to t_199 - #load the string str_11 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_11 - sw $v1, 4($v0) - sw $v0, -128($fp) - - # assign (add here the expr.to_string) to t_196 - #load the variable t_199 - lw $v0, -128($fp) - sw $v0, -116($fp) - - ifend_24: - # assign (add here the expr.to_string) to t_193 - #load the variable t_196 - lw $v0, -116($fp) - sw $v0, -104($fp) - - j ifend_23 - then_23: - # assign (add here the expr.to_string) to t_200 - #load the string str_12 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_12 - sw $v1, 4($v0) - sw $v0, -132($fp) - - # assign (add here the expr.to_string) to t_193 - #load the variable t_200 - lw $v0, -132($fp) - sw $v0, -104($fp) - - ifend_23: - # assign (add here the expr.to_string) to t_190 - #load the variable t_193 - lw $v0, -104($fp) - sw $v0, -92($fp) - - j ifend_22 - then_22: - # assign (add here the expr.to_string) to t_201 - #load the string str_13 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_13 - sw $v1, 4($v0) - sw $v0, -136($fp) - - # assign (add here the expr.to_string) to t_190 - #load the variable t_201 - lw $v0, -136($fp) - sw $v0, -92($fp) - - ifend_22: - # assign (add here the expr.to_string) to t_187 - #load the variable t_190 - lw $v0, -92($fp) - sw $v0, -80($fp) - - j ifend_21 - then_21: - # assign (add here the expr.to_string) to t_202 - #load the string str_14 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_14 - sw $v1, 4($v0) - sw $v0, -140($fp) - - # assign (add here the expr.to_string) to t_187 - #load the variable t_202 - lw $v0, -140($fp) - sw $v0, -80($fp) - - ifend_21: - # assign (add here the expr.to_string) to t_184 - #load the variable t_187 - lw $v0, -80($fp) - sw $v0, -68($fp) - - j ifend_20 - then_20: - # assign (add here the expr.to_string) to t_203 - #load the string str_15 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_15 - sw $v1, 4($v0) - sw $v0, -144($fp) - - # assign (add here the expr.to_string) to t_184 - #load the variable t_203 - lw $v0, -144($fp) - sw $v0, -68($fp) - - ifend_20: - # assign (add here the expr.to_string) to t_181 - #load the variable t_184 - lw $v0, -68($fp) - sw $v0, -56($fp) - - j ifend_19 - then_19: - # assign (add here the expr.to_string) to t_204 - #load the string str_16 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_16 - sw $v1, 4($v0) - sw $v0, -148($fp) - - # assign (add here the expr.to_string) to t_181 - #load the variable t_204 - lw $v0, -148($fp) - sw $v0, -56($fp) - - ifend_19: - # assign (add here the expr.to_string) to t_178 - #load the variable t_181 - lw $v0, -56($fp) - sw $v0, -44($fp) - - j ifend_18 - then_18: - # assign (add here the expr.to_string) to t_205 - #load the string str_17 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_17 - sw $v1, 4($v0) - sw $v0, -152($fp) - - # assign (add here the expr.to_string) to t_178 - #load the variable t_205 - lw $v0, -152($fp) - sw $v0, -44($fp) - - ifend_18: - # assign (add here the expr.to_string) to t_175 - #load the variable t_178 - lw $v0, -44($fp) - sw $v0, -32($fp) - - j ifend_17 - then_17: - # assign (add here the expr.to_string) to t_206 - #load the string str_18 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_18 - sw $v1, 4($v0) - sw $v0, -156($fp) - - # assign (add here the expr.to_string) to t_175 - #load the variable t_206 - lw $v0, -156($fp) - sw $v0, -32($fp) - - ifend_17: - # assign (add here the expr.to_string) to t_172 - #load the variable t_175 - lw $v0, -32($fp) - sw $v0, -20($fp) - - j ifend_16 - then_16: - # assign (add here the expr.to_string) to t_207 - #load the string str_19 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_19 - sw $v1, 4($v0) - sw $v0, -160($fp) - - # assign (add here the expr.to_string) to t_172 - #load the variable t_207 - lw $v0, -160($fp) - sw $v0, -20($fp) - - ifend_16: - # assign (add here the expr.to_string) to t_169 - #load the variable t_172 - lw $v0, -20($fp) - sw $v0, -8($fp) - - j ifend_15 - then_15: - # assign (add here the expr.to_string) to t_208 - #load the string str_20 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_20 - sw $v1, 4($v0) - sw $v0, -164($fp) - - # assign (add here the expr.to_string) to t_169 - #load the variable t_208 - lw $v0, -164($fp) - sw $v0, -8($fp) - - ifend_15: - # assign (add here the expr.to_string) to t_209 - #load the variable t_169 - lw $v0, -8($fp) - sw $v0, -168($fp) - - # return the value of the function in the register $v0 - #load the variable t_209 - lw $v0, -168($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 172 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -a2i_A2I: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 176 - - # assign (add here the expr.to_string) to t_211 - #load the variable s_210 - lw $v0, 12($fp) - sw $v0, -0($fp) - - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_212 - # calling the method length of type String - #load the variable t_211 - lw $v0, -0($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_213 - #load the variable t_212 - lw $v0, -4($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to t_214 - #load the variable t_213 - lw $v0, -8($fp) - sw $v0, -12($fp) - - lw $t1, -12($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_25 - # assign (add here the expr.to_string) to t_216 - #load the variable s_210 - lw $v0, 12($fp) - sw $v0, -20($fp) - - # assign (add here the expr.to_string) to t_217 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to t_218 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -28($fp) - - lw $v0, -20($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -24($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -28($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_219 - # calling the method substr of type String - #load the variable t_216 - lw $v0, -20($fp) - lw $t0, 0($v0) - lw $v1, 32($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -32($fp) - - # assign (add here the expr.to_string) to t_220 - #load the string str_21 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_21 - sw $v1, 4($v0) - sw $v0, -36($fp) - - # assign (add here the expr.to_string) to t_221 - #load the variable t_219 - lw $v0, -32($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_220 - lw $v0, -36($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -40($fp) - - # assign (add here the expr.to_string) to t_222 - #load the variable t_221 - lw $v0, -40($fp) - sw $v0, -44($fp) - - lw $t1, -44($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_26 - # assign (add here the expr.to_string) to t_224 - #load the variable s_210 - lw $v0, 12($fp) - sw $v0, -52($fp) - - # assign (add here the expr.to_string) to t_225 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -56($fp) - - # assign (add here the expr.to_string) to t_226 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -60($fp) - - lw $v0, -52($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -56($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -60($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_227 - # calling the method substr of type String - #load the variable t_224 - lw $v0, -52($fp) - lw $t0, 0($v0) - lw $v1, 32($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -64($fp) - - # assign (add here the expr.to_string) to t_228 - #load the string str_22 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_22 - sw $v1, 4($v0) - sw $v0, -68($fp) - - # assign (add here the expr.to_string) to t_229 - #load the variable t_227 - lw $v0, -64($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_228 - lw $v0, -68($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -72($fp) - - # assign (add here the expr.to_string) to t_230 - #load the variable t_229 - lw $v0, -72($fp) - sw $v0, -76($fp) - - lw $t1, -76($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_27 - # assign (add here the expr.to_string) to t_232 - #load the variable s_210 - lw $v0, 12($fp) - sw $v0, -84($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -84($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_233 - # calling the method a2i_aux of type A2I - #load the variable self_A2I - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 36($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -88($fp) - - # assign (add here the expr.to_string) to t_231 - #load the variable t_233 - lw $v0, -88($fp) - sw $v0, -80($fp) - - j ifend_27 - then_27: - # assign (add here the expr.to_string) to t_234 - #load the variable s_210 - lw $v0, 12($fp) - sw $v0, -92($fp) - - # assign (add here the expr.to_string) to t_235 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -96($fp) - - # assign (add here the expr.to_string) to t_236 - #load the variable s_210 - lw $v0, 12($fp) - sw $v0, -100($fp) - - lw $v0, -100($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_237 - # calling the method length of type String - #load the variable t_236 - lw $v0, -100($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -104($fp) - - # assign (add here the expr.to_string) to t_238 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_237 - lw $v0, -104($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -108($fp) - - # assign (add here the expr.to_string) to t_239 - #load the variable t_238 - lw $v0, -108($fp) - sw $v0, -112($fp) - - lw $v0, -92($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -96($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -112($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_240 - # calling the method substr of type String - #load the variable t_234 - lw $v0, -92($fp) - lw $t0, 0($v0) - lw $v1, 32($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -116($fp) - - # assign (add here the expr.to_string) to t_241 - #load the variable t_240 - lw $v0, -116($fp) - sw $v0, -120($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -120($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_242 - # calling the method a2i_aux of type A2I - #load the variable self_A2I - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 36($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -124($fp) - - # assign (add here the expr.to_string) to t_231 - #load the variable t_242 - lw $v0, -124($fp) - sw $v0, -80($fp) - - ifend_27: - # assign (add here the expr.to_string) to t_223 - #load the variable t_231 - lw $v0, -80($fp) - sw $v0, -48($fp) - - j ifend_26 - then_26: - # assign (add here the expr.to_string) to t_243 - #load the variable s_210 - lw $v0, 12($fp) - sw $v0, -128($fp) - - # assign (add here the expr.to_string) to t_244 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -132($fp) - - # assign (add here the expr.to_string) to t_245 - #load the variable s_210 - lw $v0, 12($fp) - sw $v0, -136($fp) - - lw $v0, -136($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_246 - # calling the method length of type String - #load the variable t_245 - lw $v0, -136($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -140($fp) - - # assign (add here the expr.to_string) to t_247 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_246 - lw $v0, -140($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -144($fp) - - # assign (add here the expr.to_string) to t_248 - #load the variable t_247 - lw $v0, -144($fp) - sw $v0, -148($fp) - - lw $v0, -128($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -132($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -148($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_249 - # calling the method substr of type String - #load the variable t_243 - lw $v0, -128($fp) - lw $t0, 0($v0) - lw $v1, 32($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -152($fp) - - # assign (add here the expr.to_string) to t_250 - #load the variable t_249 - lw $v0, -152($fp) - sw $v0, -156($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -156($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_251 - # calling the method a2i_aux of type A2I - #load the variable self_A2I - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 36($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -160($fp) - - # assign (add here the expr.to_string) to t_252 - #load the variable t_251 - lw $v0, -160($fp) - sw $v0, -164($fp) - - # assign (add here the expr.to_string) to t_253 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_252 - lw $v0, -164($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -168($fp) - - # assign (add here the expr.to_string) to t_223 - #load the variable t_253 - lw $v0, -168($fp) - sw $v0, -48($fp) - - ifend_26: - # assign (add here the expr.to_string) to t_215 - #load the variable t_223 - lw $v0, -48($fp) - sw $v0, -16($fp) - - j ifend_25 - then_25: - # assign (add here the expr.to_string) to t_215 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -16($fp) - - ifend_25: - # assign (add here the expr.to_string) to t_254 - #load the variable t_215 - lw $v0, -16($fp) - sw $v0, -172($fp) - - # return the value of the function in the register $v0 - #load the variable t_254 - lw $v0, -172($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 176 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -a2i_aux_A2I: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 72 - - # assign (add here the expr.to_string) to int_256 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_258 - #load the variable s_255 - lw $v0, 12($fp) - sw $v0, -8($fp) - - lw $v0, -8($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_259 - # calling the method length of type String - #load the variable t_258 - lw $v0, -8($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to j_257 - #load the variable t_259 - lw $v0, -12($fp) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to i_260 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -16($fp) - - while_1: - # assign (add here the expr.to_string) to t_261 - #load the variable i_260 - lw $v0, -16($fp) - move $t1, $v0 - lw $t1, 4($t1) - # push $t1 to the stack - sw $t1, 0($sp) - addi $sp $sp -4 - - #load the variable j_257 - lw $v0, -4($fp) - # pop the top of the stack to $t1 - addi $sp $sp 4 - lw $t1, 0($sp) - - move $t2, $v0 - lw $t2, 4($t2) - slt $t3, $t1, $t2 - la $t4, Bool - li $a0, 8 - li $v0, 9 - syscall - sw $t4, 0($v0) - sw $t3, 4($v0) - sw $v0, -20($fp) - - # assign (add here the expr.to_string) to t_262 - #load the variable t_261 - lw $v0, -20($fp) - sw $v0, -24($fp) - - lw $t1, -24($fp) - lw $t0, 4($t1) - bne $t0, $zero, body_1 - j pool_1 - body_1: - # assign (add here the expr.to_string) to t_264 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable int_256 - lw $v0, -0($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 10 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 10 - sw $t0, 0($v0) - sw $t1, 4($v0) - - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - mult $t0, $t1 - mflo $t0 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -32($fp) - - # assign (add here the expr.to_string) to t_265 - #load the variable s_255 - lw $v0, 12($fp) - sw $v0, -36($fp) - - # assign (add here the expr.to_string) to t_266 - #load the variable i_260 - lw $v0, -16($fp) - sw $v0, -40($fp) - - # assign (add here the expr.to_string) to t_267 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -44($fp) - - lw $v0, -36($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -40($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -44($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_268 - # calling the method substr of type String - #load the variable t_265 - lw $v0, -36($fp) - lw $t0, 0($v0) - lw $v1, 32($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -48($fp) - - # assign (add here the expr.to_string) to t_269 - #load the variable t_268 - lw $v0, -48($fp) - sw $v0, -52($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -52($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_270 - # calling the method c2i of type A2I - #load the variable self_A2I - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -56($fp) - - # assign (add here the expr.to_string) to t_271 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_264 - lw $v0, -32($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_270 - lw $v0, -56($fp) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -60($fp) - - # assign (add here the expr.to_string) to int_256 - #load the variable t_271 - lw $v0, -60($fp) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_272 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable i_260 - lw $v0, -16($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -64($fp) - - # assign (add here the expr.to_string) to i_260 - #load the variable t_272 - lw $v0, -64($fp) - sw $v0, -16($fp) - - # assign (add here the expr.to_string) to t_263 - #load the variable i_260 - lw $v0, -16($fp) - sw $v0, -28($fp) - - j while_1 - pool_1: - # assign (add here the expr.to_string) to t_273 - #load the variable int_256 - lw $v0, -0($fp) - sw $v0, -68($fp) - - # return the value of the function in the register $v0 - #load the variable t_273 - lw $v0, -68($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 72 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -i2a_A2I: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 76 - - # assign (add here the expr.to_string) to t_275 - #load the variable i_274 - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_276 - #load the variable t_275 - lw $v0, -0($fp) - sw $v0, -4($fp) - - lw $t1, -4($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_28 - # assign (add here the expr.to_string) to t_278 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - move $t1, $v0 - lw $t1, 4($t1) - # push $t1 to the stack - sw $t1, 0($sp) - addi $sp $sp -4 - - #load the variable i_274 - lw $v0, 12($fp) - # pop the top of the stack to $t1 - addi $sp $sp 4 - lw $t1, 0($sp) - - move $t2, $v0 - lw $t2, 4($t2) - slt $t3, $t1, $t2 - la $t4, Bool - li $a0, 8 - li $v0, 9 - syscall - sw $t4, 0($v0) - sw $t3, 4($v0) - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_279 - #load the variable t_278 - lw $v0, -12($fp) - sw $v0, -16($fp) - - lw $t1, -16($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_29 - # assign (add here the expr.to_string) to t_281 - #load the string str_23 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_23 - sw $v1, 4($v0) - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to t_282 - #load the variable t_281 - lw $v0, -24($fp) - sw $v0, -28($fp) - - # assign (add here the expr.to_string) to t_283 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -32($fp) - - # assign (add here the expr.to_string) to t_284 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_283 - lw $v0, -32($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -36($fp) - - # assign (add here the expr.to_string) to t_285 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable i_274 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_284 - lw $v0, -36($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - mult $t0, $t1 - mflo $t0 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -40($fp) - - # assign (add here the expr.to_string) to t_286 - #load the variable t_285 - lw $v0, -40($fp) - sw $v0, -44($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -44($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_287 - # calling the method i2a_aux of type A2I - #load the variable self_A2I - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 44($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -48($fp) - - # assign (add here the expr.to_string) to t_288 - #load the variable t_287 - lw $v0, -48($fp) - sw $v0, -52($fp) - - lw $v0, -28($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -52($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_289 - # calling the method concat of type String - #load the variable t_282 - lw $v0, -28($fp) - lw $t0, 0($v0) - lw $v1, 28($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -56($fp) - - # assign (add here the expr.to_string) to t_280 - #load the variable t_289 - lw $v0, -56($fp) - sw $v0, -20($fp) - - j ifend_29 - then_29: - # assign (add here the expr.to_string) to t_290 - #load the variable i_274 - lw $v0, 12($fp) - sw $v0, -60($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -60($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_291 - # calling the method i2a_aux of type A2I - #load the variable self_A2I - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 44($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -64($fp) - - # assign (add here the expr.to_string) to t_280 - #load the variable t_291 - lw $v0, -64($fp) - sw $v0, -20($fp) - - ifend_29: - # assign (add here the expr.to_string) to t_277 - #load the variable t_280 - lw $v0, -20($fp) - sw $v0, -8($fp) - - j ifend_28 - then_28: - # assign (add here the expr.to_string) to t_292 - #load the string str_24 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_24 - sw $v1, 4($v0) - sw $v0, -68($fp) - - # assign (add here the expr.to_string) to t_277 - #load the variable t_292 - lw $v0, -68($fp) - sw $v0, -8($fp) - - ifend_28: - # assign (add here the expr.to_string) to t_293 - #load the variable t_277 - lw $v0, -8($fp) - sw $v0, -72($fp) - - # return the value of the function in the register $v0 - #load the variable t_293 - lw $v0, -72($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 76 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -i2a_aux_A2I: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 64 - - # assign (add here the expr.to_string) to t_295 - #load the variable i_294 - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_296 - #load the variable t_295 - lw $v0, -0($fp) - sw $v0, -4($fp) - - lw $t1, -4($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_30 - # assign (add here the expr.to_string) to t_299 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable i_294 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 10 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 10 - sw $t0, 0($v0) - sw $t1, 4($v0) - - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - div $t0, $t1 - mflo $t0 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -16($fp) - - # assign (add here the expr.to_string) to next_298 - #load the variable t_299 - lw $v0, -16($fp) - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_300 - #load the variable next_298 - lw $v0, -12($fp) - sw $v0, -20($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -20($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_301 - # calling the method i2a_aux of type A2I - #load the variable self_A2I - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 44($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to t_302 - #load the variable t_301 - lw $v0, -24($fp) - sw $v0, -28($fp) - - # assign (add here the expr.to_string) to t_303 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable next_298 - lw $v0, -12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 10 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 10 - sw $t0, 0($v0) - sw $t1, 4($v0) - - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - mult $t0, $t1 - mflo $t0 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -32($fp) - - # assign (add here the expr.to_string) to t_304 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable i_294 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_303 - lw $v0, -32($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -36($fp) - - # assign (add here the expr.to_string) to t_305 - #load the variable t_304 - lw $v0, -36($fp) - sw $v0, -40($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -40($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_306 - # calling the method i2c of type A2I - #load the variable self_A2I - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 28($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -44($fp) - - # assign (add here the expr.to_string) to t_307 - #load the variable t_306 - lw $v0, -44($fp) - sw $v0, -48($fp) - - lw $v0, -28($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -48($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_308 - # calling the method concat of type String - #load the variable t_302 - lw $v0, -28($fp) - lw $t0, 0($v0) - lw $v1, 28($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -52($fp) - - # assign (add here the expr.to_string) to t_297 - #load the variable t_308 - lw $v0, -52($fp) - sw $v0, -8($fp) - - j ifend_30 - then_30: - # assign (add here the expr.to_string) to t_309 - #load the string str_25 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_25 - sw $v1, 4($v0) - sw $v0, -56($fp) - - # assign (add here the expr.to_string) to t_297 - #load the variable t_309 - lw $v0, -56($fp) - sw $v0, -8($fp) - - ifend_30: - # assign (add here the expr.to_string) to t_310 - #load the variable t_297 - lw $v0, -8($fp) - sw $v0, -60($fp) - - # return the value of the function in the register $v0 - #load the variable t_310 - lw $v0, -60($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 64 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -Init_A2I: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 0 - - # return the value of the function in the register $v0 - #load the variable self_A2I - lw $v0, 12($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -menu_Main: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 320 - - # assign (add here the expr.to_string) to t_312 - #load the string str_26 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_26 - sw $v1, 4($v0) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_313 - #load the variable t_312 - lw $v0, -0($fp) - sw $v0, -4($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -4($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_314 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to t_315 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_316 - #load the variable t_315 - lw $v0, -12($fp) - sw $v0, -16($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_317 - # calling the method print of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 60($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -20($fp) - - # assign (add here the expr.to_string) to t_318 - #load the string str_27 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_27 - sw $v1, 4($v0) - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to t_319 - #load the variable t_318 - lw $v0, -24($fp) - sw $v0, -28($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -28($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_320 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -32($fp) - - # assign (add here the expr.to_string) to t_321 - #load the string str_28 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_28 - sw $v1, 4($v0) - sw $v0, -36($fp) - - # assign (add here the expr.to_string) to t_322 - #load the variable t_321 - lw $v0, -36($fp) - sw $v0, -40($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -40($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_323 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -44($fp) - - # assign (add here the expr.to_string) to t_324 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -48($fp) - - # assign (add here the expr.to_string) to t_325 - #load the variable t_324 - lw $v0, -48($fp) - sw $v0, -52($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -52($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_326 - # calling the method print of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 60($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -56($fp) - - # assign (add here the expr.to_string) to t_327 - #load the string str_29 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_29 - sw $v1, 4($v0) - sw $v0, -60($fp) - - # assign (add here the expr.to_string) to t_328 - #load the variable t_327 - lw $v0, -60($fp) - sw $v0, -64($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -64($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_329 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -68($fp) - - # assign (add here the expr.to_string) to t_330 - #load the string str_30 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_30 - sw $v1, 4($v0) - sw $v0, -72($fp) - - # assign (add here the expr.to_string) to t_331 - #load the variable t_330 - lw $v0, -72($fp) - sw $v0, -76($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -76($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_332 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -80($fp) - - # assign (add here the expr.to_string) to t_333 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -84($fp) - - # assign (add here the expr.to_string) to t_334 - #load the variable t_333 - lw $v0, -84($fp) - sw $v0, -88($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -88($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_335 - # calling the method print of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 60($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -92($fp) - - # assign (add here the expr.to_string) to t_336 - #load the string str_31 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_31 - sw $v1, 4($v0) - sw $v0, -96($fp) - - # assign (add here the expr.to_string) to t_337 - #load the variable t_336 - lw $v0, -96($fp) - sw $v0, -100($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -100($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_338 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -104($fp) - - # assign (add here the expr.to_string) to t_339 - #load the string str_32 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_32 - sw $v1, 4($v0) - sw $v0, -108($fp) - - # assign (add here the expr.to_string) to t_340 - #load the variable t_339 - lw $v0, -108($fp) - sw $v0, -112($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -112($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_341 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -116($fp) - - # assign (add here the expr.to_string) to t_342 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -120($fp) - - # assign (add here the expr.to_string) to t_343 - #load the variable t_342 - lw $v0, -120($fp) - sw $v0, -124($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -124($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_344 - # calling the method print of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 60($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -128($fp) - - # assign (add here the expr.to_string) to t_345 - #load the string str_33 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_33 - sw $v1, 4($v0) - sw $v0, -132($fp) - - # assign (add here the expr.to_string) to t_346 - #load the variable t_345 - lw $v0, -132($fp) - sw $v0, -136($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -136($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_347 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -140($fp) - - # assign (add here the expr.to_string) to t_348 - #load the string str_34 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_34 - sw $v1, 4($v0) - sw $v0, -144($fp) - - # assign (add here the expr.to_string) to t_349 - #load the variable t_348 - lw $v0, -144($fp) - sw $v0, -148($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -148($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_350 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -152($fp) - - # assign (add here the expr.to_string) to t_351 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -156($fp) - - # assign (add here the expr.to_string) to t_352 - #load the variable t_351 - lw $v0, -156($fp) - sw $v0, -160($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -160($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_353 - # calling the method print of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 60($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -164($fp) - - # assign (add here the expr.to_string) to t_354 - #load the string str_35 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_35 - sw $v1, 4($v0) - sw $v0, -168($fp) - - # assign (add here the expr.to_string) to t_355 - #load the variable t_354 - lw $v0, -168($fp) - sw $v0, -172($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -172($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_356 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -176($fp) - - # assign (add here the expr.to_string) to t_357 - #load the string str_36 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_36 - sw $v1, 4($v0) - sw $v0, -180($fp) - - # assign (add here the expr.to_string) to t_358 - #load the variable t_357 - lw $v0, -180($fp) - sw $v0, -184($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -184($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_359 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -188($fp) - - # assign (add here the expr.to_string) to t_360 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -192($fp) - - # assign (add here the expr.to_string) to t_361 - #load the variable t_360 - lw $v0, -192($fp) - sw $v0, -196($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -196($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_362 - # calling the method print of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 60($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -200($fp) - - # assign (add here the expr.to_string) to t_363 - #load the string str_37 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_37 - sw $v1, 4($v0) - sw $v0, -204($fp) - - # assign (add here the expr.to_string) to t_364 - #load the variable t_363 - lw $v0, -204($fp) - sw $v0, -208($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -208($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_365 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -212($fp) - - # assign (add here the expr.to_string) to t_366 - #load the string str_38 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_38 - sw $v1, 4($v0) - sw $v0, -216($fp) - - # assign (add here the expr.to_string) to t_367 - #load the variable t_366 - lw $v0, -216($fp) - sw $v0, -220($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -220($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_368 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -224($fp) - - # assign (add here the expr.to_string) to t_369 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -228($fp) - - # assign (add here the expr.to_string) to t_370 - #load the variable t_369 - lw $v0, -228($fp) - sw $v0, -232($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -232($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_371 - # calling the method print of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 60($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -236($fp) - - # assign (add here the expr.to_string) to t_372 - #load the string str_39 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_39 - sw $v1, 4($v0) - sw $v0, -240($fp) - - # assign (add here the expr.to_string) to t_373 - #load the variable t_372 - lw $v0, -240($fp) - sw $v0, -244($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -244($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_374 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -248($fp) - - # assign (add here the expr.to_string) to t_375 - #load the string str_40 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_40 - sw $v1, 4($v0) - sw $v0, -252($fp) - - # assign (add here the expr.to_string) to t_376 - #load the variable t_375 - lw $v0, -252($fp) - sw $v0, -256($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -256($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_377 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -260($fp) - - # assign (add here the expr.to_string) to t_378 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -264($fp) - - # assign (add here the expr.to_string) to t_379 - #load the variable t_378 - lw $v0, -264($fp) - sw $v0, -268($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -268($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_380 - # calling the method print of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 60($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -272($fp) - - # assign (add here the expr.to_string) to t_381 - #load the string str_41 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_41 - sw $v1, 4($v0) - sw $v0, -276($fp) - - # assign (add here the expr.to_string) to t_382 - #load the variable t_381 - lw $v0, -276($fp) - sw $v0, -280($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -280($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_383 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -284($fp) - - # assign (add here the expr.to_string) to t_384 - #load the string str_42 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_42 - sw $v1, 4($v0) - sw $v0, -288($fp) - - # assign (add here the expr.to_string) to t_385 - #load the variable t_384 - lw $v0, -288($fp) - sw $v0, -292($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -292($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_386 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -296($fp) - - # assign (add here the expr.to_string) to t_387 - #load the string str_43 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_43 - sw $v1, 4($v0) - sw $v0, -300($fp) - - # assign (add here the expr.to_string) to t_388 - #load the variable t_387 - lw $v0, -300($fp) - sw $v0, -304($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -304($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_389 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -308($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_390 - # calling the method in_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 32($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -312($fp) - - # assign (add here the expr.to_string) to t_391 - #load the variable t_390 - lw $v0, -312($fp) - sw $v0, -316($fp) - - # return the value of the function in the register $v0 - #load the variable t_391 - lw $v0, -316($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 320 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -prompt_Main: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 32 - - # assign (add here the expr.to_string) to t_392 - #load the string str_44 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_44 - sw $v1, 4($v0) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_393 - #load the variable t_392 - lw $v0, -0($fp) - sw $v0, -4($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -4($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_394 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to t_395 - #load the string str_45 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_45 - sw $v1, 4($v0) - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_396 - #load the variable t_395 - lw $v0, -12($fp) - sw $v0, -16($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_397 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -20($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_398 - # calling the method in_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 32($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to t_399 - #load the variable t_398 - lw $v0, -24($fp) - sw $v0, -28($fp) - - # return the value of the function in the register $v0 - #load the variable t_399 - lw $v0, -28($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 32 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -get_int_Main: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 36 - - # assign (add here the expr.to_string) to t_401 - li $a0, 4 - li $v0, 9 - syscall - la $a0, A2I - sw $a0, 0($v0) - sw $v0, -4($fp) - - lw $v0, -4($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_402 - # calling the method Init_A2I of type A2I - #load the variable t_401 - lw $v0, -4($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to z_400 - #load the variable t_402 - lw $v0, -8($fp) - sw $v0, -0($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_404 - # calling the method prompt of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 44($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -16($fp) - - # assign (add here the expr.to_string) to s_403 - #load the variable t_404 - lw $v0, -16($fp) - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_405 - #load the variable z_400 - lw $v0, -0($fp) - sw $v0, -20($fp) - - # assign (add here the expr.to_string) to t_406 - #load the variable s_403 - lw $v0, -12($fp) - sw $v0, -24($fp) - - lw $v0, -20($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -24($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_407 - # calling the method a2i of type A2I - #load the variable t_405 - lw $v0, -20($fp) - lw $t0, 0($v0) - lw $v1, 32($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -28($fp) - - # assign (add here the expr.to_string) to t_408 - #load the variable t_407 - lw $v0, -28($fp) - sw $v0, -32($fp) - - # return the value of the function in the register $v0 - #load the variable t_408 - lw $v0, -32($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 36 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -is_even_Main: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 80 - - # assign (add here the expr.to_string) to x_410 - #load the variable num_409 - lw $v0, 12($fp) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_411 - #load the variable x_410 - lw $v0, -0($fp) - move $t1, $v0 - lw $t1, 4($t1) - # push $t1 to the stack - sw $t1, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # pop the top of the stack to $t1 - addi $sp $sp 4 - lw $t1, 0($sp) - - move $t2, $v0 - lw $t2, 4($t2) - slt $t3, $t1, $t2 - la $t4, Bool - li $a0, 8 - li $v0, 9 - syscall - sw $t4, 0($v0) - sw $t3, 4($v0) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_412 - #load the variable t_411 - lw $v0, -4($fp) - sw $v0, -8($fp) - - lw $t1, -8($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_31 - # assign (add here the expr.to_string) to t_414 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable x_410 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -16($fp) - - # assign (add here the expr.to_string) to t_415 - #load the variable t_414 - lw $v0, -16($fp) - sw $v0, -20($fp) - - lw $t1, -20($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_32 - # assign (add here the expr.to_string) to t_417 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable x_410 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -28($fp) - - # assign (add here the expr.to_string) to t_418 - #load the variable t_417 - lw $v0, -28($fp) - sw $v0, -32($fp) - - lw $t1, -32($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_33 - # assign (add here the expr.to_string) to t_420 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable x_410 - lw $v0, -0($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 2 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 2 - sw $t0, 0($v0) - sw $t1, 4($v0) - - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -40($fp) - - # assign (add here the expr.to_string) to t_421 - #load the variable t_420 - lw $v0, -40($fp) - sw $v0, -44($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -44($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_422 - # calling the method is_even of type Main - #load the variable self_Main - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 52($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -48($fp) - - # assign (add here the expr.to_string) to t_419 - #load the variable t_422 - lw $v0, -48($fp) - sw $v0, -36($fp) - - j ifend_33 - then_33: - # assign (add here the expr.to_string) to t_423 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -52($fp) - - # assign (add here the expr.to_string) to t_419 - #load the variable t_423 - lw $v0, -52($fp) - sw $v0, -36($fp) - - ifend_33: - # assign (add here the expr.to_string) to t_416 - #load the variable t_419 - lw $v0, -36($fp) - sw $v0, -24($fp) - - j ifend_32 - then_32: - # assign (add here the expr.to_string) to t_424 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -56($fp) - - # assign (add here the expr.to_string) to t_416 - #load the variable t_424 - lw $v0, -56($fp) - sw $v0, -24($fp) - - ifend_32: - # assign (add here the expr.to_string) to t_413 - #load the variable t_416 - lw $v0, -24($fp) - sw $v0, -12($fp) - - j ifend_31 - then_31: - # assign (add here the expr.to_string) to t_425 - #load the variable x_410 - lw $v0, -0($fp) - sw $v0, -60($fp) - - # assign (add here the expr.to_string) to t_426 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_425 - lw $v0, -60($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -64($fp) - - # assign (add here the expr.to_string) to t_427 - #load the variable t_426 - lw $v0, -64($fp) - sw $v0, -68($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -68($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_428 - # calling the method is_even of type Main - #load the variable self_Main - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 52($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -72($fp) - - # assign (add here the expr.to_string) to t_413 - #load the variable t_428 - lw $v0, -72($fp) - sw $v0, -12($fp) - - ifend_31: - # assign (add here the expr.to_string) to t_429 - #load the variable t_413 - lw $v0, -12($fp) - sw $v0, -76($fp) - - # return the value of the function in the register $v0 - #load the variable t_429 - lw $v0, -76($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 80 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -class_type_Main: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 116 - - # assign (add here the expr.to_string) to t_431 - #load the variable var_430 - lw $v0, 12($fp) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_432 - li $a0, 8 - li $v0, 9 - syscall - move $t0, $v0 - #load the variable t_431 - lw $v0, -0($fp) - la $t1, type - lw $t2, 0($v0) - sw $t1, 0($t0) - sw $t2, 4($t0) - move $v0, $t0 - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_433 - #load the variable t_432 - lw $v0, -4($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - li $a0, 8 - li $v0, 9 - syscall - la $t0, type - la $t1, E - sw $t0, 0($v0) - sw $t1, 4($v0) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -8($fp) - - lw $t1, -8($fp) - lw $t0, 4($t1) - bne $t0, $zero, case_0_E - # assign (add here the expr.to_string) to t_433 - #load the variable t_432 - lw $v0, -4($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - li $a0, 8 - li $v0, 9 - syscall - la $t0, type - la $t1, D - sw $t0, 0($v0) - sw $t1, 4($v0) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -8($fp) - - lw $t1, -8($fp) - lw $t0, 4($t1) - bne $t0, $zero, case_0_D - # assign (add here the expr.to_string) to t_433 - #load the variable t_432 - lw $v0, -4($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - li $a0, 8 - li $v0, 9 - syscall - la $t0, type - la $t1, C - sw $t0, 0($v0) - sw $t1, 4($v0) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -8($fp) - - lw $t1, -8($fp) - lw $t0, 4($t1) - bne $t0, $zero, case_0_C - # assign (add here the expr.to_string) to t_433 - #load the variable t_432 - lw $v0, -4($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - li $a0, 8 - li $v0, 9 - syscall - la $t0, type - la $t1, B - sw $t0, 0($v0) - sw $t1, 4($v0) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -8($fp) - - lw $t1, -8($fp) - lw $t0, 4($t1) - bne $t0, $zero, case_0_B - # assign (add here the expr.to_string) to t_433 - #load the variable t_432 - lw $v0, -4($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - li $a0, 8 - li $v0, 9 - syscall - la $t0, type - la $t1, A - sw $t0, 0($v0) - sw $t1, 4($v0) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -8($fp) - - lw $t1, -8($fp) - lw $t0, 4($t1) - bne $t0, $zero, case_0_A - # assign (add here the expr.to_string) to t_433 - #load the variable t_432 - lw $v0, -4($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - li $a0, 8 - li $v0, 9 - syscall - la $t0, type - la $t1, Object - sw $t0, 0($v0) - sw $t1, 4($v0) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -8($fp) - - lw $t1, -8($fp) - lw $t0, 4($t1) - bne $t0, $zero, case_0_Object - # assign (add here the expr.to_string) to t_433 - #load the variable t_432 - lw $v0, -4($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - li $a0, 8 - li $v0, 9 - syscall - la $t0, type - la $t1, A2I - sw $t0, 0($v0) - sw $t1, 4($v0) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -8($fp) - - lw $t1, -8($fp) - lw $t0, 4($t1) - bne $t0, $zero, case_0_Object - # assign (add here the expr.to_string) to t_433 - #load the variable t_432 - lw $v0, -4($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - li $a0, 8 - li $v0, 9 - syscall - la $t0, type - la $t1, Bool - sw $t0, 0($v0) - sw $t1, 4($v0) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -8($fp) - - lw $t1, -8($fp) - lw $t0, 4($t1) - bne $t0, $zero, case_0_Object - # assign (add here the expr.to_string) to t_433 - #load the variable t_432 - lw $v0, -4($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - li $a0, 8 - li $v0, 9 - syscall - la $t0, type - la $t1, String - sw $t0, 0($v0) - sw $t1, 4($v0) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -8($fp) - - lw $t1, -8($fp) - lw $t0, 4($t1) - bne $t0, $zero, case_0_Object - # assign (add here the expr.to_string) to t_433 - #load the variable t_432 - lw $v0, -4($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - li $a0, 8 - li $v0, 9 - syscall - la $t0, type - la $t1, Int - sw $t0, 0($v0) - sw $t1, 4($v0) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -8($fp) - - lw $t1, -8($fp) - lw $t0, 4($t1) - bne $t0, $zero, case_0_Object - # assign (add here the expr.to_string) to t_433 - #load the variable t_432 - lw $v0, -4($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - li $a0, 8 - li $v0, 9 - syscall - la $t0, type - la $t1, IO - sw $t0, 0($v0) - sw $t1, 4($v0) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -8($fp) - - lw $t1, -8($fp) - lw $t0, 4($t1) - bne $t0, $zero, case_0_Object - # assign (add here the expr.to_string) to t_433 - #load the variable t_432 - lw $v0, -4($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - li $a0, 8 - li $v0, 9 - syscall - la $t0, type - la $t1, Main - sw $t0, 0($v0) - sw $t1, 4($v0) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -8($fp) - - lw $t1, -8($fp) - lw $t0, 4($t1) - bne $t0, $zero, case_0_Object - case_0_A: - # assign (add here the expr.to_string) to a_435 - #load the variable var_430 - lw $v0, 12($fp) - sw $v0, -16($fp) - - # assign (add here the expr.to_string) to t_436 - #load the string str_46 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_46 - sw $v1, 4($v0) - sw $v0, -20($fp) - - # assign (add here the expr.to_string) to t_437 - #load the variable t_436 - lw $v0, -20($fp) - sw $v0, -24($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -24($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_438 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -28($fp) - - # assign (add here the expr.to_string) to t_434 - #load the variable t_438 - lw $v0, -28($fp) - sw $v0, -12($fp) - - j case_0_end - case_0_B: - # assign (add here the expr.to_string) to b_439 - #load the variable var_430 - lw $v0, 12($fp) - sw $v0, -32($fp) - - # assign (add here the expr.to_string) to t_440 - #load the string str_47 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_47 - sw $v1, 4($v0) - sw $v0, -36($fp) - - # assign (add here the expr.to_string) to t_441 - #load the variable t_440 - lw $v0, -36($fp) - sw $v0, -40($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -40($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_442 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -44($fp) - - # assign (add here the expr.to_string) to t_434 - #load the variable t_442 - lw $v0, -44($fp) - sw $v0, -12($fp) - - j case_0_end - case_0_C: - # assign (add here the expr.to_string) to c_443 - #load the variable var_430 - lw $v0, 12($fp) - sw $v0, -48($fp) - - # assign (add here the expr.to_string) to t_444 - #load the string str_48 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_48 - sw $v1, 4($v0) - sw $v0, -52($fp) - - # assign (add here the expr.to_string) to t_445 - #load the variable t_444 - lw $v0, -52($fp) - sw $v0, -56($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -56($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_446 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -60($fp) - - # assign (add here the expr.to_string) to t_434 - #load the variable t_446 - lw $v0, -60($fp) - sw $v0, -12($fp) - - j case_0_end - case_0_D: - # assign (add here the expr.to_string) to d_447 - #load the variable var_430 - lw $v0, 12($fp) - sw $v0, -64($fp) - - # assign (add here the expr.to_string) to t_448 - #load the string str_49 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_49 - sw $v1, 4($v0) - sw $v0, -68($fp) - - # assign (add here the expr.to_string) to t_449 - #load the variable t_448 - lw $v0, -68($fp) - sw $v0, -72($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -72($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_450 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -76($fp) - - # assign (add here the expr.to_string) to t_434 - #load the variable t_450 - lw $v0, -76($fp) - sw $v0, -12($fp) - - j case_0_end - case_0_E: - # assign (add here the expr.to_string) to e_451 - #load the variable var_430 - lw $v0, 12($fp) - sw $v0, -80($fp) - - # assign (add here the expr.to_string) to t_452 - #load the string str_50 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_50 - sw $v1, 4($v0) - sw $v0, -84($fp) - - # assign (add here the expr.to_string) to t_453 - #load the variable t_452 - lw $v0, -84($fp) - sw $v0, -88($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -88($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_454 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -92($fp) - - # assign (add here the expr.to_string) to t_434 - #load the variable t_454 - lw $v0, -92($fp) - sw $v0, -12($fp) - - j case_0_end - case_0_Object: - # assign (add here the expr.to_string) to o_455 - #load the variable var_430 - lw $v0, 12($fp) - sw $v0, -96($fp) - - # assign (add here the expr.to_string) to t_456 - #load the string str_51 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_51 - sw $v1, 4($v0) - sw $v0, -100($fp) - - # assign (add here the expr.to_string) to t_457 - #load the variable t_456 - lw $v0, -100($fp) - sw $v0, -104($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -104($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_458 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -108($fp) - - # assign (add here the expr.to_string) to t_434 - #load the variable t_458 - lw $v0, -108($fp) - sw $v0, -12($fp) - - j case_0_end - case_0_end: - # assign (add here the expr.to_string) to t_459 - #load the variable t_434 - lw $v0, -12($fp) - sw $v0, -112($fp) - - # return the value of the function in the register $v0 - #load the variable t_459 - lw $v0, -112($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 116 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -print_Main: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 56 - - # assign (add here the expr.to_string) to t_462 - li $a0, 4 - li $v0, 9 - syscall - la $a0, A2I - sw $a0, 0($v0) - sw $v0, -4($fp) - - lw $v0, -4($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_463 - # calling the method Init_A2I of type A2I - #load the variable t_462 - lw $v0, -4($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to z_461 - #load the variable t_463 - lw $v0, -8($fp) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_464 - #load the variable z_461 - lw $v0, -0($fp) - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_465 - #load the variable var_460 - lw $v0, 12($fp) - sw $v0, -16($fp) - - lw $v0, -16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_466 - # calling the method value of type A - #load the variable t_465 - lw $v0, -16($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -20($fp) - - # assign (add here the expr.to_string) to t_467 - #load the variable t_466 - lw $v0, -20($fp) - sw $v0, -24($fp) - - lw $v0, -12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -24($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_468 - # calling the method i2a of type A2I - #load the variable t_464 - lw $v0, -12($fp) - lw $t0, 0($v0) - lw $v1, 40($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -28($fp) - - # assign (add here the expr.to_string) to t_469 - #load the variable t_468 - lw $v0, -28($fp) - sw $v0, -32($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -32($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_470 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -36($fp) - - # assign (add here the expr.to_string) to t_471 - #load the string str_52 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_52 - sw $v1, 4($v0) - sw $v0, -40($fp) - - # assign (add here the expr.to_string) to t_472 - #load the variable t_471 - lw $v0, -40($fp) - sw $v0, -44($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -44($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_473 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -48($fp) - - # assign (add here the expr.to_string) to t_474 - #load the variable t_473 - lw $v0, -48($fp) - sw $v0, -52($fp) - - # return the value of the function in the register $v0 - #load the variable t_474 - lw $v0, -52($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 56 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -main_Main: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 968 - - # assign (add here the expr.to_string) to t_475 - li $a0, 8 - li $v0, 9 - syscall - la $a0, A - sw $a0, 0($v0) - sw $v0, -0($fp) - - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_476 - # calling the method Init_A of type A - #load the variable t_475 - lw $v0, -0($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -4($fp) - - # Setting value of the attribute avar in the instance self_Main to t_476 - #load the variable t_476 - lw $v0, -4($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 8($v1) - - while_2: - # assign (add here the expr.to_string) to t_477 - lw $v1, 12($fp) - lw $v0, 16($v1) - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to t_478 - #load the variable t_477 - lw $v0, -8($fp) - sw $v0, -12($fp) - - lw $t1, -12($fp) - lw $t0, 4($t1) - bne $t0, $zero, body_2 - j pool_2 - body_2: - # assign (add here the expr.to_string) to t_480 - #load the string str_53 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_53 - sw $v1, 4($v0) - sw $v0, -20($fp) - - # assign (add here the expr.to_string) to t_481 - #load the variable t_480 - lw $v0, -20($fp) - sw $v0, -24($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -24($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_482 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -28($fp) - - # assign (add here the expr.to_string) to t_483 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -32($fp) - - # assign (add here the expr.to_string) to t_484 - #load the variable t_483 - lw $v0, -32($fp) - sw $v0, -36($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -36($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_485 - # calling the method print of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 60($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -40($fp) - - # assign (add here the expr.to_string) to t_486 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -44($fp) - - # assign (add here the expr.to_string) to t_487 - #load the variable t_486 - lw $v0, -44($fp) - sw $v0, -48($fp) - - lw $v0, -48($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_488 - # calling the method value of type A - #load the variable t_487 - lw $v0, -48($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -52($fp) - - # assign (add here the expr.to_string) to t_489 - #load the variable t_488 - lw $v0, -52($fp) - sw $v0, -56($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -56($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_490 - # calling the method is_even of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 52($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -60($fp) - - # assign (add here the expr.to_string) to t_491 - #load the variable t_490 - lw $v0, -60($fp) - sw $v0, -64($fp) - - lw $t1, -64($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_34 - # assign (add here the expr.to_string) to t_493 - #load the string str_54 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_54 - sw $v1, 4($v0) - sw $v0, -72($fp) - - # assign (add here the expr.to_string) to t_494 - #load the variable t_493 - lw $v0, -72($fp) - sw $v0, -76($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -76($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_495 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -80($fp) - - # assign (add here the expr.to_string) to t_492 - #load the variable t_495 - lw $v0, -80($fp) - sw $v0, -68($fp) - - j ifend_34 - then_34: - # assign (add here the expr.to_string) to t_496 - #load the string str_55 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_55 - sw $v1, 4($v0) - sw $v0, -84($fp) - - # assign (add here the expr.to_string) to t_497 - #load the variable t_496 - lw $v0, -84($fp) - sw $v0, -88($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -88($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_498 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -92($fp) - - # assign (add here the expr.to_string) to t_492 - #load the variable t_498 - lw $v0, -92($fp) - sw $v0, -68($fp) - - ifend_34: - # assign (add here the expr.to_string) to t_499 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -96($fp) - - # assign (add here the expr.to_string) to t_500 - #load the variable t_499 - lw $v0, -96($fp) - sw $v0, -100($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -100($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_501 - # calling the method class_type of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 56($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -104($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_502 - # calling the method menu of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 40($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -108($fp) - - # Setting value of the attribute char in the instance self_Main to t_502 - #load the variable t_502 - lw $v0, -108($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 4($v1) - - # assign (add here the expr.to_string) to t_503 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -112($fp) - - # assign (add here the expr.to_string) to t_504 - #load the string str_56 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_56 - sw $v1, 4($v0) - sw $v0, -116($fp) - - # assign (add here the expr.to_string) to t_505 - #load the variable t_503 - lw $v0, -112($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_504 - lw $v0, -116($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -120($fp) - - # assign (add here the expr.to_string) to t_506 - #load the variable t_505 - lw $v0, -120($fp) - sw $v0, -124($fp) - - lw $t1, -124($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_35 - # assign (add here the expr.to_string) to t_508 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -132($fp) - - # assign (add here the expr.to_string) to t_509 - #load the string str_57 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_57 - sw $v1, 4($v0) - sw $v0, -136($fp) - - # assign (add here the expr.to_string) to t_510 - #load the variable t_508 - lw $v0, -132($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_509 - lw $v0, -136($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -140($fp) - - # assign (add here the expr.to_string) to t_511 - #load the variable t_510 - lw $v0, -140($fp) - sw $v0, -144($fp) - - lw $t1, -144($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_36 - # assign (add here the expr.to_string) to t_513 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -152($fp) - - # assign (add here the expr.to_string) to t_514 - #load the string str_58 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_58 - sw $v1, 4($v0) - sw $v0, -156($fp) - - # assign (add here the expr.to_string) to t_515 - #load the variable t_513 - lw $v0, -152($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_514 - lw $v0, -156($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -160($fp) - - # assign (add here the expr.to_string) to t_516 - #load the variable t_515 - lw $v0, -160($fp) - sw $v0, -164($fp) - - lw $t1, -164($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_37 - # assign (add here the expr.to_string) to t_518 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -172($fp) - - # assign (add here the expr.to_string) to t_519 - #load the string str_59 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_59 - sw $v1, 4($v0) - sw $v0, -176($fp) - - # assign (add here the expr.to_string) to t_520 - #load the variable t_518 - lw $v0, -172($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_519 - lw $v0, -176($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -180($fp) - - # assign (add here the expr.to_string) to t_521 - #load the variable t_520 - lw $v0, -180($fp) - sw $v0, -184($fp) - - lw $t1, -184($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_38 - # assign (add here the expr.to_string) to t_523 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -192($fp) - - # assign (add here the expr.to_string) to t_524 - #load the string str_60 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_60 - sw $v1, 4($v0) - sw $v0, -196($fp) - - # assign (add here the expr.to_string) to t_525 - #load the variable t_523 - lw $v0, -192($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_524 - lw $v0, -196($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -200($fp) - - # assign (add here the expr.to_string) to t_526 - #load the variable t_525 - lw $v0, -200($fp) - sw $v0, -204($fp) - - lw $t1, -204($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_39 - # assign (add here the expr.to_string) to t_528 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -212($fp) - - # assign (add here the expr.to_string) to t_529 - #load the string str_61 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_61 - sw $v1, 4($v0) - sw $v0, -216($fp) - - # assign (add here the expr.to_string) to t_530 - #load the variable t_528 - lw $v0, -212($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_529 - lw $v0, -216($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -220($fp) - - # assign (add here the expr.to_string) to t_531 - #load the variable t_530 - lw $v0, -220($fp) - sw $v0, -224($fp) - - lw $t1, -224($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_40 - # assign (add here the expr.to_string) to t_533 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -232($fp) - - # assign (add here the expr.to_string) to t_534 - #load the string str_62 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_62 - sw $v1, 4($v0) - sw $v0, -236($fp) - - # assign (add here the expr.to_string) to t_535 - #load the variable t_533 - lw $v0, -232($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_534 - lw $v0, -236($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -240($fp) - - # assign (add here the expr.to_string) to t_536 - #load the variable t_535 - lw $v0, -240($fp) - sw $v0, -244($fp) - - lw $t1, -244($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_41 - # assign (add here the expr.to_string) to t_538 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -252($fp) - - # assign (add here the expr.to_string) to t_539 - #load the string str_63 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_63 - sw $v1, 4($v0) - sw $v0, -256($fp) - - # assign (add here the expr.to_string) to t_540 - #load the variable t_538 - lw $v0, -252($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_539 - lw $v0, -256($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -260($fp) - - # assign (add here the expr.to_string) to t_541 - #load the variable t_540 - lw $v0, -260($fp) - sw $v0, -264($fp) - - lw $t1, -264($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_42 - # assign (add here the expr.to_string) to t_543 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -272($fp) - - # assign (add here the expr.to_string) to t_544 - #load the string str_64 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_64 - sw $v1, 4($v0) - sw $v0, -276($fp) - - # assign (add here the expr.to_string) to t_545 - #load the variable t_543 - lw $v0, -272($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_544 - lw $v0, -276($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -280($fp) - - # assign (add here the expr.to_string) to t_546 - #load the variable t_545 - lw $v0, -280($fp) - sw $v0, -284($fp) - - lw $t1, -284($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_43 - # assign (add here the expr.to_string) to t_548 - lw $v1, 12($fp) - lw $v0, 4($v1) - sw $v0, -292($fp) - - # assign (add here the expr.to_string) to t_549 - #load the string str_65 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_65 - sw $v1, 4($v0) - sw $v0, -296($fp) - - # assign (add here the expr.to_string) to t_550 - #load the variable t_548 - lw $v0, -292($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_549 - lw $v0, -296($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -300($fp) - - # assign (add here the expr.to_string) to t_551 - #load the variable t_550 - lw $v0, -300($fp) - sw $v0, -304($fp) - - lw $t1, -304($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_44 - # assign (add here the expr.to_string) to t_553 - li $a0, 8 - li $v0, 9 - syscall - la $a0, A - sw $a0, 0($v0) - sw $v0, -312($fp) - - lw $v0, -312($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_554 - # calling the method Init_A of type A - #load the variable t_553 - lw $v0, -312($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -316($fp) - - # assign (add here the expr.to_string) to t_555 - #load the variable t_554 - lw $v0, -316($fp) - sw $v0, -320($fp) - - # assign (add here the expr.to_string) to t_556 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -324($fp) - - # assign (add here the expr.to_string) to t_557 - #load the variable t_556 - lw $v0, -324($fp) - sw $v0, -328($fp) - - lw $v0, -328($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_558 - # calling the method value of type A - #load the variable t_557 - lw $v0, -328($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -332($fp) - - # assign (add here the expr.to_string) to t_559 - #load the variable t_558 - lw $v0, -332($fp) - sw $v0, -336($fp) - - lw $v0, -320($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -336($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_560 - # calling the method method1 of type A - #load the variable t_555 - lw $v0, -320($fp) - lw $t0, 0($v0) - lw $v1, 32($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -340($fp) - - # Setting value of the attribute avar in the instance self_Main to t_560 - #load the variable t_560 - lw $v0, -340($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 8($v1) - - # assign (add here the expr.to_string) to t_552 - #load the variable t_560 - lw $v0, -340($fp) - sw $v0, -308($fp) - - j ifend_44 - then_44: - # assign (add here the expr.to_string) to t_561 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -344($fp) - - # Setting value of the attribute flag in the instance self_Main to t_561 - #load the variable t_561 - lw $v0, -344($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 16($v1) - - # assign (add here the expr.to_string) to t_552 - #load the variable t_561 - lw $v0, -344($fp) - sw $v0, -308($fp) - - ifend_44: - # assign (add here the expr.to_string) to t_547 - #load the variable t_552 - lw $v0, -308($fp) - sw $v0, -288($fp) - - j ifend_43 - then_43: - # assign (add here the expr.to_string) to t_562 - li $a0, 8 - li $v0, 9 - syscall - la $a0, A - sw $a0, 0($v0) - sw $v0, -348($fp) - - lw $v0, -348($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_563 - # calling the method Init_A of type A - #load the variable t_562 - lw $v0, -348($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -352($fp) - - # Setting value of the attribute avar in the instance self_Main to t_563 - #load the variable t_563 - lw $v0, -352($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 8($v1) - - # assign (add here the expr.to_string) to t_547 - #load the variable t_563 - lw $v0, -352($fp) - sw $v0, -288($fp) - - ifend_43: - # assign (add here the expr.to_string) to t_542 - #load the variable t_547 - lw $v0, -288($fp) - sw $v0, -268($fp) - - j ifend_42 - then_42: - # assign (add here the expr.to_string) to t_565 - li $a0, 8 - li $v0, 9 - syscall - la $a0, E - sw $a0, 0($v0) - sw $v0, -360($fp) - - lw $v0, -360($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_566 - # calling the method Init_E of type E - #load the variable t_565 - lw $v0, -360($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -364($fp) - - # assign (add here the expr.to_string) to t_567 - #load the variable t_566 - lw $v0, -364($fp) - sw $v0, -368($fp) - - # assign (add here the expr.to_string) to t_568 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -372($fp) - - # assign (add here the expr.to_string) to t_569 - #load the variable t_568 - lw $v0, -372($fp) - sw $v0, -376($fp) - - lw $v0, -376($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_570 - # calling the method value of type A - #load the variable t_569 - lw $v0, -376($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -380($fp) - - # assign (add here the expr.to_string) to t_571 - #load the variable t_570 - lw $v0, -380($fp) - sw $v0, -384($fp) - - lw $v0, -368($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -384($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_572 - # calling the method method6 of type E - #load the variable t_567 - lw $v0, -368($fp) - lw $t0, 0($v0) - lw $v1, 56($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -388($fp) - - # assign (add here the expr.to_string) to x_564 - #load the variable t_572 - lw $v0, -388($fp) - sw $v0, -356($fp) - - # assign (add here the expr.to_string) to t_574 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -396($fp) - - # assign (add here the expr.to_string) to t_575 - #load the variable t_574 - lw $v0, -396($fp) - sw $v0, -400($fp) - - lw $v0, -400($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_576 - # calling the method value of type A - #load the variable t_575 - lw $v0, -400($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -404($fp) - - # assign (add here the expr.to_string) to t_577 - #load the variable x_564 - lw $v0, -356($fp) - sw $v0, -408($fp) - - lw $v0, -408($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_578 - # calling the method value of type A - #load the variable t_577 - lw $v0, -408($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -412($fp) - - # assign (add here the expr.to_string) to t_579 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_578 - lw $v0, -412($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 8 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 8 - sw $t0, 0($v0) - sw $t1, 4($v0) - - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - mult $t0, $t1 - mflo $t0 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -416($fp) - - # assign (add here the expr.to_string) to t_580 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_576 - lw $v0, -404($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_579 - lw $v0, -416($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -420($fp) - - # assign (add here the expr.to_string) to r_573 - #load the variable t_580 - lw $v0, -420($fp) - sw $v0, -392($fp) - - # assign (add here the expr.to_string) to t_581 - #load the string str_66 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_66 - sw $v1, 4($v0) - sw $v0, -424($fp) - - # assign (add here the expr.to_string) to t_582 - #load the variable t_581 - lw $v0, -424($fp) - sw $v0, -428($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -428($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_583 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -432($fp) - - # assign (add here the expr.to_string) to t_584 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -436($fp) - - # assign (add here the expr.to_string) to t_585 - #load the variable t_584 - lw $v0, -436($fp) - sw $v0, -440($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -440($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_586 - # calling the method print of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 60($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -444($fp) - - # assign (add here the expr.to_string) to t_587 - #load the string str_67 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_67 - sw $v1, 4($v0) - sw $v0, -448($fp) - - # assign (add here the expr.to_string) to t_588 - #load the variable t_587 - lw $v0, -448($fp) - sw $v0, -452($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -452($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_589 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -456($fp) - - # assign (add here the expr.to_string) to t_590 - #load the variable x_564 - lw $v0, -356($fp) - sw $v0, -460($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -460($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_591 - # calling the method print of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 60($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -464($fp) - - # assign (add here the expr.to_string) to t_592 - #load the string str_68 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_68 - sw $v1, 4($v0) - sw $v0, -468($fp) - - # assign (add here the expr.to_string) to t_593 - #load the variable t_592 - lw $v0, -468($fp) - sw $v0, -472($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -472($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_594 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -476($fp) - - # assign (add here the expr.to_string) to t_596 - li $a0, 4 - li $v0, 9 - syscall - la $a0, A2I - sw $a0, 0($v0) - sw $v0, -484($fp) - - lw $v0, -484($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_597 - # calling the method Init_A2I of type A2I - #load the variable t_596 - lw $v0, -484($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -488($fp) - - # assign (add here the expr.to_string) to a_595 - #load the variable t_597 - lw $v0, -488($fp) - sw $v0, -480($fp) - - # assign (add here the expr.to_string) to t_598 - #load the variable a_595 - lw $v0, -480($fp) - sw $v0, -492($fp) - - # assign (add here the expr.to_string) to t_599 - #load the variable r_573 - lw $v0, -392($fp) - sw $v0, -496($fp) - - lw $v0, -492($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -496($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_600 - # calling the method i2a of type A2I - #load the variable t_598 - lw $v0, -492($fp) - lw $t0, 0($v0) - lw $v1, 40($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -500($fp) - - # assign (add here the expr.to_string) to t_601 - #load the variable t_600 - lw $v0, -500($fp) - sw $v0, -504($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -504($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_602 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -508($fp) - - # assign (add here the expr.to_string) to t_603 - #load the string str_69 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_69 - sw $v1, 4($v0) - sw $v0, -512($fp) - - # assign (add here the expr.to_string) to t_604 - #load the variable t_603 - lw $v0, -512($fp) - sw $v0, -516($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -516($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_605 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -520($fp) - - # Setting value of the attribute avar in the instance self_Main to x_564 - #load the variable x_564 - lw $v0, -356($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 8($v1) - - # assign (add here the expr.to_string) to t_542 - #load the variable x_564 - lw $v0, -356($fp) - sw $v0, -268($fp) - - ifend_42: - # assign (add here the expr.to_string) to t_537 - #load the variable t_542 - lw $v0, -268($fp) - sw $v0, -248($fp) - - j ifend_41 - then_41: - # assign (add here the expr.to_string) to t_606 - li $a0, 8 - li $v0, 9 - syscall - la $a0, D - sw $a0, 0($v0) - sw $v0, -524($fp) - - lw $v0, -524($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_607 - # calling the method Init_D of type D - #load the variable t_606 - lw $v0, -524($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -528($fp) - - # assign (add here the expr.to_string) to t_608 - #load the variable t_607 - lw $v0, -528($fp) - sw $v0, -532($fp) - - # assign (add here the expr.to_string) to t_609 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -536($fp) - - # assign (add here the expr.to_string) to t_610 - #load the variable t_609 - lw $v0, -536($fp) - sw $v0, -540($fp) - - lw $v0, -540($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_611 - # calling the method value of type A - #load the variable t_610 - lw $v0, -540($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -544($fp) - - # assign (add here the expr.to_string) to t_612 - #load the variable t_611 - lw $v0, -544($fp) - sw $v0, -548($fp) - - lw $v0, -532($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -548($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_613 - # calling the method method7 of type D - #load the variable t_608 - lw $v0, -532($fp) - lw $t0, 0($v0) - lw $v1, 52($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -552($fp) - - # assign (add here the expr.to_string) to t_614 - #load the variable t_613 - lw $v0, -552($fp) - sw $v0, -556($fp) - - lw $t1, -556($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_45 - # assign (add here the expr.to_string) to t_616 - #load the string str_70 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_70 - sw $v1, 4($v0) - sw $v0, -564($fp) - - # assign (add here the expr.to_string) to t_617 - #load the variable t_616 - lw $v0, -564($fp) - sw $v0, -568($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -568($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_618 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -572($fp) - - # assign (add here the expr.to_string) to t_619 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -576($fp) - - # assign (add here the expr.to_string) to t_620 - #load the variable t_619 - lw $v0, -576($fp) - sw $v0, -580($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -580($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_621 - # calling the method print of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 60($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -584($fp) - - # assign (add here the expr.to_string) to t_622 - #load the string str_71 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_71 - sw $v1, 4($v0) - sw $v0, -588($fp) - - # assign (add here the expr.to_string) to t_623 - #load the variable t_622 - lw $v0, -588($fp) - sw $v0, -592($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -592($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_624 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -596($fp) - - # assign (add here the expr.to_string) to t_615 - #load the variable t_624 - lw $v0, -596($fp) - sw $v0, -560($fp) - - j ifend_45 - then_45: - # assign (add here the expr.to_string) to t_625 - #load the string str_72 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_72 - sw $v1, 4($v0) - sw $v0, -600($fp) - - # assign (add here the expr.to_string) to t_626 - #load the variable t_625 - lw $v0, -600($fp) - sw $v0, -604($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -604($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_627 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -608($fp) - - # assign (add here the expr.to_string) to t_628 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -612($fp) - - # assign (add here the expr.to_string) to t_629 - #load the variable t_628 - lw $v0, -612($fp) - sw $v0, -616($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -616($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_630 - # calling the method print of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 60($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -620($fp) - - # assign (add here the expr.to_string) to t_631 - #load the string str_73 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_73 - sw $v1, 4($v0) - sw $v0, -624($fp) - - # assign (add here the expr.to_string) to t_632 - #load the variable t_631 - lw $v0, -624($fp) - sw $v0, -628($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -628($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_633 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -632($fp) - - # assign (add here the expr.to_string) to t_615 - #load the variable t_633 - lw $v0, -632($fp) - sw $v0, -560($fp) - - ifend_45: - # assign (add here the expr.to_string) to t_537 - #load the variable t_615 - lw $v0, -560($fp) - sw $v0, -248($fp) - - ifend_41: - # assign (add here the expr.to_string) to t_532 - #load the variable t_537 - lw $v0, -248($fp) - sw $v0, -228($fp) - - j ifend_40 - then_40: - # assign (add here the expr.to_string) to t_634 - li $a0, 8 - li $v0, 9 - syscall - la $a0, C - sw $a0, 0($v0) - sw $v0, -636($fp) - - lw $v0, -636($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_635 - # calling the method Init_C of type C - #load the variable t_634 - lw $v0, -636($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -640($fp) - - # assign (add here the expr.to_string) to t_636 - #load the variable t_635 - lw $v0, -640($fp) - sw $v0, -644($fp) - - # assign (add here the expr.to_string) to t_637 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -648($fp) - - # assign (add here the expr.to_string) to t_638 - #load the variable t_637 - lw $v0, -648($fp) - sw $v0, -652($fp) - - lw $v0, -652($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_639 - # calling the method value of type A - #load the variable t_638 - lw $v0, -652($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -656($fp) - - # assign (add here the expr.to_string) to t_640 - #load the variable t_639 - lw $v0, -656($fp) - sw $v0, -660($fp) - - lw $v0, -644($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -660($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_641 - # calling the method method5 of type C - la $t0, C - lw $v1, 48($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -664($fp) - - # Setting value of the attribute avar in the instance self_Main to t_641 - #load the variable t_641 - lw $v0, -664($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 8($v1) - - # assign (add here the expr.to_string) to t_532 - #load the variable t_641 - lw $v0, -664($fp) - sw $v0, -228($fp) - - ifend_40: - # assign (add here the expr.to_string) to t_527 - #load the variable t_532 - lw $v0, -228($fp) - sw $v0, -208($fp) - - j ifend_39 - then_39: - # assign (add here the expr.to_string) to t_642 - li $a0, 8 - li $v0, 9 - syscall - la $a0, C - sw $a0, 0($v0) - sw $v0, -668($fp) - - lw $v0, -668($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_643 - # calling the method Init_C of type C - #load the variable t_642 - lw $v0, -668($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -672($fp) - - # assign (add here the expr.to_string) to t_644 - #load the variable t_643 - lw $v0, -672($fp) - sw $v0, -676($fp) - - # assign (add here the expr.to_string) to t_645 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -680($fp) - - # assign (add here the expr.to_string) to t_646 - #load the variable t_645 - lw $v0, -680($fp) - sw $v0, -684($fp) - - lw $v0, -684($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_647 - # calling the method value of type A - #load the variable t_646 - lw $v0, -684($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -688($fp) - - # assign (add here the expr.to_string) to t_648 - #load the variable t_647 - lw $v0, -688($fp) - sw $v0, -692($fp) - - lw $v0, -676($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -692($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_649 - # calling the method method5 of type B - la $t0, B - lw $v1, 48($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -696($fp) - - # Setting value of the attribute avar in the instance self_Main to t_649 - #load the variable t_649 - lw $v0, -696($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 8($v1) - - # assign (add here the expr.to_string) to t_527 - #load the variable t_649 - lw $v0, -696($fp) - sw $v0, -208($fp) - - ifend_39: - # assign (add here the expr.to_string) to t_522 - #load the variable t_527 - lw $v0, -208($fp) - sw $v0, -188($fp) - - j ifend_38 - then_38: - # assign (add here the expr.to_string) to t_650 - li $a0, 8 - li $v0, 9 - syscall - la $a0, C - sw $a0, 0($v0) - sw $v0, -700($fp) - - lw $v0, -700($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_651 - # calling the method Init_C of type C - #load the variable t_650 - lw $v0, -700($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -704($fp) - - # assign (add here the expr.to_string) to t_652 - #load the variable t_651 - lw $v0, -704($fp) - sw $v0, -708($fp) - - # assign (add here the expr.to_string) to t_653 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -712($fp) - - # assign (add here the expr.to_string) to t_654 - #load the variable t_653 - lw $v0, -712($fp) - sw $v0, -716($fp) - - lw $v0, -716($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_655 - # calling the method value of type A - #load the variable t_654 - lw $v0, -716($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -720($fp) - - # assign (add here the expr.to_string) to t_656 - #load the variable t_655 - lw $v0, -720($fp) - sw $v0, -724($fp) - - lw $v0, -708($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -724($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_657 - # calling the method method5 of type A - la $t0, A - lw $v1, 48($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -728($fp) - - # Setting value of the attribute avar in the instance self_Main to t_657 - #load the variable t_657 - lw $v0, -728($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 8($v1) - - # assign (add here the expr.to_string) to t_522 - #load the variable t_657 - lw $v0, -728($fp) - sw $v0, -188($fp) - - ifend_38: - # assign (add here the expr.to_string) to t_517 - #load the variable t_522 - lw $v0, -188($fp) - sw $v0, -168($fp) - - j ifend_37 - then_37: - # assign (add here the expr.to_string) to t_658 - li $a0, 8 - li $v0, 9 - syscall - la $a0, A - sw $a0, 0($v0) - sw $v0, -732($fp) - - lw $v0, -732($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_659 - # calling the method Init_A of type A - #load the variable t_658 - lw $v0, -732($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -736($fp) - - # assign (add here the expr.to_string) to t_660 - #load the variable t_659 - lw $v0, -736($fp) - sw $v0, -740($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_661 - # calling the method get_int of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 48($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -744($fp) - - # assign (add here the expr.to_string) to t_662 - #load the variable t_661 - lw $v0, -744($fp) - sw $v0, -748($fp) - - lw $v0, -740($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -748($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_663 - # calling the method set_var of type A - #load the variable t_660 - lw $v0, -740($fp) - lw $t0, 0($v0) - lw $v1, 28($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -752($fp) - - # Setting value of the attribute a_var in the instance self_Main to t_663 - #load the variable t_663 - lw $v0, -752($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 12($v1) - - # assign (add here the expr.to_string) to t_664 - li $a0, 8 - li $v0, 9 - syscall - la $a0, D - sw $a0, 0($v0) - sw $v0, -756($fp) - - lw $v0, -756($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_665 - # calling the method Init_D of type D - #load the variable t_664 - lw $v0, -756($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -760($fp) - - # assign (add here the expr.to_string) to t_666 - #load the variable t_665 - lw $v0, -760($fp) - sw $v0, -764($fp) - - # assign (add here the expr.to_string) to t_667 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -768($fp) - - # assign (add here the expr.to_string) to t_668 - #load the variable t_667 - lw $v0, -768($fp) - sw $v0, -772($fp) - - lw $v0, -772($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_669 - # calling the method value of type A - #load the variable t_668 - lw $v0, -772($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -776($fp) - - # assign (add here the expr.to_string) to t_670 - #load the variable t_669 - lw $v0, -776($fp) - sw $v0, -780($fp) - - # assign (add here the expr.to_string) to t_671 - lw $v1, 12($fp) - lw $v0, 12($v1) - sw $v0, -784($fp) - - # assign (add here the expr.to_string) to t_672 - #load the variable t_671 - lw $v0, -784($fp) - sw $v0, -788($fp) - - lw $v0, -788($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_673 - # calling the method value of type A - #load the variable t_672 - lw $v0, -788($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -792($fp) - - # assign (add here the expr.to_string) to t_674 - #load the variable t_673 - lw $v0, -792($fp) - sw $v0, -796($fp) - - lw $v0, -764($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -780($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -796($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_675 - # calling the method method4 of type D - #load the variable t_666 - lw $v0, -764($fp) - lw $t0, 0($v0) - lw $v1, 44($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -800($fp) - - # Setting value of the attribute avar in the instance self_Main to t_675 - #load the variable t_675 - lw $v0, -800($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 8($v1) - - # assign (add here the expr.to_string) to t_517 - #load the variable t_675 - lw $v0, -800($fp) - sw $v0, -168($fp) - - ifend_37: - # assign (add here the expr.to_string) to t_512 - #load the variable t_517 - lw $v0, -168($fp) - sw $v0, -148($fp) - - j ifend_36 - then_36: - # assign (add here the expr.to_string) to t_676 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -804($fp) - - # assign (add here the expr.to_string) to t_677 - #load the variable t_676 - lw $v0, -804($fp) - sw $v0, -808($fp) - - # assign (add here the expr.to_string) to t_678 - li $a0, 8 - li $v0, 9 - syscall - move $t0, $v0 - #load the variable t_677 - lw $v0, -808($fp) - la $t1, type - lw $t2, 0($v0) - sw $t1, 0($t0) - sw $t2, 4($t0) - move $v0, $t0 - sw $v0, -812($fp) - - # assign (add here the expr.to_string) to t_679 - #load the variable t_678 - lw $v0, -812($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - li $a0, 8 - li $v0, 9 - syscall - la $t0, type - la $t1, C - sw $t0, 0($v0) - sw $t1, 4($v0) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -816($fp) - - lw $t1, -816($fp) - lw $t0, 4($t1) - bne $t0, $zero, case_1_C - # assign (add here the expr.to_string) to t_679 - #load the variable t_678 - lw $v0, -812($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - li $a0, 8 - li $v0, 9 - syscall - la $t0, type - la $t1, A - sw $t0, 0($v0) - sw $t1, 4($v0) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -816($fp) - - lw $t1, -816($fp) - lw $t0, 4($t1) - bne $t0, $zero, case_1_A - # assign (add here the expr.to_string) to t_679 - #load the variable t_678 - lw $v0, -812($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - li $a0, 8 - li $v0, 9 - syscall - la $t0, type - la $t1, B - sw $t0, 0($v0) - sw $t1, 4($v0) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -816($fp) - - lw $t1, -816($fp) - lw $t0, 4($t1) - bne $t0, $zero, case_1_A - # assign (add here the expr.to_string) to t_679 - #load the variable t_678 - lw $v0, -812($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - li $a0, 8 - li $v0, 9 - syscall - la $t0, type - la $t1, D - sw $t0, 0($v0) - sw $t1, 4($v0) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -816($fp) - - lw $t1, -816($fp) - lw $t0, 4($t1) - bne $t0, $zero, case_1_A - # assign (add here the expr.to_string) to t_679 - #load the variable t_678 - lw $v0, -812($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - li $a0, 8 - li $v0, 9 - syscall - la $t0, type - la $t1, E - sw $t0, 0($v0) - sw $t1, 4($v0) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -816($fp) - - lw $t1, -816($fp) - lw $t0, 4($t1) - bne $t0, $zero, case_1_A - # assign (add here the expr.to_string) to t_679 - #load the variable t_678 - lw $v0, -812($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - li $a0, 8 - li $v0, 9 - syscall - la $t0, type - la $t1, Object - sw $t0, 0($v0) - sw $t1, 4($v0) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -816($fp) - - lw $t1, -816($fp) - lw $t0, 4($t1) - bne $t0, $zero, case_1_Object - # assign (add here the expr.to_string) to t_679 - #load the variable t_678 - lw $v0, -812($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - li $a0, 8 - li $v0, 9 - syscall - la $t0, type - la $t1, A2I - sw $t0, 0($v0) - sw $t1, 4($v0) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -816($fp) - - lw $t1, -816($fp) - lw $t0, 4($t1) - bne $t0, $zero, case_1_Object - # assign (add here the expr.to_string) to t_679 - #load the variable t_678 - lw $v0, -812($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - li $a0, 8 - li $v0, 9 - syscall - la $t0, type - la $t1, Bool - sw $t0, 0($v0) - sw $t1, 4($v0) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -816($fp) - - lw $t1, -816($fp) - lw $t0, 4($t1) - bne $t0, $zero, case_1_Object - # assign (add here the expr.to_string) to t_679 - #load the variable t_678 - lw $v0, -812($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - li $a0, 8 - li $v0, 9 - syscall - la $t0, type - la $t1, String - sw $t0, 0($v0) - sw $t1, 4($v0) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -816($fp) - - lw $t1, -816($fp) - lw $t0, 4($t1) - bne $t0, $zero, case_1_Object - # assign (add here the expr.to_string) to t_679 - #load the variable t_678 - lw $v0, -812($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - li $a0, 8 - li $v0, 9 - syscall - la $t0, type - la $t1, Int - sw $t0, 0($v0) - sw $t1, 4($v0) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -816($fp) - - lw $t1, -816($fp) - lw $t0, 4($t1) - bne $t0, $zero, case_1_Object - # assign (add here the expr.to_string) to t_679 - #load the variable t_678 - lw $v0, -812($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - li $a0, 8 - li $v0, 9 - syscall - la $t0, type - la $t1, IO - sw $t0, 0($v0) - sw $t1, 4($v0) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -816($fp) - - lw $t1, -816($fp) - lw $t0, 4($t1) - bne $t0, $zero, case_1_Object - # assign (add here the expr.to_string) to t_679 - #load the variable t_678 - lw $v0, -812($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - li $a0, 8 - li $v0, 9 - syscall - la $t0, type - la $t1, Main - sw $t0, 0($v0) - sw $t1, 4($v0) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -816($fp) - - lw $t1, -816($fp) - lw $t0, 4($t1) - bne $t0, $zero, case_1_Object - case_1_C: - # assign (add here the expr.to_string) to c_681 - #load the variable t_676 - lw $v0, -804($fp) - sw $v0, -824($fp) - - # assign (add here the expr.to_string) to t_682 - #load the variable c_681 - lw $v0, -824($fp) - sw $v0, -828($fp) - - # assign (add here the expr.to_string) to t_683 - #load the variable c_681 - lw $v0, -824($fp) - sw $v0, -832($fp) - - lw $v0, -832($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_684 - # calling the method value of type C - #load the variable t_683 - lw $v0, -832($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -836($fp) - - # assign (add here the expr.to_string) to t_685 - #load the variable t_684 - lw $v0, -836($fp) - sw $v0, -840($fp) - - lw $v0, -828($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -840($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_686 - # calling the method method6 of type C - #load the variable t_682 - lw $v0, -828($fp) - lw $t0, 0($v0) - lw $v1, 52($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -844($fp) - - # Setting value of the attribute avar in the instance self_Main to t_686 - #load the variable t_686 - lw $v0, -844($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 8($v1) - - # assign (add here the expr.to_string) to t_680 - #load the variable t_686 - lw $v0, -844($fp) - sw $v0, -820($fp) - - j case_1_end - case_1_A: - # assign (add here the expr.to_string) to a_687 - #load the variable t_676 - lw $v0, -804($fp) - sw $v0, -848($fp) - - # assign (add here the expr.to_string) to t_688 - #load the variable a_687 - lw $v0, -848($fp) - sw $v0, -852($fp) - - # assign (add here the expr.to_string) to t_689 - #load the variable a_687 - lw $v0, -848($fp) - sw $v0, -856($fp) - - lw $v0, -856($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_690 - # calling the method value of type A - #load the variable t_689 - lw $v0, -856($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -860($fp) - - # assign (add here the expr.to_string) to t_691 - #load the variable t_690 - lw $v0, -860($fp) - sw $v0, -864($fp) - - lw $v0, -852($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -864($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_692 - # calling the method method3 of type A - #load the variable t_688 - lw $v0, -852($fp) - lw $t0, 0($v0) - lw $v1, 40($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -868($fp) - - # Setting value of the attribute avar in the instance self_Main to t_692 - #load the variable t_692 - lw $v0, -868($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 8($v1) - - # assign (add here the expr.to_string) to t_680 - #load the variable t_692 - lw $v0, -868($fp) - sw $v0, -820($fp) - - j case_1_end - case_1_Object: - # assign (add here the expr.to_string) to o_693 - #load the variable t_676 - lw $v0, -804($fp) - sw $v0, -872($fp) - - # assign (add here the expr.to_string) to t_694 - #load the string str_74 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_74 - sw $v1, 4($v0) - sw $v0, -876($fp) - - # assign (add here the expr.to_string) to t_695 - #load the variable t_694 - lw $v0, -876($fp) - sw $v0, -880($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -880($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_696 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -884($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_697 - # calling the method abort of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 12($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -888($fp) - - # assign (add here the expr.to_string) to t_680 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -820($fp) - - j case_1_end - case_1_end: - # assign (add here the expr.to_string) to t_512 - #load the variable t_680 - lw $v0, -820($fp) - sw $v0, -148($fp) - - ifend_36: - # assign (add here the expr.to_string) to t_507 - #load the variable t_512 - lw $v0, -148($fp) - sw $v0, -128($fp) - - j ifend_35 - then_35: - # assign (add here the expr.to_string) to t_698 - li $a0, 8 - li $v0, 9 - syscall - la $a0, A - sw $a0, 0($v0) - sw $v0, -892($fp) - - lw $v0, -892($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_699 - # calling the method Init_A of type A - #load the variable t_698 - lw $v0, -892($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -896($fp) - - # assign (add here the expr.to_string) to t_700 - #load the variable t_699 - lw $v0, -896($fp) - sw $v0, -900($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_701 - # calling the method get_int of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 48($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -904($fp) - - # assign (add here the expr.to_string) to t_702 - #load the variable t_701 - lw $v0, -904($fp) - sw $v0, -908($fp) - - lw $v0, -900($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -908($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_703 - # calling the method set_var of type A - #load the variable t_700 - lw $v0, -900($fp) - lw $t0, 0($v0) - lw $v1, 28($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -912($fp) - - # Setting value of the attribute a_var in the instance self_Main to t_703 - #load the variable t_703 - lw $v0, -912($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 12($v1) - - # assign (add here the expr.to_string) to t_704 - li $a0, 8 - li $v0, 9 - syscall - la $a0, B - sw $a0, 0($v0) - sw $v0, -916($fp) - - lw $v0, -916($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_705 - # calling the method Init_B of type B - #load the variable t_704 - lw $v0, -916($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -920($fp) - - # assign (add here the expr.to_string) to t_706 - #load the variable t_705 - lw $v0, -920($fp) - sw $v0, -924($fp) - - # assign (add here the expr.to_string) to t_707 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -928($fp) - - # assign (add here the expr.to_string) to t_708 - #load the variable t_707 - lw $v0, -928($fp) - sw $v0, -932($fp) - - lw $v0, -932($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_709 - # calling the method value of type A - #load the variable t_708 - lw $v0, -932($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -936($fp) - - # assign (add here the expr.to_string) to t_710 - #load the variable t_709 - lw $v0, -936($fp) - sw $v0, -940($fp) - - # assign (add here the expr.to_string) to t_711 - lw $v1, 12($fp) - lw $v0, 12($v1) - sw $v0, -944($fp) - - # assign (add here the expr.to_string) to t_712 - #load the variable t_711 - lw $v0, -944($fp) - sw $v0, -948($fp) - - lw $v0, -948($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_713 - # calling the method value of type A - #load the variable t_712 - lw $v0, -948($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -952($fp) - - # assign (add here the expr.to_string) to t_714 - #load the variable t_713 - lw $v0, -952($fp) - sw $v0, -956($fp) - - lw $v0, -924($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -940($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -956($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_715 - # calling the method method2 of type B - #load the variable t_706 - lw $v0, -924($fp) - lw $t0, 0($v0) - lw $v1, 36($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -960($fp) - - # Setting value of the attribute avar in the instance self_Main to t_715 - #load the variable t_715 - lw $v0, -960($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 8($v1) - - # assign (add here the expr.to_string) to t_507 - #load the variable t_715 - lw $v0, -960($fp) - sw $v0, -128($fp) - - ifend_35: - # assign (add here the expr.to_string) to t_479 - #load the variable t_507 - lw $v0, -128($fp) - sw $v0, -16($fp) - - j while_2 - pool_2: - # assign (add here the expr.to_string) to t_716 - #load the variable t_479 - lw $v0, -16($fp) - sw $v0, -964($fp) - - # return the value of the function in the register $v0 - #load the variable t_716 - lw $v0, -964($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 968 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -Init_Main: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 8 - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to self_Main - jal Init_IO - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, 12($fp) - - # assign (add here the expr.to_string) to t_717 - #load the string str_empty - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_empty - sw $v1, 4($v0) - sw $v0, -4($fp) - - # Setting value of the attribute char in the instance self_Main to t_717 - #load the variable t_717 - lw $v0, -4($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 4($v1) - - # assign (add here the expr.to_string) to t_311 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -0($fp) - - # Setting value of the attribute flag in the instance self_Main to t_311 - #load the variable t_311 - lw $v0, -0($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 16($v1) - - # return the value of the function in the register $v0 - #load the variable self_Main - lw $v0, 12($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 8 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -Init_Object: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 0 - - # return the value of the function in the register $v0 - #load the variable self - lw $v0, 12($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -Init_Int: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 0 - - # Setting value of the attribute value in the instance self to v - #load the variable v - lw $v0, 12($fp) - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 4($v1) - - # return the value of the function in the register $v0 - #load the variable self - lw $v0, 16($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -Init_String: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 0 - - # Setting value of the attribute value in the instance self to v - #load the variable v - lw $v0, 12($fp) - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 4($v1) - - # return the value of the function in the register $v0 - #load the variable self - lw $v0, 16($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -Init_Bool: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 0 - - # Setting value of the attribute value in the instance self to v - #load the variable v - lw $v0, 12($fp) - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 4($v1) - - # return the value of the function in the register $v0 - #load the variable self - lw $v0, 16($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -Init_IO: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 0 - - # return the value of the function in the register $v0 - #load the variable self - lw $v0, 12($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - -abort_Object: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - la $a0, ObjectAbortMessage - li $v0, 4 - syscall - - lw $t0, 12($fp) - lw $t0, 0($t0) - lw $t0, 4($t0) - - move $a0, $t0 - li $v0, 4 - syscall - - li $v0, 10 - syscall - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra - -copy_Object: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - - lw $t7, 12($fp) # load the object address - lw $t6, 0($t7) # get the type info address - lw $t5, 0($t6) # get the size of the type - - move $a0, $t5 - li $v0, 9 - syscall - move $t6, $v0 -copy_Object_loop: - lw $t4, 0($t7) - sw $t4, 0($t6) - addu $t7, $t7, 4 - addu $t6, $t6, 4 - addu $t5, $t5, -4 - bgtz $t5, copy_Object_loop - - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra - - - -out_string_IO: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - - lw $a1, 12($fp) # reference to string object - lw $a0, 4($a1) # get the address of the value of the string - li $v0, 4 - syscall - - lw $v0, 16($fp) - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra - -out_int_IO: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - lw $v1, 12($fp) - lw $a0, 4($v1) - li $v0, 1 - syscall - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra - -in_string_IO: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - # Read the string to the buffer - la $a0, IO_Buffer - li $a1, 1000 - li $v0, 8 - syscall - - # get the length of the string to allocate the memory - la $t0, IO_Buffer - sw $t0, 0($sp) - addi $sp, $sp, -4 - jal strlen - addi $sp, $sp, 4 - lw $t0, 0($sp) # the length is now in $v0 - - addi $v0, $v0, 1 - move $a0, $v0 - li $v0, 9 - syscall # in $v0 is the address of the value string - - la $t1, IO_Buffer # copy the string value from the buffer to the heap - move $t2, $v0 - in_string_IO_loop: - lb $t3, 0($t1) - sb $t3, 0($t2) - addi $t1, $t1, 1 - addi $t2, $t2, 1 - bgtz $t3, in_string_IO_loop - addi $t2, $t2, -2 - - li $t4, 10 - lb $t5, 0($t2) - bne $t5, $t4, in_string_IO_end - li $t3, 0 - sb $t3, 0($t2) - - in_string_IO_end: - move $t0, $v0 - - li $a0, 8 - li $v0, 9 - syscall - - la $t1, String - sw $t0, 4($v0) - sw $t1, 0($v0) - - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra - -in_int_IO: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - li $v0, 5 - syscall - move $t0, $v0 - - li $v0, 9 - li $a0, 8 - syscall - - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra - - - - - - - - - - - -type_name_Object: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - lw $t7, 12($fp) # get the instance address - lw $t6, 0($t7) # get the type info address - lw $t5, 4($t6) # get the type name - - # create the String class instance to return - li $a0, 8 - li $v0, 9 - syscall - - la $t1, String - sw $t1, 0($v0) - sw $t5, 4($v0) - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra - -substr_String: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - lw $t7, 20($fp) # get the String instance address - lw $t0, 4($t7) # get the value of the source String - - lw $t7, 16($fp) # get the start parameter Int instance address - lw $t1, 4($t7) # get the value of the Int - - lw $t7, 12($fp) # get the length perameter Int instance address - lw $t2, 4($t7) # get the value of the Int - - move $a0, $t2 - addi $a0, $a0, 1 - li $v0, 9 - syscall # allocate memory for the substring value - - - li $t3, 0 # current pos in the string - - substr_String_loop1: - beq $t3, $t1, substr_String_eloop1 # if the current pos == start pos break - # else move the current pos - addi $t0, $t0, 1 - addi $t3, $t3, 1 - j substr_String_loop1 - - substr_String_eloop1: - - li $t3, 0 - move $t4, $v0 # move the substring address to $t4 - - substr_String_loop2: - beq $t3, $t2, substr_String_eloop2 - lb $t7, 0($t0) - sb $t7, 0($t4) - addi $t0, $t0, 1 - addi $t4, $t4, 1 - addi $t3, $t3, 1 - j substr_String_loop2 - - substr_String_eloop2: - sb $zero, 0($t4) - move $t0, $v0 - la $t1, String - - li $a0, 8 - li $v0, 9 - syscall - - sw $t1, 0($v0) - sw $t0, 4($v0) - - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra - - -isvoid: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - lw $t0, 12($fp) - li $t1, 0 - beq $t0, $t1, isvoid_end - li $t0, 1 - isvoid_end: - - li $a0, 8 - li $v0, 9 - syscall - - la $t1, Bool - sw $t1, 0($v0) - sw $t0, 4($v0) - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra - -# function to get the length of a string value -strlen: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - - lw $a0, 12($fp) - li $t0, 0 -strlen_loop: - lbu $t1, 0($a0) - beqz $t1, strlen_exit - addu $a0, $a0, 1 - addu $t0, $t0, 1 - j strlen_loop - strlen_exit: - move $v0, $t0 - - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra - - -length_String: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - lw $v0, 12($fp) # get the string instance address - lw $v1, 4($v0) # get the string value address - - # push the instace in the stack - sw $v1, 0($sp) - addi $sp, $sp, -4 - - jal strlen # length at v0 - - addi $sp, $sp, 4 - lw $t0, 0($sp) - - - move $t0, $v0 - - # allocate space for the Int instace - li $a0, 8 - li $v0, 9 - syscall - - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra - - -compare: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - lw $t0, 12($fp) - lw $t1, 16($fp) - - lw $t3, 0($t0) - - la $t4, Int - beq $t3, $t4, compare_branch1 - - la $t4, Bool - beq $t3, $t4, compare_branch1 - - la $t4, type - beq $t3, $t4, compare_branch1 - - la $t4, String - beq $t3, $t4, compare_branch2 - - j compare_values - - compare_branch1: - lw $t0, 4($t0) - lw $t1, 4($t1) - - compare_values: - beq $t0, $t1, compare_true - j compare_false - - - compare_branch2: - lw $t0, 4($t0) - lw $t1, 4($t1) - compare_str_loop: - lbu $t3, 0($t0) - lbu $t4, 0($t1) - bne $t3, $t4, compare_false - beq $t3, $zero, compare_true - addi $t0, $t0, 1 - addi $t1, $t1, 1 - j compare_str_loop - - compare_true: - li $t0, 1 - j compare_end - - compare_false: - li $t0, 0 - - compare_end: - - li $a0, 8 - li $v0, 9 - syscall - la $t1, Bool - sw $t1, 0($v0) - sw $t0, 4($v0) - - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra - - -concat_String: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - lw $t0, 16($fp) - lw $t0, 4($t0) # the value of the first String instance - - # call strlen with the string - sw $t0, 0($sp) - addi $sp, $sp, -4 - jal strlen - addi $sp, $sp, 4 - lw $t0, 0($sp) - - #save the lenght of the first string - sw $v0, 0($sp) - addi $sp, $sp, -4 - - - lw $t0, 16($fp) - lw $t0, 4($t0) # the value of the second String instance - - # call strlen with the string - sw $t0, 0($sp) - addi $sp, $sp, -4 - jal strlen - addi $sp, $sp, 4 - lw $t0, 0($sp) - - # pop the lenght of the first string from the stack - addi $sp, $sp, 4 - lw $t0, 0($sp) - - # get the total space for allocating the new string - addu $t0, $t0, $v0 - addi $t0, $t0, 1 - - move $a0, $t0 - li $v0, 9 - syscall # at $v0 is the result string - - lw $t0, 16($fp) - lw $t0, 4($t0) # the address of the value of the first String instance - move $t1, $v0 # the address of the value of the result string - concat_String_loop1: - lbu $t3, 0($t0) - beq $t3, $zero, concat_String_eloop1 - sb $t3, 0($t1) - addi $t0, $t0, 1 - addi $t1, $t1, 1 - j concat_String_loop1 - - concat_String_eloop1: - - lw $t0, 12($fp) - lw $t0, 4($t0) - concat_String_loop2: - lbu $t3, 0($t0) - beq $t3, $zero, concat_String_eloop2 - sb $t3, 0($t1) - addi $t0, $t0, 1 - addi $t1, $t1, 1 - j concat_String_loop2 - concat_String_eloop2: - sb $zero, 0($t1) - - la $t0, String - move $t1, $v0 - - li $a0, 8 - li $v0, 9 - syscall - - sw $t0, 0($v0) - sw $t1, 4($v0) - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/result.s b/src/result.s deleted file mode 100644 index 606b67e61..000000000 --- a/src/result.s +++ /dev/null @@ -1,10318 +0,0 @@ - .data - .align 4 -type: .word 8 - - .data -_Board: .asciiz "Board\n" - .data - .align 4 -Board: .word 16 _Board Init_Board abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO size_of_board_Board board_init_Board - - .data -_CellularAutomaton: .asciiz "CellularAutomaton\n" - .data - .align 4 -CellularAutomaton: .word 20 _CellularAutomaton Init_CellularAutomaton abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO size_of_board_Board board_init_Board init_CellularAutomaton print_CellularAutomaton num_cells_CellularAutomaton cell_CellularAutomaton north_CellularAutomaton south_CellularAutomaton east_CellularAutomaton west_CellularAutomaton northwest_CellularAutomaton northeast_CellularAutomaton southeast_CellularAutomaton southwest_CellularAutomaton neighbors_CellularAutomaton cell_at_next_evolution_CellularAutomaton evolve_CellularAutomaton option_CellularAutomaton prompt_CellularAutomaton prompt2_CellularAutomaton - - .data -_Main: .asciiz "Main\n" - .data - .align 4 -Main: .word 24 _Main Init_Main abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO size_of_board_Board board_init_Board init_CellularAutomaton print_CellularAutomaton num_cells_CellularAutomaton cell_CellularAutomaton north_CellularAutomaton south_CellularAutomaton east_CellularAutomaton west_CellularAutomaton northwest_CellularAutomaton northeast_CellularAutomaton southeast_CellularAutomaton southwest_CellularAutomaton neighbors_CellularAutomaton cell_at_next_evolution_CellularAutomaton evolve_CellularAutomaton option_CellularAutomaton prompt_CellularAutomaton prompt2_CellularAutomaton main_Main - - .data -_Object: .asciiz "Object\n" - .data - .align 4 -Object: .word 4 _Object Init_Object abort_Object type_name_Object copy_Object - - .data -_Int: .asciiz "Int\n" - .data - .align 4 -Int: .word 8 _Int Init_Int abort_Object type_name_Object copy_Object - - .data -_String: .asciiz "String\n" - .data - .align 4 -String: .word 8 _String Init_String abort_Object type_name_Object copy_Object length_String concat_String substr_String - - .data -_Bool: .asciiz "Bool\n" - .data - .align 4 -Bool: .word 8 _Bool Init_Bool abort_Object type_name_Object copy_Object - - .data -_IO: .asciiz "IO\n" - .data - .align 4 -IO: .word 4 _IO Init_IO abort_Object type_name_Object copy_Object out_string_IO out_int_IO in_string_IO in_int_IO - - .data -ObjectAbortMessage : .asciiz "Abort called from class " - .data -IO_Buffer : .space 1001 - .data -str_empty: .asciiz "" - - .data -str_0: .asciiz "\n" - - .data -str_1: .asciiz "\n" - - .data -str_2: .asciiz "\n" - - .data -str_3: .asciiz " " - - .data -str_4: .asciiz " " - - .data -str_5: .asciiz " " - - .data -str_6: .asciiz " " - - .data -str_7: .asciiz " " - - .data -str_8: .asciiz " " - - .data -str_9: .asciiz " " - - .data -str_10: .asciiz " " - - .data -str_11: .asciiz " " - - .data -str_12: .asciiz " " - - .data -str_13: .asciiz " " - - .data -str_14: .asciiz " " - - .data -str_15: .asciiz " " - - .data -str_16: .asciiz " " - - .data -str_17: .asciiz "X" - - .data -str_18: .asciiz "X" - - .data -str_19: .asciiz "X" - - .data -str_20: .asciiz "X" - - .data -str_21: .asciiz "X" - - .data -str_22: .asciiz "X" - - .data -str_23: .asciiz "X" - - .data -str_24: .asciiz "X" - - .data -str_25: .asciiz "-" - - .data -str_26: .asciiz "X" - - .data -str_27: .asciiz "-" - - .data -str_28: .asciiz "X" - - .data -str_29: .asciiz "X" - - .data -str_30: .asciiz "\nPlease chose a number:\n" - - .data -str_31: .asciiz "\t1: A cross\n" - - .data -str_32: .asciiz "\t2: A slash from the upper left to lower right\n" - - .data -str_33: .asciiz "\t3: A slash from the upper right to lower left\n" - - .data -str_34: .asciiz "\t4: An X\n" - - .data -str_35: .asciiz "\t5: A greater than sign \n" - - .data -str_36: .asciiz "\t6: A less than sign\n" - - .data -str_37: .asciiz "\t7: Two greater than signs\n" - - .data -str_38: .asciiz "\t8: Two less than signs\n" - - .data -str_39: .asciiz "\t9: A 'V'\n" - - .data -str_40: .asciiz "\t10: An inverse 'V'\n" - - .data -str_41: .asciiz "\t11: Numbers 9 and 10 combined\n" - - .data -str_42: .asciiz "\t12: A full grid\n" - - .data -str_43: .asciiz "\t13: A 'T'\n" - - .data -str_44: .asciiz "\t14: A plus '+'\n" - - .data -str_45: .asciiz "\t15: A 'W'\n" - - .data -str_46: .asciiz "\t16: An 'M'\n" - - .data -str_47: .asciiz "\t17: An 'E'\n" - - .data -str_48: .asciiz "\t18: A '3'\n" - - .data -str_49: .asciiz "\t19: An 'O'\n" - - .data -str_50: .asciiz "\t20: An '8'\n" - - .data -str_51: .asciiz "\t21: An 'S'\n" - - .data -str_52: .asciiz "Your choice => " - - .data -str_53: .asciiz "\n" - - .data -str_54: .asciiz " " - - .data -str_55: .asciiz " XXXX X XX X XXXX " - - .data -str_56: .asciiz " XX X XX X XX X XX X XX " - - .data -str_57: .asciiz " XX X XX X XX " - - .data -str_58: .asciiz "XXX X X X X XXXX " - - .data -str_59: .asciiz "XXXXX X XXXXX X XXXX" - - .data -str_60: .asciiz " X X X X X X X" - - .data -str_61: .asciiz "X X X X X X X " - - .data -str_62: .asciiz " X X XXXXX X X " - - .data -str_63: .asciiz "XXXXX X X X X " - - .data -str_64: .asciiz "XXXXXXXXXXXXXXXXXXXXXXXXX" - - .data -str_65: .asciiz "X X X X X X X X" - - .data -str_66: .asciiz " X X X X X" - - .data -str_67: .asciiz "X X X X X " - - .data -str_68: .asciiz " X XX X X X " - - .data -str_69: .asciiz "X X X XX X " - - .data -str_70: .asciiz " X X X X X" - - .data -str_71: .asciiz "X X X X X " - - .data -str_72: .asciiz "X X X X X X X X X" - - .data -str_73: .asciiz "X X X X X" - - .data -str_74: .asciiz " X X X X X " - - .data -str_75: .asciiz " XX XXXX XXXX XX " - - .data -str_76: .asciiz "Would you like to continue with the next generation? \n" - - .data -str_77: .asciiz "Please use lowercase y or n for your answer [y]: " - - .data -str_78: .asciiz "\n" - - .data -str_79: .asciiz "n" - - .data -str_80: .asciiz "\n\n" - - .data -str_81: .asciiz "Would you like to choose a background pattern? \n" - - .data -str_82: .asciiz "Please use lowercase y or n for your answer [n]: " - - .data -str_83: .asciiz "y" - - .data -str_84: .asciiz "Welcome to the Game of Life.\n" - - .data -str_85: .asciiz "There are many initial states to choose from. \n" - - .text -main: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 12 - - # assign (add here the expr.to_string) to m0 - li $a0, 24 - li $v0, 9 - syscall - la $a0, Main - sw $a0, 0($v0) - sw $v0, -0($fp) - - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to m1 - # calling the method Init_Main of type Main - #load the variable m0 - lw $v0, -0($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -4($fp) - - lw $v0, -4($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to m2 - # calling the method main of type Main - #load the variable m1 - lw $v0, -4($fp) - lw $t0, 0($v0) - lw $v1, 120($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -8($fp) - - # return the value of the function in the register $v0 - #load the variable m2 - lw $v0, -8($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 12 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - li $v0, 10 - syscall - - .text -size_of_board_Board: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 12 - - # assign (add here the expr.to_string) to t_1 - #load the variable initial_0 - lw $v0, 12($fp) - sw $v0, -0($fp) - - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_2 - # calling the method length of type String - #load the variable t_1 - lw $v0, -0($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_3 - #load the variable t_2 - lw $v0, -4($fp) - sw $v0, -8($fp) - - # return the value of the function in the register $v0 - #load the variable t_3 - lw $v0, -8($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 12 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -board_init_Board: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 88 - - # assign (add here the expr.to_string) to t_6 - #load the variable start_4 - lw $v0, 12($fp) - sw $v0, -4($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -4($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_7 - # calling the method size_of_board of type Board - #load the variable self_Board - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 40($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to size_5 - #load the variable t_7 - lw $v0, -8($fp) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_8 - #load the variable size_5 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 15 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 15 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_9 - #load the variable t_8 - lw $v0, -12($fp) - sw $v0, -16($fp) - - lw $t1, -16($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_0 - # assign (add here the expr.to_string) to t_11 - #load the variable size_5 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 16 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 16 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to t_12 - #load the variable t_11 - lw $v0, -24($fp) - sw $v0, -28($fp) - - lw $t1, -28($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_1 - # assign (add here the expr.to_string) to t_14 - #load the variable size_5 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 20 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 20 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -36($fp) - - # assign (add here the expr.to_string) to t_15 - #load the variable t_14 - lw $v0, -36($fp) - sw $v0, -40($fp) - - lw $t1, -40($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_2 - # assign (add here the expr.to_string) to t_17 - #load the variable size_5 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 21 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 21 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -48($fp) - - # assign (add here the expr.to_string) to t_18 - #load the variable t_17 - lw $v0, -48($fp) - sw $v0, -52($fp) - - lw $t1, -52($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_3 - # assign (add here the expr.to_string) to t_20 - #load the variable size_5 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 25 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 25 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -60($fp) - - # assign (add here the expr.to_string) to t_21 - #load the variable t_20 - lw $v0, -60($fp) - sw $v0, -64($fp) - - lw $t1, -64($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_4 - # assign (add here the expr.to_string) to t_23 - #load the variable size_5 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 28 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 28 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -72($fp) - - # assign (add here the expr.to_string) to t_24 - #load the variable t_23 - lw $v0, -72($fp) - sw $v0, -76($fp) - - lw $t1, -76($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_5 - # Setting value of the attribute rows in the instance self_Board to 5 - # Creating Int instance for atomic 5 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 5 - sw $t0, 0($v0) - sw $t1, 4($v0) - - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 4($v1) - - # Setting value of the attribute columns in the instance self_Board to 5 - # Creating Int instance for atomic 5 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 5 - sw $t0, 0($v0) - sw $t1, 4($v0) - - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 8($v1) - - # Setting value of the attribute board_size in the instance self_Board to size_5 - #load the variable size_5 - lw $v0, -0($fp) - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 12($v1) - - # assign (add here the expr.to_string) to t_25 - #load the variable size_5 - lw $v0, -0($fp) - sw $v0, -80($fp) - - j ifend_5 - then_5: - # Setting value of the attribute rows in the instance self_Board to 7 - # Creating Int instance for atomic 7 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 7 - sw $t0, 0($v0) - sw $t1, 4($v0) - - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 4($v1) - - # Setting value of the attribute columns in the instance self_Board to 4 - # Creating Int instance for atomic 4 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 4 - sw $t0, 0($v0) - sw $t1, 4($v0) - - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 8($v1) - - # Setting value of the attribute board_size in the instance self_Board to size_5 - #load the variable size_5 - lw $v0, -0($fp) - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 12($v1) - - # assign (add here the expr.to_string) to t_25 - #load the variable size_5 - lw $v0, -0($fp) - sw $v0, -80($fp) - - ifend_5: - # assign (add here the expr.to_string) to t_22 - #load the variable t_25 - lw $v0, -80($fp) - sw $v0, -68($fp) - - j ifend_4 - then_4: - # Setting value of the attribute rows in the instance self_Board to 5 - # Creating Int instance for atomic 5 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 5 - sw $t0, 0($v0) - sw $t1, 4($v0) - - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 4($v1) - - # Setting value of the attribute columns in the instance self_Board to 5 - # Creating Int instance for atomic 5 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 5 - sw $t0, 0($v0) - sw $t1, 4($v0) - - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 8($v1) - - # Setting value of the attribute board_size in the instance self_Board to size_5 - #load the variable size_5 - lw $v0, -0($fp) - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 12($v1) - - # assign (add here the expr.to_string) to t_22 - #load the variable size_5 - lw $v0, -0($fp) - sw $v0, -68($fp) - - ifend_4: - # assign (add here the expr.to_string) to t_19 - #load the variable t_22 - lw $v0, -68($fp) - sw $v0, -56($fp) - - j ifend_3 - then_3: - # Setting value of the attribute rows in the instance self_Board to 3 - # Creating Int instance for atomic 3 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 3 - sw $t0, 0($v0) - sw $t1, 4($v0) - - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 4($v1) - - # Setting value of the attribute columns in the instance self_Board to 7 - # Creating Int instance for atomic 7 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 7 - sw $t0, 0($v0) - sw $t1, 4($v0) - - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 8($v1) - - # Setting value of the attribute board_size in the instance self_Board to size_5 - #load the variable size_5 - lw $v0, -0($fp) - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 12($v1) - - # assign (add here the expr.to_string) to t_19 - #load the variable size_5 - lw $v0, -0($fp) - sw $v0, -56($fp) - - ifend_3: - # assign (add here the expr.to_string) to t_16 - #load the variable t_19 - lw $v0, -56($fp) - sw $v0, -44($fp) - - j ifend_2 - then_2: - # Setting value of the attribute rows in the instance self_Board to 4 - # Creating Int instance for atomic 4 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 4 - sw $t0, 0($v0) - sw $t1, 4($v0) - - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 4($v1) - - # Setting value of the attribute columns in the instance self_Board to 5 - # Creating Int instance for atomic 5 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 5 - sw $t0, 0($v0) - sw $t1, 4($v0) - - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 8($v1) - - # Setting value of the attribute board_size in the instance self_Board to size_5 - #load the variable size_5 - lw $v0, -0($fp) - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 12($v1) - - # assign (add here the expr.to_string) to t_16 - #load the variable size_5 - lw $v0, -0($fp) - sw $v0, -44($fp) - - ifend_2: - # assign (add here the expr.to_string) to t_13 - #load the variable t_16 - lw $v0, -44($fp) - sw $v0, -32($fp) - - j ifend_1 - then_1: - # Setting value of the attribute rows in the instance self_Board to 4 - # Creating Int instance for atomic 4 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 4 - sw $t0, 0($v0) - sw $t1, 4($v0) - - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 4($v1) - - # Setting value of the attribute columns in the instance self_Board to 4 - # Creating Int instance for atomic 4 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 4 - sw $t0, 0($v0) - sw $t1, 4($v0) - - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 8($v1) - - # Setting value of the attribute board_size in the instance self_Board to size_5 - #load the variable size_5 - lw $v0, -0($fp) - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 12($v1) - - # assign (add here the expr.to_string) to t_13 - #load the variable size_5 - lw $v0, -0($fp) - sw $v0, -32($fp) - - ifend_1: - # assign (add here the expr.to_string) to t_10 - #load the variable t_13 - lw $v0, -32($fp) - sw $v0, -20($fp) - - j ifend_0 - then_0: - # Setting value of the attribute rows in the instance self_Board to 3 - # Creating Int instance for atomic 3 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 3 - sw $t0, 0($v0) - sw $t1, 4($v0) - - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 4($v1) - - # Setting value of the attribute columns in the instance self_Board to 5 - # Creating Int instance for atomic 5 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 5 - sw $t0, 0($v0) - sw $t1, 4($v0) - - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 8($v1) - - # Setting value of the attribute board_size in the instance self_Board to size_5 - #load the variable size_5 - lw $v0, -0($fp) - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 12($v1) - - # assign (add here the expr.to_string) to t_10 - #load the variable size_5 - lw $v0, -0($fp) - sw $v0, -20($fp) - - ifend_0: - # assign (add here the expr.to_string) to t_26 - #load the variable self_Board - lw $v0, 16($fp) - sw $v0, -84($fp) - - # return the value of the function in the register $v0 - #load the variable t_26 - lw $v0, -84($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 88 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -Init_Board: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 0 - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to self_Board - jal Init_IO - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, 12($fp) - - # Setting value of the attribute rows in the instance self_Board to 0 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 4($v1) - - # Setting value of the attribute columns in the instance self_Board to 0 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 8($v1) - - # Setting value of the attribute board_size in the instance self_Board to 0 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 12($v1) - - # return the value of the function in the register $v0 - #load the variable self_Board - lw $v0, 12($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -init_CellularAutomaton: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 12 - - # Setting value of the attribute population_map in the instance self_CellularAutomaton to map_27 - #load the variable map_27 - lw $v0, 12($fp) - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 16($v1) - - # assign (add here the expr.to_string) to t_28 - #load the variable map_27 - lw $v0, 12($fp) - sw $v0, -0($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_29 - # calling the method board_init of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 44($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_30 - #load the variable self_CellularAutomaton - lw $v0, 16($fp) - sw $v0, -8($fp) - - # return the value of the function in the register $v0 - #load the variable t_30 - lw $v0, -8($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 12 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -print_CellularAutomaton: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 104 - - # assign (add here the expr.to_string) to i_31 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_33 - lw $v1, 12($fp) - lw $v0, 12($v1) - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to num_32 - #load the variable t_33 - lw $v0, -8($fp) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_34 - #load the string str_0 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_0 - sw $v1, 4($v0) - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_35 - #load the variable t_34 - lw $v0, -12($fp) - sw $v0, -16($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_36 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -20($fp) - - while_0: - # assign (add here the expr.to_string) to t_37 - #load the variable i_31 - lw $v0, -0($fp) - move $t1, $v0 - lw $t1, 4($t1) - #load the variable num_32 - lw $v0, -4($fp) - move $t2, $v0 - lw $t2, 4($t2) - slt $t3, $t1, $t2 - la $t4, Bool - li $a0, 8 - li $v0, 9 - syscall - sw $t4, 0($v0) - sw $t3, 4($v0) - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to t_38 - #load the variable t_37 - lw $v0, -24($fp) - sw $v0, -28($fp) - - lw $t1, -28($fp) - lw $t0, 4($t1) - bne $t0, $zero, body_0 - j pool_0 - body_0: - # assign (add here the expr.to_string) to t_40 - lw $v1, 12($fp) - lw $v0, 16($v1) - sw $v0, -36($fp) - - # assign (add here the expr.to_string) to t_41 - #load the variable t_40 - lw $v0, -36($fp) - sw $v0, -40($fp) - - # assign (add here the expr.to_string) to t_42 - #load the variable i_31 - lw $v0, -0($fp) - sw $v0, -44($fp) - - # assign (add here the expr.to_string) to t_43 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -48($fp) - - # assign (add here the expr.to_string) to t_44 - #load the variable t_43 - lw $v0, -48($fp) - sw $v0, -52($fp) - - lw $v0, -40($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -44($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -52($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_45 - # calling the method substr of type String - #load the variable t_41 - lw $v0, -40($fp) - lw $t0, 0($v0) - lw $v1, 32($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -56($fp) - - # assign (add here the expr.to_string) to t_46 - #load the variable t_45 - lw $v0, -56($fp) - sw $v0, -60($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -60($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_47 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -64($fp) - - # assign (add here the expr.to_string) to t_48 - #load the string str_1 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_1 - sw $v1, 4($v0) - sw $v0, -68($fp) - - # assign (add here the expr.to_string) to t_49 - #load the variable t_48 - lw $v0, -68($fp) - sw $v0, -72($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -72($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_50 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -76($fp) - - # assign (add here the expr.to_string) to t_51 - lw $v1, 12($fp) - lw $v0, 8($v1) - sw $v0, -80($fp) - - # assign (add here the expr.to_string) to t_52 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable i_31 - lw $v0, -0($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_51 - lw $v0, -80($fp) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -84($fp) - - # assign (add here the expr.to_string) to i_31 - #load the variable t_52 - lw $v0, -84($fp) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_39 - #load the variable i_31 - lw $v0, -0($fp) - sw $v0, -32($fp) - - j while_0 - pool_0: - # assign (add here the expr.to_string) to t_53 - #load the string str_2 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_2 - sw $v1, 4($v0) - sw $v0, -88($fp) - - # assign (add here the expr.to_string) to t_54 - #load the variable t_53 - lw $v0, -88($fp) - sw $v0, -92($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -92($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_55 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -96($fp) - - # assign (add here the expr.to_string) to t_56 - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - sw $v0, -100($fp) - - # return the value of the function in the register $v0 - #load the variable t_56 - lw $v0, -100($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 104 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -num_cells_CellularAutomaton: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 16 - - # assign (add here the expr.to_string) to t_57 - lw $v1, 12($fp) - lw $v0, 16($v1) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_58 - #load the variable t_57 - lw $v0, -0($fp) - sw $v0, -4($fp) - - lw $v0, -4($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_59 - # calling the method length of type String - #load the variable t_58 - lw $v0, -4($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to t_60 - #load the variable t_59 - lw $v0, -8($fp) - sw $v0, -12($fp) - - # return the value of the function in the register $v0 - #load the variable t_60 - lw $v0, -12($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 16 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -cell_CellularAutomaton: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 48 - - # assign (add here the expr.to_string) to t_62 - lw $v1, 16($fp) - lw $v0, 12($v1) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_63 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_62 - lw $v0, -0($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_64 - #load the variable t_63 - lw $v0, -4($fp) - move $t1, $v0 - lw $t1, 4($t1) - #load the variable position_61 - lw $v0, 12($fp) - move $t2, $v0 - lw $t2, 4($t2) - slt $t3, $t1, $t2 - la $t4, Bool - li $a0, 8 - li $v0, 9 - syscall - sw $t4, 0($v0) - sw $t3, 4($v0) - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to t_65 - #load the variable t_64 - lw $v0, -8($fp) - sw $v0, -12($fp) - - lw $t1, -12($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_6 - # assign (add here the expr.to_string) to t_67 - lw $v1, 16($fp) - lw $v0, 16($v1) - sw $v0, -20($fp) - - # assign (add here the expr.to_string) to t_68 - #load the variable t_67 - lw $v0, -20($fp) - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to t_69 - #load the variable position_61 - lw $v0, 12($fp) - sw $v0, -28($fp) - - # assign (add here the expr.to_string) to t_70 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -32($fp) - - lw $v0, -24($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -28($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -32($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_71 - # calling the method substr of type String - #load the variable t_68 - lw $v0, -24($fp) - lw $t0, 0($v0) - lw $v1, 32($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -36($fp) - - # assign (add here the expr.to_string) to t_66 - #load the variable t_71 - lw $v0, -36($fp) - sw $v0, -16($fp) - - j ifend_6 - then_6: - # assign (add here the expr.to_string) to t_72 - #load the string str_3 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_3 - sw $v1, 4($v0) - sw $v0, -40($fp) - - # assign (add here the expr.to_string) to t_66 - #load the variable t_72 - lw $v0, -40($fp) - sw $v0, -16($fp) - - ifend_6: - # assign (add here the expr.to_string) to t_73 - #load the variable t_66 - lw $v0, -16($fp) - sw $v0, -44($fp) - - # return the value of the function in the register $v0 - #load the variable t_73 - lw $v0, -44($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 48 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -north_CellularAutomaton: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 44 - - # assign (add here the expr.to_string) to t_75 - lw $v1, 16($fp) - lw $v0, 8($v1) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_76 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable position_74 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_75 - lw $v0, -0($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_77 - #load the variable t_76 - lw $v0, -4($fp) - move $t1, $v0 - lw $t1, 4($t1) - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - move $t2, $v0 - lw $t2, 4($t2) - slt $t3, $t1, $t2 - la $t4, Bool - li $a0, 8 - li $v0, 9 - syscall - sw $t4, 0($v0) - sw $t3, 4($v0) - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to t_78 - #load the variable t_77 - lw $v0, -8($fp) - sw $v0, -12($fp) - - lw $t1, -12($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_7 - # assign (add here the expr.to_string) to t_80 - lw $v1, 16($fp) - lw $v0, 8($v1) - sw $v0, -20($fp) - - # assign (add here the expr.to_string) to t_81 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable position_74 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_80 - lw $v0, -20($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to t_82 - #load the variable t_81 - lw $v0, -24($fp) - sw $v0, -28($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -28($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_83 - # calling the method cell of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 60($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -32($fp) - - # assign (add here the expr.to_string) to t_79 - #load the variable t_83 - lw $v0, -32($fp) - sw $v0, -16($fp) - - j ifend_7 - then_7: - # assign (add here the expr.to_string) to t_84 - #load the string str_4 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_4 - sw $v1, 4($v0) - sw $v0, -36($fp) - - # assign (add here the expr.to_string) to t_79 - #load the variable t_84 - lw $v0, -36($fp) - sw $v0, -16($fp) - - ifend_7: - # assign (add here the expr.to_string) to t_85 - #load the variable t_79 - lw $v0, -16($fp) - sw $v0, -40($fp) - - # return the value of the function in the register $v0 - #load the variable t_85 - lw $v0, -40($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 44 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -south_CellularAutomaton: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 48 - - # assign (add here the expr.to_string) to t_87 - lw $v1, 16($fp) - lw $v0, 12($v1) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_88 - lw $v1, 16($fp) - lw $v0, 8($v1) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_89 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable position_86 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_88 - lw $v0, -4($fp) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to t_90 - #load the variable t_87 - lw $v0, -0($fp) - move $t1, $v0 - lw $t1, 4($t1) - #load the variable t_89 - lw $v0, -8($fp) - move $t2, $v0 - lw $t2, 4($t2) - slt $t3, $t1, $t2 - la $t4, Bool - li $a0, 8 - li $v0, 9 - syscall - sw $t4, 0($v0) - sw $t3, 4($v0) - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_91 - #load the variable t_90 - lw $v0, -12($fp) - sw $v0, -16($fp) - - lw $t1, -16($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_8 - # assign (add here the expr.to_string) to t_93 - lw $v1, 16($fp) - lw $v0, 8($v1) - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to t_94 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable position_86 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_93 - lw $v0, -24($fp) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -28($fp) - - # assign (add here the expr.to_string) to t_95 - #load the variable t_94 - lw $v0, -28($fp) - sw $v0, -32($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -32($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_96 - # calling the method cell of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 60($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -36($fp) - - # assign (add here the expr.to_string) to t_92 - #load the variable t_96 - lw $v0, -36($fp) - sw $v0, -20($fp) - - j ifend_8 - then_8: - # assign (add here the expr.to_string) to t_97 - #load the string str_5 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_5 - sw $v1, 4($v0) - sw $v0, -40($fp) - - # assign (add here the expr.to_string) to t_92 - #load the variable t_97 - lw $v0, -40($fp) - sw $v0, -20($fp) - - ifend_8: - # assign (add here the expr.to_string) to t_98 - #load the variable t_92 - lw $v0, -20($fp) - sw $v0, -44($fp) - - # return the value of the function in the register $v0 - #load the variable t_98 - lw $v0, -44($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 48 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -east_CellularAutomaton: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 56 - - # assign (add here the expr.to_string) to t_100 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable position_99 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_101 - lw $v1, 16($fp) - lw $v0, 8($v1) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_102 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_100 - lw $v0, -0($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_101 - lw $v0, -4($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - div $t0, $t1 - mflo $t0 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to t_103 - lw $v1, 16($fp) - lw $v0, 8($v1) - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_104 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_102 - lw $v0, -8($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_103 - lw $v0, -12($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - mult $t0, $t1 - mflo $t0 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -16($fp) - - # assign (add here the expr.to_string) to t_105 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable position_99 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -20($fp) - - # assign (add here the expr.to_string) to t_106 - #load the variable t_104 - lw $v0, -16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_105 - lw $v0, -20($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to t_107 - #load the variable t_106 - lw $v0, -24($fp) - sw $v0, -28($fp) - - lw $t1, -28($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_9 - # assign (add here the expr.to_string) to t_109 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable position_99 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -36($fp) - - # assign (add here the expr.to_string) to t_110 - #load the variable t_109 - lw $v0, -36($fp) - sw $v0, -40($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -40($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_111 - # calling the method cell of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 60($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -44($fp) - - # assign (add here the expr.to_string) to t_108 - #load the variable t_111 - lw $v0, -44($fp) - sw $v0, -32($fp) - - j ifend_9 - then_9: - # assign (add here the expr.to_string) to t_112 - #load the string str_6 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_6 - sw $v1, 4($v0) - sw $v0, -48($fp) - - # assign (add here the expr.to_string) to t_108 - #load the variable t_112 - lw $v0, -48($fp) - sw $v0, -32($fp) - - ifend_9: - # assign (add here the expr.to_string) to t_113 - #load the variable t_108 - lw $v0, -32($fp) - sw $v0, -52($fp) - - # return the value of the function in the register $v0 - #load the variable t_113 - lw $v0, -52($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 56 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -west_CellularAutomaton: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 64 - - # assign (add here the expr.to_string) to t_115 - #load the variable position_114 - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_116 - #load the variable t_115 - lw $v0, -0($fp) - sw $v0, -4($fp) - - lw $t1, -4($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_10 - # assign (add here the expr.to_string) to t_118 - lw $v1, 16($fp) - lw $v0, 8($v1) - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_119 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable position_114 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_118 - lw $v0, -12($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - div $t0, $t1 - mflo $t0 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -16($fp) - - # assign (add here the expr.to_string) to t_120 - lw $v1, 16($fp) - lw $v0, 8($v1) - sw $v0, -20($fp) - - # assign (add here the expr.to_string) to t_121 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_119 - lw $v0, -16($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_120 - lw $v0, -20($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - mult $t0, $t1 - mflo $t0 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to t_122 - #load the variable t_121 - lw $v0, -24($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable position_114 - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -28($fp) - - # assign (add here the expr.to_string) to t_123 - #load the variable t_122 - lw $v0, -28($fp) - sw $v0, -32($fp) - - lw $t1, -32($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_11 - # assign (add here the expr.to_string) to t_125 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable position_114 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -40($fp) - - # assign (add here the expr.to_string) to t_126 - #load the variable t_125 - lw $v0, -40($fp) - sw $v0, -44($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -44($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_127 - # calling the method cell of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 60($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -48($fp) - - # assign (add here the expr.to_string) to t_124 - #load the variable t_127 - lw $v0, -48($fp) - sw $v0, -36($fp) - - j ifend_11 - then_11: - # assign (add here the expr.to_string) to t_128 - #load the string str_7 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_7 - sw $v1, 4($v0) - sw $v0, -52($fp) - - # assign (add here the expr.to_string) to t_124 - #load the variable t_128 - lw $v0, -52($fp) - sw $v0, -36($fp) - - ifend_11: - # assign (add here the expr.to_string) to t_117 - #load the variable t_124 - lw $v0, -36($fp) - sw $v0, -8($fp) - - j ifend_10 - then_10: - # assign (add here the expr.to_string) to t_129 - #load the string str_8 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_8 - sw $v1, 4($v0) - sw $v0, -56($fp) - - # assign (add here the expr.to_string) to t_117 - #load the variable t_129 - lw $v0, -56($fp) - sw $v0, -8($fp) - - ifend_10: - # assign (add here the expr.to_string) to t_130 - #load the variable t_117 - lw $v0, -8($fp) - sw $v0, -60($fp) - - # return the value of the function in the register $v0 - #load the variable t_130 - lw $v0, -60($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 64 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -northwest_CellularAutomaton: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 72 - - # assign (add here the expr.to_string) to t_132 - lw $v1, 16($fp) - lw $v0, 8($v1) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_133 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable position_131 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_132 - lw $v0, -0($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_134 - #load the variable t_133 - lw $v0, -4($fp) - move $t1, $v0 - lw $t1, 4($t1) - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - move $t2, $v0 - lw $t2, 4($t2) - slt $t3, $t1, $t2 - la $t4, Bool - li $a0, 8 - li $v0, 9 - syscall - sw $t4, 0($v0) - sw $t3, 4($v0) - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to t_135 - #load the variable t_134 - lw $v0, -8($fp) - sw $v0, -12($fp) - - lw $t1, -12($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_12 - # assign (add here the expr.to_string) to t_137 - lw $v1, 16($fp) - lw $v0, 8($v1) - sw $v0, -20($fp) - - # assign (add here the expr.to_string) to t_138 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable position_131 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_137 - lw $v0, -20($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - div $t0, $t1 - mflo $t0 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to t_139 - lw $v1, 16($fp) - lw $v0, 8($v1) - sw $v0, -28($fp) - - # assign (add here the expr.to_string) to t_140 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_138 - lw $v0, -24($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_139 - lw $v0, -28($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - mult $t0, $t1 - mflo $t0 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -32($fp) - - # assign (add here the expr.to_string) to t_141 - #load the variable t_140 - lw $v0, -32($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable position_131 - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -36($fp) - - # assign (add here the expr.to_string) to t_142 - #load the variable t_141 - lw $v0, -36($fp) - sw $v0, -40($fp) - - lw $t1, -40($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_13 - # assign (add here the expr.to_string) to t_144 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable position_131 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -48($fp) - - # assign (add here the expr.to_string) to t_145 - #load the variable t_144 - lw $v0, -48($fp) - sw $v0, -52($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -52($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_146 - # calling the method north of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 64($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -56($fp) - - # assign (add here the expr.to_string) to t_143 - #load the variable t_146 - lw $v0, -56($fp) - sw $v0, -44($fp) - - j ifend_13 - then_13: - # assign (add here the expr.to_string) to t_147 - #load the string str_9 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_9 - sw $v1, 4($v0) - sw $v0, -60($fp) - - # assign (add here the expr.to_string) to t_143 - #load the variable t_147 - lw $v0, -60($fp) - sw $v0, -44($fp) - - ifend_13: - # assign (add here the expr.to_string) to t_136 - #load the variable t_143 - lw $v0, -44($fp) - sw $v0, -16($fp) - - j ifend_12 - then_12: - # assign (add here the expr.to_string) to t_148 - #load the string str_10 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_10 - sw $v1, 4($v0) - sw $v0, -64($fp) - - # assign (add here the expr.to_string) to t_136 - #load the variable t_148 - lw $v0, -64($fp) - sw $v0, -16($fp) - - ifend_12: - # assign (add here the expr.to_string) to t_149 - #load the variable t_136 - lw $v0, -16($fp) - sw $v0, -68($fp) - - # return the value of the function in the register $v0 - #load the variable t_149 - lw $v0, -68($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 72 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -northeast_CellularAutomaton: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 80 - - # assign (add here the expr.to_string) to t_151 - lw $v1, 16($fp) - lw $v0, 8($v1) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_152 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable position_150 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_151 - lw $v0, -0($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_153 - #load the variable t_152 - lw $v0, -4($fp) - move $t1, $v0 - lw $t1, 4($t1) - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - move $t2, $v0 - lw $t2, 4($t2) - slt $t3, $t1, $t2 - la $t4, Bool - li $a0, 8 - li $v0, 9 - syscall - sw $t4, 0($v0) - sw $t3, 4($v0) - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to t_154 - #load the variable t_153 - lw $v0, -8($fp) - sw $v0, -12($fp) - - lw $t1, -12($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_14 - # assign (add here the expr.to_string) to t_156 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable position_150 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -20($fp) - - # assign (add here the expr.to_string) to t_157 - lw $v1, 16($fp) - lw $v0, 8($v1) - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to t_158 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_156 - lw $v0, -20($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_157 - lw $v0, -24($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - div $t0, $t1 - mflo $t0 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -28($fp) - - # assign (add here the expr.to_string) to t_159 - lw $v1, 16($fp) - lw $v0, 8($v1) - sw $v0, -32($fp) - - # assign (add here the expr.to_string) to t_160 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_158 - lw $v0, -28($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_159 - lw $v0, -32($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - mult $t0, $t1 - mflo $t0 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -36($fp) - - # assign (add here the expr.to_string) to t_161 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable position_150 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -40($fp) - - # assign (add here the expr.to_string) to t_162 - #load the variable t_160 - lw $v0, -36($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_161 - lw $v0, -40($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -44($fp) - - # assign (add here the expr.to_string) to t_163 - #load the variable t_162 - lw $v0, -44($fp) - sw $v0, -48($fp) - - lw $t1, -48($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_15 - # assign (add here the expr.to_string) to t_165 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable position_150 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -56($fp) - - # assign (add here the expr.to_string) to t_166 - #load the variable t_165 - lw $v0, -56($fp) - sw $v0, -60($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -60($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_167 - # calling the method north of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 64($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -64($fp) - - # assign (add here the expr.to_string) to t_164 - #load the variable t_167 - lw $v0, -64($fp) - sw $v0, -52($fp) - - j ifend_15 - then_15: - # assign (add here the expr.to_string) to t_168 - #load the string str_11 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_11 - sw $v1, 4($v0) - sw $v0, -68($fp) - - # assign (add here the expr.to_string) to t_164 - #load the variable t_168 - lw $v0, -68($fp) - sw $v0, -52($fp) - - ifend_15: - # assign (add here the expr.to_string) to t_155 - #load the variable t_164 - lw $v0, -52($fp) - sw $v0, -16($fp) - - j ifend_14 - then_14: - # assign (add here the expr.to_string) to t_169 - #load the string str_12 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_12 - sw $v1, 4($v0) - sw $v0, -72($fp) - - # assign (add here the expr.to_string) to t_155 - #load the variable t_169 - lw $v0, -72($fp) - sw $v0, -16($fp) - - ifend_14: - # assign (add here the expr.to_string) to t_170 - #load the variable t_155 - lw $v0, -16($fp) - sw $v0, -76($fp) - - # return the value of the function in the register $v0 - #load the variable t_170 - lw $v0, -76($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 80 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -southeast_CellularAutomaton: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 84 - - # assign (add here the expr.to_string) to t_172 - lw $v1, 16($fp) - lw $v0, 12($v1) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_173 - lw $v1, 16($fp) - lw $v0, 8($v1) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_174 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable position_171 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_173 - lw $v0, -4($fp) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to t_175 - #load the variable t_172 - lw $v0, -0($fp) - move $t1, $v0 - lw $t1, 4($t1) - #load the variable t_174 - lw $v0, -8($fp) - move $t2, $v0 - lw $t2, 4($t2) - slt $t3, $t1, $t2 - la $t4, Bool - li $a0, 8 - li $v0, 9 - syscall - sw $t4, 0($v0) - sw $t3, 4($v0) - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_176 - #load the variable t_175 - lw $v0, -12($fp) - sw $v0, -16($fp) - - lw $t1, -16($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_16 - # assign (add here the expr.to_string) to t_178 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable position_171 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to t_179 - lw $v1, 16($fp) - lw $v0, 8($v1) - sw $v0, -28($fp) - - # assign (add here the expr.to_string) to t_180 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_178 - lw $v0, -24($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_179 - lw $v0, -28($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - div $t0, $t1 - mflo $t0 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -32($fp) - - # assign (add here the expr.to_string) to t_181 - lw $v1, 16($fp) - lw $v0, 8($v1) - sw $v0, -36($fp) - - # assign (add here the expr.to_string) to t_182 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_180 - lw $v0, -32($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_181 - lw $v0, -36($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - mult $t0, $t1 - mflo $t0 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -40($fp) - - # assign (add here the expr.to_string) to t_183 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable position_171 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -44($fp) - - # assign (add here the expr.to_string) to t_184 - #load the variable t_182 - lw $v0, -40($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_183 - lw $v0, -44($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -48($fp) - - # assign (add here the expr.to_string) to t_185 - #load the variable t_184 - lw $v0, -48($fp) - sw $v0, -52($fp) - - lw $t1, -52($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_17 - # assign (add here the expr.to_string) to t_187 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable position_171 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -60($fp) - - # assign (add here the expr.to_string) to t_188 - #load the variable t_187 - lw $v0, -60($fp) - sw $v0, -64($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -64($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_189 - # calling the method south of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 68($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -68($fp) - - # assign (add here the expr.to_string) to t_186 - #load the variable t_189 - lw $v0, -68($fp) - sw $v0, -56($fp) - - j ifend_17 - then_17: - # assign (add here the expr.to_string) to t_190 - #load the string str_13 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_13 - sw $v1, 4($v0) - sw $v0, -72($fp) - - # assign (add here the expr.to_string) to t_186 - #load the variable t_190 - lw $v0, -72($fp) - sw $v0, -56($fp) - - ifend_17: - # assign (add here the expr.to_string) to t_177 - #load the variable t_186 - lw $v0, -56($fp) - sw $v0, -20($fp) - - j ifend_16 - then_16: - # assign (add here the expr.to_string) to t_191 - #load the string str_14 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_14 - sw $v1, 4($v0) - sw $v0, -76($fp) - - # assign (add here the expr.to_string) to t_177 - #load the variable t_191 - lw $v0, -76($fp) - sw $v0, -20($fp) - - ifend_16: - # assign (add here the expr.to_string) to t_192 - #load the variable t_177 - lw $v0, -20($fp) - sw $v0, -80($fp) - - # return the value of the function in the register $v0 - #load the variable t_192 - lw $v0, -80($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 84 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -southwest_CellularAutomaton: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 76 - - # assign (add here the expr.to_string) to t_194 - lw $v1, 16($fp) - lw $v0, 12($v1) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_195 - lw $v1, 16($fp) - lw $v0, 8($v1) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_196 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable position_193 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_195 - lw $v0, -4($fp) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to t_197 - #load the variable t_194 - lw $v0, -0($fp) - move $t1, $v0 - lw $t1, 4($t1) - #load the variable t_196 - lw $v0, -8($fp) - move $t2, $v0 - lw $t2, 4($t2) - slt $t3, $t1, $t2 - la $t4, Bool - li $a0, 8 - li $v0, 9 - syscall - sw $t4, 0($v0) - sw $t3, 4($v0) - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_198 - #load the variable t_197 - lw $v0, -12($fp) - sw $v0, -16($fp) - - lw $t1, -16($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_18 - # assign (add here the expr.to_string) to t_200 - lw $v1, 16($fp) - lw $v0, 8($v1) - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to t_201 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable position_193 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_200 - lw $v0, -24($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - div $t0, $t1 - mflo $t0 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -28($fp) - - # assign (add here the expr.to_string) to t_202 - lw $v1, 16($fp) - lw $v0, 8($v1) - sw $v0, -32($fp) - - # assign (add here the expr.to_string) to t_203 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_201 - lw $v0, -28($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_202 - lw $v0, -32($fp) - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - mult $t0, $t1 - mflo $t0 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -36($fp) - - # assign (add here the expr.to_string) to t_204 - #load the variable t_203 - lw $v0, -36($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable position_193 - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -40($fp) - - # assign (add here the expr.to_string) to t_205 - #load the variable t_204 - lw $v0, -40($fp) - sw $v0, -44($fp) - - lw $t1, -44($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_19 - # assign (add here the expr.to_string) to t_207 - # computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable position_193 - lw $v0, 12($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - lw $t1, 4($v0) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sub $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -52($fp) - - # assign (add here the expr.to_string) to t_208 - #load the variable t_207 - lw $v0, -52($fp) - sw $v0, -56($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -56($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_209 - # calling the method south of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 68($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -60($fp) - - # assign (add here the expr.to_string) to t_206 - #load the variable t_209 - lw $v0, -60($fp) - sw $v0, -48($fp) - - j ifend_19 - then_19: - # assign (add here the expr.to_string) to t_210 - #load the string str_15 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_15 - sw $v1, 4($v0) - sw $v0, -64($fp) - - # assign (add here the expr.to_string) to t_206 - #load the variable t_210 - lw $v0, -64($fp) - sw $v0, -48($fp) - - ifend_19: - # assign (add here the expr.to_string) to t_199 - #load the variable t_206 - lw $v0, -48($fp) - sw $v0, -20($fp) - - j ifend_18 - then_18: - # assign (add here the expr.to_string) to t_211 - #load the string str_16 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_16 - sw $v1, 4($v0) - sw $v0, -68($fp) - - # assign (add here the expr.to_string) to t_199 - #load the variable t_211 - lw $v0, -68($fp) - sw $v0, -20($fp) - - ifend_18: - # assign (add here the expr.to_string) to t_212 - #load the variable t_199 - lw $v0, -20($fp) - sw $v0, -72($fp) - - # return the value of the function in the register $v0 - #load the variable t_212 - lw $v0, -72($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 76 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -neighbors_CellularAutomaton: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 224 - - # assign (add here the expr.to_string) to t_214 - #load the variable position_213 - lw $v0, 12($fp) - sw $v0, -0($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_215 - # calling the method north of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 64($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_216 - #load the string str_17 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_17 - sw $v1, 4($v0) - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to t_217 - #load the variable t_215 - lw $v0, -4($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_216 - lw $v0, -8($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_218 - #load the variable t_217 - lw $v0, -12($fp) - sw $v0, -16($fp) - - lw $t1, -16($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_20 - # assign (add here the expr.to_string) to t_219 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -20($fp) - - j ifend_20 - then_20: - # assign (add here the expr.to_string) to t_219 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -20($fp) - - ifend_20: - # assign (add here the expr.to_string) to t_220 - #load the variable position_213 - lw $v0, 12($fp) - sw $v0, -24($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -24($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_221 - # calling the method south of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 68($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -28($fp) - - # assign (add here the expr.to_string) to t_222 - #load the string str_18 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_18 - sw $v1, 4($v0) - sw $v0, -32($fp) - - # assign (add here the expr.to_string) to t_223 - #load the variable t_221 - lw $v0, -28($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_222 - lw $v0, -32($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -36($fp) - - # assign (add here the expr.to_string) to t_224 - #load the variable t_223 - lw $v0, -36($fp) - sw $v0, -40($fp) - - lw $t1, -40($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_21 - # assign (add here the expr.to_string) to t_225 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -44($fp) - - j ifend_21 - then_21: - # assign (add here the expr.to_string) to t_225 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -44($fp) - - ifend_21: - # assign (add here the expr.to_string) to t_226 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_219 - lw $v0, -20($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_225 - lw $v0, -44($fp) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -48($fp) - - # assign (add here the expr.to_string) to t_227 - #load the variable position_213 - lw $v0, 12($fp) - sw $v0, -52($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -52($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_228 - # calling the method east of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 72($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -56($fp) - - # assign (add here the expr.to_string) to t_229 - #load the string str_19 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_19 - sw $v1, 4($v0) - sw $v0, -60($fp) - - # assign (add here the expr.to_string) to t_230 - #load the variable t_228 - lw $v0, -56($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_229 - lw $v0, -60($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -64($fp) - - # assign (add here the expr.to_string) to t_231 - #load the variable t_230 - lw $v0, -64($fp) - sw $v0, -68($fp) - - lw $t1, -68($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_22 - # assign (add here the expr.to_string) to t_232 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -72($fp) - - j ifend_22 - then_22: - # assign (add here the expr.to_string) to t_232 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -72($fp) - - ifend_22: - # assign (add here the expr.to_string) to t_233 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_226 - lw $v0, -48($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_232 - lw $v0, -72($fp) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -76($fp) - - # assign (add here the expr.to_string) to t_234 - #load the variable position_213 - lw $v0, 12($fp) - sw $v0, -80($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -80($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_235 - # calling the method west of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 76($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -84($fp) - - # assign (add here the expr.to_string) to t_236 - #load the string str_20 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_20 - sw $v1, 4($v0) - sw $v0, -88($fp) - - # assign (add here the expr.to_string) to t_237 - #load the variable t_235 - lw $v0, -84($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_236 - lw $v0, -88($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -92($fp) - - # assign (add here the expr.to_string) to t_238 - #load the variable t_237 - lw $v0, -92($fp) - sw $v0, -96($fp) - - lw $t1, -96($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_23 - # assign (add here the expr.to_string) to t_239 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -100($fp) - - j ifend_23 - then_23: - # assign (add here the expr.to_string) to t_239 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -100($fp) - - ifend_23: - # assign (add here the expr.to_string) to t_240 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_233 - lw $v0, -76($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_239 - lw $v0, -100($fp) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -104($fp) - - # assign (add here the expr.to_string) to t_241 - #load the variable position_213 - lw $v0, 12($fp) - sw $v0, -108($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -108($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_242 - # calling the method northeast of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 84($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -112($fp) - - # assign (add here the expr.to_string) to t_243 - #load the string str_21 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_21 - sw $v1, 4($v0) - sw $v0, -116($fp) - - # assign (add here the expr.to_string) to t_244 - #load the variable t_242 - lw $v0, -112($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_243 - lw $v0, -116($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -120($fp) - - # assign (add here the expr.to_string) to t_245 - #load the variable t_244 - lw $v0, -120($fp) - sw $v0, -124($fp) - - lw $t1, -124($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_24 - # assign (add here the expr.to_string) to t_246 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -128($fp) - - j ifend_24 - then_24: - # assign (add here the expr.to_string) to t_246 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -128($fp) - - ifend_24: - # assign (add here the expr.to_string) to t_247 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_240 - lw $v0, -104($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_246 - lw $v0, -128($fp) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -132($fp) - - # assign (add here the expr.to_string) to t_248 - #load the variable position_213 - lw $v0, 12($fp) - sw $v0, -136($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -136($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_249 - # calling the method northwest of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 80($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -140($fp) - - # assign (add here the expr.to_string) to t_250 - #load the string str_22 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_22 - sw $v1, 4($v0) - sw $v0, -144($fp) - - # assign (add here the expr.to_string) to t_251 - #load the variable t_249 - lw $v0, -140($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_250 - lw $v0, -144($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -148($fp) - - # assign (add here the expr.to_string) to t_252 - #load the variable t_251 - lw $v0, -148($fp) - sw $v0, -152($fp) - - lw $t1, -152($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_25 - # assign (add here the expr.to_string) to t_253 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -156($fp) - - j ifend_25 - then_25: - # assign (add here the expr.to_string) to t_253 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -156($fp) - - ifend_25: - # assign (add here the expr.to_string) to t_254 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_247 - lw $v0, -132($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_253 - lw $v0, -156($fp) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -160($fp) - - # assign (add here the expr.to_string) to t_255 - #load the variable position_213 - lw $v0, 12($fp) - sw $v0, -164($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -164($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_256 - # calling the method southeast of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 88($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -168($fp) - - # assign (add here the expr.to_string) to t_257 - #load the string str_23 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_23 - sw $v1, 4($v0) - sw $v0, -172($fp) - - # assign (add here the expr.to_string) to t_258 - #load the variable t_256 - lw $v0, -168($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_257 - lw $v0, -172($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -176($fp) - - # assign (add here the expr.to_string) to t_259 - #load the variable t_258 - lw $v0, -176($fp) - sw $v0, -180($fp) - - lw $t1, -180($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_26 - # assign (add here the expr.to_string) to t_260 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -184($fp) - - j ifend_26 - then_26: - # assign (add here the expr.to_string) to t_260 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -184($fp) - - ifend_26: - # assign (add here the expr.to_string) to t_261 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_254 - lw $v0, -160($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_260 - lw $v0, -184($fp) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -188($fp) - - # assign (add here the expr.to_string) to t_262 - #load the variable position_213 - lw $v0, 12($fp) - sw $v0, -192($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -192($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_263 - # calling the method southwest of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 92($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -196($fp) - - # assign (add here the expr.to_string) to t_264 - #load the string str_24 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_24 - sw $v1, 4($v0) - sw $v0, -200($fp) - - # assign (add here the expr.to_string) to t_265 - #load the variable t_263 - lw $v0, -196($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_264 - lw $v0, -200($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -204($fp) - - # assign (add here the expr.to_string) to t_266 - #load the variable t_265 - lw $v0, -204($fp) - sw $v0, -208($fp) - - lw $t1, -208($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_27 - # assign (add here the expr.to_string) to t_267 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -212($fp) - - j ifend_27 - then_27: - # assign (add here the expr.to_string) to t_267 - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -212($fp) - - ifend_27: - # assign (add here the expr.to_string) to t_268 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable t_261 - lw $v0, -188($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - #load the variable t_267 - lw $v0, -212($fp) - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -216($fp) - - # assign (add here the expr.to_string) to t_269 - #load the variable t_268 - lw $v0, -216($fp) - sw $v0, -220($fp) - - # return the value of the function in the register $v0 - #load the variable t_269 - lw $v0, -220($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 224 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -cell_at_next_evolution_CellularAutomaton: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 84 - - # assign (add here the expr.to_string) to t_271 - #load the variable position_270 - lw $v0, 12($fp) - sw $v0, -0($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_272 - # calling the method neighbors of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 96($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_273 - #load the variable t_272 - lw $v0, -4($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 3 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 3 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to t_274 - #load the variable t_273 - lw $v0, -8($fp) - sw $v0, -12($fp) - - lw $t1, -12($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_28 - # assign (add here the expr.to_string) to t_276 - #load the variable position_270 - lw $v0, 12($fp) - sw $v0, -20($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -20($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_277 - # calling the method neighbors of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 96($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to t_278 - #load the variable t_277 - lw $v0, -24($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 2 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 2 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -28($fp) - - # assign (add here the expr.to_string) to t_279 - #load the variable t_278 - lw $v0, -28($fp) - sw $v0, -32($fp) - - lw $t1, -32($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_29 - # assign (add here the expr.to_string) to t_281 - #load the string str_25 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_25 - sw $v1, 4($v0) - sw $v0, -40($fp) - - # assign (add here the expr.to_string) to t_280 - #load the variable t_281 - lw $v0, -40($fp) - sw $v0, -36($fp) - - j ifend_29 - then_29: - # assign (add here the expr.to_string) to t_282 - #load the variable position_270 - lw $v0, 12($fp) - sw $v0, -44($fp) - - lw $v0, 16($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -44($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_283 - # calling the method cell of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 16($fp) - lw $t0, 0($v0) - lw $v1, 60($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -48($fp) - - # assign (add here the expr.to_string) to t_284 - #load the string str_26 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_26 - sw $v1, 4($v0) - sw $v0, -52($fp) - - # assign (add here the expr.to_string) to t_285 - #load the variable t_283 - lw $v0, -48($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_284 - lw $v0, -52($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -56($fp) - - # assign (add here the expr.to_string) to t_286 - #load the variable t_285 - lw $v0, -56($fp) - sw $v0, -60($fp) - - lw $t1, -60($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_30 - # assign (add here the expr.to_string) to t_288 - #load the string str_27 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_27 - sw $v1, 4($v0) - sw $v0, -68($fp) - - # assign (add here the expr.to_string) to t_287 - #load the variable t_288 - lw $v0, -68($fp) - sw $v0, -64($fp) - - j ifend_30 - then_30: - # assign (add here the expr.to_string) to t_289 - #load the string str_28 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_28 - sw $v1, 4($v0) - sw $v0, -72($fp) - - # assign (add here the expr.to_string) to t_287 - #load the variable t_289 - lw $v0, -72($fp) - sw $v0, -64($fp) - - ifend_30: - # assign (add here the expr.to_string) to t_280 - #load the variable t_287 - lw $v0, -64($fp) - sw $v0, -36($fp) - - ifend_29: - # assign (add here the expr.to_string) to t_275 - #load the variable t_280 - lw $v0, -36($fp) - sw $v0, -16($fp) - - j ifend_28 - then_28: - # assign (add here the expr.to_string) to t_290 - #load the string str_29 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_29 - sw $v1, 4($v0) - sw $v0, -76($fp) - - # assign (add here the expr.to_string) to t_275 - #load the variable t_290 - lw $v0, -76($fp) - sw $v0, -16($fp) - - ifend_28: - # assign (add here the expr.to_string) to t_291 - #load the variable t_275 - lw $v0, -16($fp) - sw $v0, -80($fp) - - # return the value of the function in the register $v0 - #load the variable t_291 - lw $v0, -80($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 84 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text - .globl evolve -evolve_CellularAutomaton: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 72 - - # assign (add here the expr.to_string) to position_292 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -0($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_294 - # calling the method num_cells of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 56($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to num_293 - #load the variable t_294 - lw $v0, -8($fp) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to temp_295 - #load the string str_empty - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_empty - sw $v1, 4($v0) - sw $v0, -12($fp) - - while_1: - # assign (add here the expr.to_string) to t_296 - #load the variable position_292 - lw $v0, -0($fp) - move $t1, $v0 - lw $t1, 4($t1) - #load the variable num_293 - lw $v0, -4($fp) - move $t2, $v0 - lw $t2, 4($t2) - slt $t3, $t1, $t2 - la $t4, Bool - li $a0, 8 - li $v0, 9 - syscall - sw $t4, 0($v0) - sw $t3, 4($v0) - sw $v0, -16($fp) - - # assign (add here the expr.to_string) to t_297 - #load the variable t_296 - lw $v0, -16($fp) - sw $v0, -20($fp) - - lw $t1, -20($fp) - lw $t0, 4($t1) - bne $t0, $zero, body_1 - j pool_1 - body_1: - # assign (add here the expr.to_string) to t_299 - #load the variable temp_295 - lw $v0, -12($fp) - sw $v0, -28($fp) - - # assign (add here the expr.to_string) to t_300 - #load the variable position_292 - lw $v0, -0($fp) - sw $v0, -32($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -32($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_301 - # calling the method cell_at_next_evolution of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 100($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -36($fp) - - # assign (add here the expr.to_string) to t_302 - #load the variable t_301 - lw $v0, -36($fp) - sw $v0, -40($fp) - - lw $v0, -28($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -40($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_303 - # calling the method concat of type String - #load the variable t_299 - lw $v0, -28($fp) - lw $t0, 0($v0) - lw $v1, 28($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -44($fp) - - # assign (add here the expr.to_string) to temp_295 - #load the variable t_303 - lw $v0, -44($fp) - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_304 - #load the variable position_292 - lw $v0, -0($fp) - sw $v0, -48($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -48($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_305 - # calling the method out_int of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 28($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -52($fp) - - # assign (add here the expr.to_string) to t_306 - #load the variable num_293 - lw $v0, -4($fp) - sw $v0, -56($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -56($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_307 - # calling the method out_int of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 28($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -60($fp) - - # assign (add here the expr.to_string) to t_308 - # computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at $v0 - #load the variable position_292 - lw $v0, -0($fp) - lw $t0, 4($v0) - # push $t0 to the stack - sw $t0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - lw $t1, 4($v0) - add $t0, $t0, $t1 - li $a0, 8 - li $v0, 9 - syscall - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - sw $v0, -64($fp) - - # assign (add here the expr.to_string) to position_292 - #load the variable t_308 - lw $v0, -64($fp) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_298 - #load the variable position_292 - lw $v0, -0($fp) - sw $v0, -24($fp) - - j while_1 - pool_1: - # Setting value of the attribute population_map in the instance self_CellularAutomaton to temp_295 - #load the variable temp_295 - lw $v0, -12($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 16($v1) - - # assign (add here the expr.to_string) to t_309 - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - sw $v0, -68($fp) - - # return the value of the function in the register $v0 - #load the variable t_309 - lw $v0, -68($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 72 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -option_CellularAutomaton: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 640 - - # assign (add here the expr.to_string) to num_310 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_311 - #load the string str_30 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_30 - sw $v1, 4($v0) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_312 - #load the variable t_311 - lw $v0, -4($fp) - sw $v0, -8($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -8($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_313 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_314 - #load the string str_31 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_31 - sw $v1, 4($v0) - sw $v0, -16($fp) - - # assign (add here the expr.to_string) to t_315 - #load the variable t_314 - lw $v0, -16($fp) - sw $v0, -20($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -20($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_316 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to t_317 - #load the string str_32 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_32 - sw $v1, 4($v0) - sw $v0, -28($fp) - - # assign (add here the expr.to_string) to t_318 - #load the variable t_317 - lw $v0, -28($fp) - sw $v0, -32($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -32($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_319 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -36($fp) - - # assign (add here the expr.to_string) to t_320 - #load the string str_33 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_33 - sw $v1, 4($v0) - sw $v0, -40($fp) - - # assign (add here the expr.to_string) to t_321 - #load the variable t_320 - lw $v0, -40($fp) - sw $v0, -44($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -44($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_322 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -48($fp) - - # assign (add here the expr.to_string) to t_323 - #load the string str_34 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_34 - sw $v1, 4($v0) - sw $v0, -52($fp) - - # assign (add here the expr.to_string) to t_324 - #load the variable t_323 - lw $v0, -52($fp) - sw $v0, -56($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -56($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_325 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -60($fp) - - # assign (add here the expr.to_string) to t_326 - #load the string str_35 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_35 - sw $v1, 4($v0) - sw $v0, -64($fp) - - # assign (add here the expr.to_string) to t_327 - #load the variable t_326 - lw $v0, -64($fp) - sw $v0, -68($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -68($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_328 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -72($fp) - - # assign (add here the expr.to_string) to t_329 - #load the string str_36 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_36 - sw $v1, 4($v0) - sw $v0, -76($fp) - - # assign (add here the expr.to_string) to t_330 - #load the variable t_329 - lw $v0, -76($fp) - sw $v0, -80($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -80($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_331 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -84($fp) - - # assign (add here the expr.to_string) to t_332 - #load the string str_37 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_37 - sw $v1, 4($v0) - sw $v0, -88($fp) - - # assign (add here the expr.to_string) to t_333 - #load the variable t_332 - lw $v0, -88($fp) - sw $v0, -92($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -92($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_334 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -96($fp) - - # assign (add here the expr.to_string) to t_335 - #load the string str_38 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_38 - sw $v1, 4($v0) - sw $v0, -100($fp) - - # assign (add here the expr.to_string) to t_336 - #load the variable t_335 - lw $v0, -100($fp) - sw $v0, -104($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -104($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_337 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -108($fp) - - # assign (add here the expr.to_string) to t_338 - #load the string str_39 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_39 - sw $v1, 4($v0) - sw $v0, -112($fp) - - # assign (add here the expr.to_string) to t_339 - #load the variable t_338 - lw $v0, -112($fp) - sw $v0, -116($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -116($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_340 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -120($fp) - - # assign (add here the expr.to_string) to t_341 - #load the string str_40 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_40 - sw $v1, 4($v0) - sw $v0, -124($fp) - - # assign (add here the expr.to_string) to t_342 - #load the variable t_341 - lw $v0, -124($fp) - sw $v0, -128($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -128($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_343 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -132($fp) - - # assign (add here the expr.to_string) to t_344 - #load the string str_41 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_41 - sw $v1, 4($v0) - sw $v0, -136($fp) - - # assign (add here the expr.to_string) to t_345 - #load the variable t_344 - lw $v0, -136($fp) - sw $v0, -140($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -140($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_346 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -144($fp) - - # assign (add here the expr.to_string) to t_347 - #load the string str_42 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_42 - sw $v1, 4($v0) - sw $v0, -148($fp) - - # assign (add here the expr.to_string) to t_348 - #load the variable t_347 - lw $v0, -148($fp) - sw $v0, -152($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -152($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_349 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -156($fp) - - # assign (add here the expr.to_string) to t_350 - #load the string str_43 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_43 - sw $v1, 4($v0) - sw $v0, -160($fp) - - # assign (add here the expr.to_string) to t_351 - #load the variable t_350 - lw $v0, -160($fp) - sw $v0, -164($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -164($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_352 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -168($fp) - - # assign (add here the expr.to_string) to t_353 - #load the string str_44 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_44 - sw $v1, 4($v0) - sw $v0, -172($fp) - - # assign (add here the expr.to_string) to t_354 - #load the variable t_353 - lw $v0, -172($fp) - sw $v0, -176($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -176($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_355 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -180($fp) - - # assign (add here the expr.to_string) to t_356 - #load the string str_45 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_45 - sw $v1, 4($v0) - sw $v0, -184($fp) - - # assign (add here the expr.to_string) to t_357 - #load the variable t_356 - lw $v0, -184($fp) - sw $v0, -188($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -188($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_358 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -192($fp) - - # assign (add here the expr.to_string) to t_359 - #load the string str_46 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_46 - sw $v1, 4($v0) - sw $v0, -196($fp) - - # assign (add here the expr.to_string) to t_360 - #load the variable t_359 - lw $v0, -196($fp) - sw $v0, -200($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -200($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_361 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -204($fp) - - # assign (add here the expr.to_string) to t_362 - #load the string str_47 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_47 - sw $v1, 4($v0) - sw $v0, -208($fp) - - # assign (add here the expr.to_string) to t_363 - #load the variable t_362 - lw $v0, -208($fp) - sw $v0, -212($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -212($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_364 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -216($fp) - - # assign (add here the expr.to_string) to t_365 - #load the string str_48 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_48 - sw $v1, 4($v0) - sw $v0, -220($fp) - - # assign (add here the expr.to_string) to t_366 - #load the variable t_365 - lw $v0, -220($fp) - sw $v0, -224($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -224($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_367 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -228($fp) - - # assign (add here the expr.to_string) to t_368 - #load the string str_49 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_49 - sw $v1, 4($v0) - sw $v0, -232($fp) - - # assign (add here the expr.to_string) to t_369 - #load the variable t_368 - lw $v0, -232($fp) - sw $v0, -236($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -236($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_370 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -240($fp) - - # assign (add here the expr.to_string) to t_371 - #load the string str_50 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_50 - sw $v1, 4($v0) - sw $v0, -244($fp) - - # assign (add here the expr.to_string) to t_372 - #load the variable t_371 - lw $v0, -244($fp) - sw $v0, -248($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -248($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_373 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -252($fp) - - # assign (add here the expr.to_string) to t_374 - #load the string str_51 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_51 - sw $v1, 4($v0) - sw $v0, -256($fp) - - # assign (add here the expr.to_string) to t_375 - #load the variable t_374 - lw $v0, -256($fp) - sw $v0, -260($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -260($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_376 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -264($fp) - - # assign (add here the expr.to_string) to t_377 - #load the string str_52 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_52 - sw $v1, 4($v0) - sw $v0, -268($fp) - - # assign (add here the expr.to_string) to t_378 - #load the variable t_377 - lw $v0, -268($fp) - sw $v0, -272($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -272($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_379 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -276($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_380 - # calling the method in_int of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 36($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -280($fp) - - # assign (add here the expr.to_string) to num_310 - #load the variable t_380 - lw $v0, -280($fp) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_381 - #load the string str_53 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_53 - sw $v1, 4($v0) - sw $v0, -284($fp) - - # assign (add here the expr.to_string) to t_382 - #load the variable t_381 - lw $v0, -284($fp) - sw $v0, -288($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -288($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_383 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -292($fp) - - # assign (add here the expr.to_string) to t_384 - #load the variable num_310 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -296($fp) - - # assign (add here the expr.to_string) to t_385 - #load the variable t_384 - lw $v0, -296($fp) - sw $v0, -300($fp) - - lw $t1, -300($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_31 - # assign (add here the expr.to_string) to t_387 - #load the variable num_310 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 2 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 2 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -308($fp) - - # assign (add here the expr.to_string) to t_388 - #load the variable t_387 - lw $v0, -308($fp) - sw $v0, -312($fp) - - lw $t1, -312($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_32 - # assign (add here the expr.to_string) to t_390 - #load the variable num_310 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 3 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 3 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -320($fp) - - # assign (add here the expr.to_string) to t_391 - #load the variable t_390 - lw $v0, -320($fp) - sw $v0, -324($fp) - - lw $t1, -324($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_33 - # assign (add here the expr.to_string) to t_393 - #load the variable num_310 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 4 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 4 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -332($fp) - - # assign (add here the expr.to_string) to t_394 - #load the variable t_393 - lw $v0, -332($fp) - sw $v0, -336($fp) - - lw $t1, -336($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_34 - # assign (add here the expr.to_string) to t_396 - #load the variable num_310 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 5 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 5 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -344($fp) - - # assign (add here the expr.to_string) to t_397 - #load the variable t_396 - lw $v0, -344($fp) - sw $v0, -348($fp) - - lw $t1, -348($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_35 - # assign (add here the expr.to_string) to t_399 - #load the variable num_310 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 6 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 6 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -356($fp) - - # assign (add here the expr.to_string) to t_400 - #load the variable t_399 - lw $v0, -356($fp) - sw $v0, -360($fp) - - lw $t1, -360($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_36 - # assign (add here the expr.to_string) to t_402 - #load the variable num_310 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 7 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 7 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -368($fp) - - # assign (add here the expr.to_string) to t_403 - #load the variable t_402 - lw $v0, -368($fp) - sw $v0, -372($fp) - - lw $t1, -372($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_37 - # assign (add here the expr.to_string) to t_405 - #load the variable num_310 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 8 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 8 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -380($fp) - - # assign (add here the expr.to_string) to t_406 - #load the variable t_405 - lw $v0, -380($fp) - sw $v0, -384($fp) - - lw $t1, -384($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_38 - # assign (add here the expr.to_string) to t_408 - #load the variable num_310 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 9 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 9 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -392($fp) - - # assign (add here the expr.to_string) to t_409 - #load the variable t_408 - lw $v0, -392($fp) - sw $v0, -396($fp) - - lw $t1, -396($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_39 - # assign (add here the expr.to_string) to t_411 - #load the variable num_310 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 10 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 10 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -404($fp) - - # assign (add here the expr.to_string) to t_412 - #load the variable t_411 - lw $v0, -404($fp) - sw $v0, -408($fp) - - lw $t1, -408($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_40 - # assign (add here the expr.to_string) to t_414 - #load the variable num_310 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 11 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 11 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -416($fp) - - # assign (add here the expr.to_string) to t_415 - #load the variable t_414 - lw $v0, -416($fp) - sw $v0, -420($fp) - - lw $t1, -420($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_41 - # assign (add here the expr.to_string) to t_417 - #load the variable num_310 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 12 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 12 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -428($fp) - - # assign (add here the expr.to_string) to t_418 - #load the variable t_417 - lw $v0, -428($fp) - sw $v0, -432($fp) - - lw $t1, -432($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_42 - # assign (add here the expr.to_string) to t_420 - #load the variable num_310 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 13 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 13 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -440($fp) - - # assign (add here the expr.to_string) to t_421 - #load the variable t_420 - lw $v0, -440($fp) - sw $v0, -444($fp) - - lw $t1, -444($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_43 - # assign (add here the expr.to_string) to t_423 - #load the variable num_310 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 14 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 14 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -452($fp) - - # assign (add here the expr.to_string) to t_424 - #load the variable t_423 - lw $v0, -452($fp) - sw $v0, -456($fp) - - lw $t1, -456($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_44 - # assign (add here the expr.to_string) to t_426 - #load the variable num_310 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 15 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 15 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -464($fp) - - # assign (add here the expr.to_string) to t_427 - #load the variable t_426 - lw $v0, -464($fp) - sw $v0, -468($fp) - - lw $t1, -468($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_45 - # assign (add here the expr.to_string) to t_429 - #load the variable num_310 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 16 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 16 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -476($fp) - - # assign (add here the expr.to_string) to t_430 - #load the variable t_429 - lw $v0, -476($fp) - sw $v0, -480($fp) - - lw $t1, -480($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_46 - # assign (add here the expr.to_string) to t_432 - #load the variable num_310 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 17 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 17 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -488($fp) - - # assign (add here the expr.to_string) to t_433 - #load the variable t_432 - lw $v0, -488($fp) - sw $v0, -492($fp) - - lw $t1, -492($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_47 - # assign (add here the expr.to_string) to t_435 - #load the variable num_310 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 18 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 18 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -500($fp) - - # assign (add here the expr.to_string) to t_436 - #load the variable t_435 - lw $v0, -500($fp) - sw $v0, -504($fp) - - lw $t1, -504($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_48 - # assign (add here the expr.to_string) to t_438 - #load the variable num_310 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 19 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 19 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -512($fp) - - # assign (add here the expr.to_string) to t_439 - #load the variable t_438 - lw $v0, -512($fp) - sw $v0, -516($fp) - - lw $t1, -516($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_49 - # assign (add here the expr.to_string) to t_441 - #load the variable num_310 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 20 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 20 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -524($fp) - - # assign (add here the expr.to_string) to t_442 - #load the variable t_441 - lw $v0, -524($fp) - sw $v0, -528($fp) - - lw $t1, -528($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_50 - # assign (add here the expr.to_string) to t_444 - #load the variable num_310 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 21 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 21 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -536($fp) - - # assign (add here the expr.to_string) to t_445 - #load the variable t_444 - lw $v0, -536($fp) - sw $v0, -540($fp) - - lw $t1, -540($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_51 - # assign (add here the expr.to_string) to t_447 - #load the string str_54 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_54 - sw $v1, 4($v0) - sw $v0, -548($fp) - - # assign (add here the expr.to_string) to t_446 - #load the variable t_447 - lw $v0, -548($fp) - sw $v0, -544($fp) - - j ifend_51 - then_51: - # assign (add here the expr.to_string) to t_448 - #load the string str_55 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_55 - sw $v1, 4($v0) - sw $v0, -552($fp) - - # assign (add here the expr.to_string) to t_446 - #load the variable t_448 - lw $v0, -552($fp) - sw $v0, -544($fp) - - ifend_51: - # assign (add here the expr.to_string) to t_443 - #load the variable t_446 - lw $v0, -544($fp) - sw $v0, -532($fp) - - j ifend_50 - then_50: - # assign (add here the expr.to_string) to t_449 - #load the string str_56 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_56 - sw $v1, 4($v0) - sw $v0, -556($fp) - - # assign (add here the expr.to_string) to t_443 - #load the variable t_449 - lw $v0, -556($fp) - sw $v0, -532($fp) - - ifend_50: - # assign (add here the expr.to_string) to t_440 - #load the variable t_443 - lw $v0, -532($fp) - sw $v0, -520($fp) - - j ifend_49 - then_49: - # assign (add here the expr.to_string) to t_450 - #load the string str_57 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_57 - sw $v1, 4($v0) - sw $v0, -560($fp) - - # assign (add here the expr.to_string) to t_440 - #load the variable t_450 - lw $v0, -560($fp) - sw $v0, -520($fp) - - ifend_49: - # assign (add here the expr.to_string) to t_437 - #load the variable t_440 - lw $v0, -520($fp) - sw $v0, -508($fp) - - j ifend_48 - then_48: - # assign (add here the expr.to_string) to t_451 - #load the string str_58 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_58 - sw $v1, 4($v0) - sw $v0, -564($fp) - - # assign (add here the expr.to_string) to t_437 - #load the variable t_451 - lw $v0, -564($fp) - sw $v0, -508($fp) - - ifend_48: - # assign (add here the expr.to_string) to t_434 - #load the variable t_437 - lw $v0, -508($fp) - sw $v0, -496($fp) - - j ifend_47 - then_47: - # assign (add here the expr.to_string) to t_452 - #load the string str_59 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_59 - sw $v1, 4($v0) - sw $v0, -568($fp) - - # assign (add here the expr.to_string) to t_434 - #load the variable t_452 - lw $v0, -568($fp) - sw $v0, -496($fp) - - ifend_47: - # assign (add here the expr.to_string) to t_431 - #load the variable t_434 - lw $v0, -496($fp) - sw $v0, -484($fp) - - j ifend_46 - then_46: - # assign (add here the expr.to_string) to t_453 - #load the string str_60 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_60 - sw $v1, 4($v0) - sw $v0, -572($fp) - - # assign (add here the expr.to_string) to t_431 - #load the variable t_453 - lw $v0, -572($fp) - sw $v0, -484($fp) - - ifend_46: - # assign (add here the expr.to_string) to t_428 - #load the variable t_431 - lw $v0, -484($fp) - sw $v0, -472($fp) - - j ifend_45 - then_45: - # assign (add here the expr.to_string) to t_454 - #load the string str_61 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_61 - sw $v1, 4($v0) - sw $v0, -576($fp) - - # assign (add here the expr.to_string) to t_428 - #load the variable t_454 - lw $v0, -576($fp) - sw $v0, -472($fp) - - ifend_45: - # assign (add here the expr.to_string) to t_425 - #load the variable t_428 - lw $v0, -472($fp) - sw $v0, -460($fp) - - j ifend_44 - then_44: - # assign (add here the expr.to_string) to t_455 - #load the string str_62 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_62 - sw $v1, 4($v0) - sw $v0, -580($fp) - - # assign (add here the expr.to_string) to t_425 - #load the variable t_455 - lw $v0, -580($fp) - sw $v0, -460($fp) - - ifend_44: - # assign (add here the expr.to_string) to t_422 - #load the variable t_425 - lw $v0, -460($fp) - sw $v0, -448($fp) - - j ifend_43 - then_43: - # assign (add here the expr.to_string) to t_456 - #load the string str_63 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_63 - sw $v1, 4($v0) - sw $v0, -584($fp) - - # assign (add here the expr.to_string) to t_422 - #load the variable t_456 - lw $v0, -584($fp) - sw $v0, -448($fp) - - ifend_43: - # assign (add here the expr.to_string) to t_419 - #load the variable t_422 - lw $v0, -448($fp) - sw $v0, -436($fp) - - j ifend_42 - then_42: - # assign (add here the expr.to_string) to t_457 - #load the string str_64 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_64 - sw $v1, 4($v0) - sw $v0, -588($fp) - - # assign (add here the expr.to_string) to t_419 - #load the variable t_457 - lw $v0, -588($fp) - sw $v0, -436($fp) - - ifend_42: - # assign (add here the expr.to_string) to t_416 - #load the variable t_419 - lw $v0, -436($fp) - sw $v0, -424($fp) - - j ifend_41 - then_41: - # assign (add here the expr.to_string) to t_458 - #load the string str_65 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_65 - sw $v1, 4($v0) - sw $v0, -592($fp) - - # assign (add here the expr.to_string) to t_416 - #load the variable t_458 - lw $v0, -592($fp) - sw $v0, -424($fp) - - ifend_41: - # assign (add here the expr.to_string) to t_413 - #load the variable t_416 - lw $v0, -424($fp) - sw $v0, -412($fp) - - j ifend_40 - then_40: - # assign (add here the expr.to_string) to t_459 - #load the string str_66 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_66 - sw $v1, 4($v0) - sw $v0, -596($fp) - - # assign (add here the expr.to_string) to t_413 - #load the variable t_459 - lw $v0, -596($fp) - sw $v0, -412($fp) - - ifend_40: - # assign (add here the expr.to_string) to t_410 - #load the variable t_413 - lw $v0, -412($fp) - sw $v0, -400($fp) - - j ifend_39 - then_39: - # assign (add here the expr.to_string) to t_460 - #load the string str_67 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_67 - sw $v1, 4($v0) - sw $v0, -600($fp) - - # assign (add here the expr.to_string) to t_410 - #load the variable t_460 - lw $v0, -600($fp) - sw $v0, -400($fp) - - ifend_39: - # assign (add here the expr.to_string) to t_407 - #load the variable t_410 - lw $v0, -400($fp) - sw $v0, -388($fp) - - j ifend_38 - then_38: - # assign (add here the expr.to_string) to t_461 - #load the string str_68 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_68 - sw $v1, 4($v0) - sw $v0, -604($fp) - - # assign (add here the expr.to_string) to t_407 - #load the variable t_461 - lw $v0, -604($fp) - sw $v0, -388($fp) - - ifend_38: - # assign (add here the expr.to_string) to t_404 - #load the variable t_407 - lw $v0, -388($fp) - sw $v0, -376($fp) - - j ifend_37 - then_37: - # assign (add here the expr.to_string) to t_462 - #load the string str_69 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_69 - sw $v1, 4($v0) - sw $v0, -608($fp) - - # assign (add here the expr.to_string) to t_404 - #load the variable t_462 - lw $v0, -608($fp) - sw $v0, -376($fp) - - ifend_37: - # assign (add here the expr.to_string) to t_401 - #load the variable t_404 - lw $v0, -376($fp) - sw $v0, -364($fp) - - j ifend_36 - then_36: - # assign (add here the expr.to_string) to t_463 - #load the string str_70 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_70 - sw $v1, 4($v0) - sw $v0, -612($fp) - - # assign (add here the expr.to_string) to t_401 - #load the variable t_463 - lw $v0, -612($fp) - sw $v0, -364($fp) - - ifend_36: - # assign (add here the expr.to_string) to t_398 - #load the variable t_401 - lw $v0, -364($fp) - sw $v0, -352($fp) - - j ifend_35 - then_35: - # assign (add here the expr.to_string) to t_464 - #load the string str_71 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_71 - sw $v1, 4($v0) - sw $v0, -616($fp) - - # assign (add here the expr.to_string) to t_398 - #load the variable t_464 - lw $v0, -616($fp) - sw $v0, -352($fp) - - ifend_35: - # assign (add here the expr.to_string) to t_395 - #load the variable t_398 - lw $v0, -352($fp) - sw $v0, -340($fp) - - j ifend_34 - then_34: - # assign (add here the expr.to_string) to t_465 - #load the string str_72 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_72 - sw $v1, 4($v0) - sw $v0, -620($fp) - - # assign (add here the expr.to_string) to t_395 - #load the variable t_465 - lw $v0, -620($fp) - sw $v0, -340($fp) - - ifend_34: - # assign (add here the expr.to_string) to t_392 - #load the variable t_395 - lw $v0, -340($fp) - sw $v0, -328($fp) - - j ifend_33 - then_33: - # assign (add here the expr.to_string) to t_466 - #load the string str_73 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_73 - sw $v1, 4($v0) - sw $v0, -624($fp) - - # assign (add here the expr.to_string) to t_392 - #load the variable t_466 - lw $v0, -624($fp) - sw $v0, -328($fp) - - ifend_33: - # assign (add here the expr.to_string) to t_389 - #load the variable t_392 - lw $v0, -328($fp) - sw $v0, -316($fp) - - j ifend_32 - then_32: - # assign (add here the expr.to_string) to t_467 - #load the string str_74 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_74 - sw $v1, 4($v0) - sw $v0, -628($fp) - - # assign (add here the expr.to_string) to t_389 - #load the variable t_467 - lw $v0, -628($fp) - sw $v0, -316($fp) - - ifend_32: - # assign (add here the expr.to_string) to t_386 - #load the variable t_389 - lw $v0, -316($fp) - sw $v0, -304($fp) - - j ifend_31 - then_31: - # assign (add here the expr.to_string) to t_468 - #load the string str_75 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_75 - sw $v1, 4($v0) - sw $v0, -632($fp) - - # assign (add here the expr.to_string) to t_386 - #load the variable t_468 - lw $v0, -632($fp) - sw $v0, -304($fp) - - ifend_31: - # assign (add here the expr.to_string) to t_469 - #load the variable t_386 - lw $v0, -304($fp) - sw $v0, -636($fp) - - # return the value of the function in the register $v0 - #load the variable t_469 - lw $v0, -636($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 640 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -prompt_CellularAutomaton: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 72 - - # assign (add here the expr.to_string) to ans_470 - #load the string str_empty - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_empty - sw $v1, 4($v0) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_471 - #load the string str_76 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_76 - sw $v1, 4($v0) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_472 - #load the variable t_471 - lw $v0, -4($fp) - sw $v0, -8($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -8($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_473 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_474 - #load the string str_77 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_77 - sw $v1, 4($v0) - sw $v0, -16($fp) - - # assign (add here the expr.to_string) to t_475 - #load the variable t_474 - lw $v0, -16($fp) - sw $v0, -20($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -20($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_476 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -24($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_477 - # calling the method in_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 32($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -28($fp) - - # assign (add here the expr.to_string) to ans_470 - #load the variable t_477 - lw $v0, -28($fp) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_478 - #load the string str_78 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_78 - sw $v1, 4($v0) - sw $v0, -32($fp) - - # assign (add here the expr.to_string) to t_479 - #load the variable t_478 - lw $v0, -32($fp) - sw $v0, -36($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -36($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_480 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -40($fp) - - # assign (add here the expr.to_string) to t_481 - #load the string str_79 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_79 - sw $v1, 4($v0) - sw $v0, -44($fp) - - # assign (add here the expr.to_string) to t_482 - #load the variable ans_470 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_481 - lw $v0, -44($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -48($fp) - - # assign (add here the expr.to_string) to t_483 - #load the variable t_482 - lw $v0, -48($fp) - sw $v0, -52($fp) - - lw $t1, -52($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_52 - # assign (add here the expr.to_string) to t_485 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -60($fp) - - # assign (add here the expr.to_string) to t_484 - #load the variable t_485 - lw $v0, -60($fp) - sw $v0, -56($fp) - - j ifend_52 - then_52: - # assign (add here the expr.to_string) to t_486 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -64($fp) - - # assign (add here the expr.to_string) to t_484 - #load the variable t_486 - lw $v0, -64($fp) - sw $v0, -56($fp) - - ifend_52: - # assign (add here the expr.to_string) to t_487 - #load the variable t_484 - lw $v0, -56($fp) - sw $v0, -68($fp) - - # return the value of the function in the register $v0 - #load the variable t_487 - lw $v0, -68($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 72 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -prompt2_CellularAutomaton: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 72 - - # assign (add here the expr.to_string) to ans_488 - #load the string str_empty - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_empty - sw $v1, 4($v0) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_489 - #load the string str_80 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_80 - sw $v1, 4($v0) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_490 - #load the variable t_489 - lw $v0, -4($fp) - sw $v0, -8($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -8($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_491 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -12($fp) - - # assign (add here the expr.to_string) to t_492 - #load the string str_81 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_81 - sw $v1, 4($v0) - sw $v0, -16($fp) - - # assign (add here the expr.to_string) to t_493 - #load the variable t_492 - lw $v0, -16($fp) - sw $v0, -20($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -20($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_494 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -24($fp) - - # assign (add here the expr.to_string) to t_495 - #load the string str_82 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_82 - sw $v1, 4($v0) - sw $v0, -28($fp) - - # assign (add here the expr.to_string) to t_496 - #load the variable t_495 - lw $v0, -28($fp) - sw $v0, -32($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -32($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_497 - # calling the method out_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -36($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_498 - # calling the method in_string of type CellularAutomaton - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 32($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -40($fp) - - # assign (add here the expr.to_string) to ans_488 - #load the variable t_498 - lw $v0, -40($fp) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_499 - #load the string str_83 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_83 - sw $v1, 4($v0) - sw $v0, -44($fp) - - # assign (add here the expr.to_string) to t_500 - #load the variable ans_488 - lw $v0, -0($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - #load the variable t_499 - lw $v0, -44($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -48($fp) - - # assign (add here the expr.to_string) to t_501 - #load the variable t_500 - lw $v0, -48($fp) - sw $v0, -52($fp) - - lw $t1, -52($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_53 - # assign (add here the expr.to_string) to t_503 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -60($fp) - - # assign (add here the expr.to_string) to t_502 - #load the variable t_503 - lw $v0, -60($fp) - sw $v0, -56($fp) - - j ifend_53 - then_53: - # assign (add here the expr.to_string) to t_504 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -64($fp) - - # assign (add here the expr.to_string) to t_502 - #load the variable t_504 - lw $v0, -64($fp) - sw $v0, -56($fp) - - ifend_53: - # assign (add here the expr.to_string) to t_505 - #load the variable t_502 - lw $v0, -56($fp) - sw $v0, -68($fp) - - # return the value of the function in the register $v0 - #load the variable t_505 - lw $v0, -68($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 72 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -Init_CellularAutomaton: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 4 - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to self_CellularAutomaton - jal Init_Board - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, 12($fp) - - # assign (add here the expr.to_string) to t_506 - #load the string str_empty - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_empty - sw $v1, 4($v0) - sw $v0, -0($fp) - - # Setting value of the attribute population_map in the instance self_CellularAutomaton to t_506 - #load the variable t_506 - lw $v0, -0($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 16($v1) - - # return the value of the function in the register $v0 - #load the variable self_CellularAutomaton - lw $v0, 12($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 4 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -main_Main: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 136 - - # assign (add here the expr.to_string) to continue_507 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to choice_508 - #load the string str_empty - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_empty - sw $v1, 4($v0) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_509 - #load the string str_84 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_84 - sw $v1, 4($v0) - sw $v0, -8($fp) - - # assign (add here the expr.to_string) to t_510 - #load the variable t_509 - lw $v0, -8($fp) - sw $v0, -12($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_511 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -16($fp) - - # assign (add here the expr.to_string) to t_512 - #load the string str_85 - li $a0, 8 - li $v0, 9 - syscall - la $v1, String - sw $v1, 0($v0) - la $v1, str_85 - sw $v1, 4($v0) - sw $v0, -20($fp) - - # assign (add here the expr.to_string) to t_513 - #load the variable t_512 - lw $v0, -20($fp) - sw $v0, -24($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -24($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_514 - # calling the method out_string of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 24($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -28($fp) - - while_2: - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_515 - # calling the method prompt2 of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 116($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -32($fp) - - # assign (add here the expr.to_string) to t_516 - #load the variable t_515 - lw $v0, -32($fp) - sw $v0, -36($fp) - - lw $t1, -36($fp) - lw $t0, 4($t1) - bne $t0, $zero, body_2 - j pool_2 - body_2: - # assign (add here the expr.to_string) to t_518 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -44($fp) - - # assign (add here the expr.to_string) to continue_507 - #load the variable t_518 - lw $v0, -44($fp) - sw $v0, -0($fp) - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_519 - # calling the method option of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 108($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -48($fp) - - # assign (add here the expr.to_string) to choice_508 - #load the variable t_519 - lw $v0, -48($fp) - sw $v0, -4($fp) - - # assign (add here the expr.to_string) to t_520 - li $a0, 20 - li $v0, 9 - syscall - la $a0, CellularAutomaton - sw $a0, 0($v0) - sw $v0, -52($fp) - - lw $v0, -52($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_521 - # calling the method Init_CellularAutomaton of type CellularAutomaton - #load the variable t_520 - lw $v0, -52($fp) - lw $t0, 0($v0) - lw $v1, 8($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -56($fp) - - # assign (add here the expr.to_string) to t_522 - #load the variable t_521 - lw $v0, -56($fp) - sw $v0, -60($fp) - - # assign (add here the expr.to_string) to t_523 - #load the variable choice_508 - lw $v0, -4($fp) - sw $v0, -64($fp) - - lw $v0, -60($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - lw $v0, -64($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_524 - # calling the method init of type CellularAutomaton - #load the variable t_522 - lw $v0, -60($fp) - lw $t0, 0($v0) - lw $v1, 48($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -68($fp) - - # Setting value of the attribute cells in the instance self_Main to t_524 - #load the variable t_524 - lw $v0, -68($fp) - move $s2, $v0 - lw $v1, 12($fp) - sw $s2, 20($v1) - - # assign (add here the expr.to_string) to t_525 - lw $v1, 12($fp) - lw $v0, 20($v1) - sw $v0, -72($fp) - - # assign (add here the expr.to_string) to t_526 - #load the variable t_525 - lw $v0, -72($fp) - sw $v0, -76($fp) - - lw $v0, -76($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_527 - # calling the method print of type CellularAutomaton - #load the variable t_526 - lw $v0, -76($fp) - lw $t0, 0($v0) - lw $v1, 52($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -80($fp) - - while_3: - # assign (add here the expr.to_string) to t_528 - #load the variable continue_507 - lw $v0, -0($fp) - sw $v0, -84($fp) - - lw $t1, -84($fp) - lw $t0, 4($t1) - bne $t0, $zero, body_3 - j pool_3 - body_3: - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_530 - # calling the method prompt of type Main - #load the variable self_Main - lw $v0, 12($fp) - lw $t0, 0($v0) - lw $v1, 112($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -92($fp) - - # assign (add here the expr.to_string) to t_531 - #load the variable t_530 - lw $v0, -92($fp) - sw $v0, -96($fp) - - lw $t1, -96($fp) - lw $t0, 4($t1) - bne $t0, $zero, then_54 - # assign (add here the expr.to_string) to t_533 - # Creating Int instance for atomic 0 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 0 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # Creating Int instance for atomic 1 - li $a0, 8 - li $v0, 9 - syscall - la $t0, Int - li $t1, 1 - sw $t0, 0($v0) - sw $t1, 4($v0) - - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - jal compare - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - # pop the top of the stack to $t0 - addi $sp $sp 4 - lw $t0, 0($sp) - - sw $v0, -104($fp) - - # assign (add here the expr.to_string) to continue_507 - #load the variable t_533 - lw $v0, -104($fp) - sw $v0, -0($fp) - - # assign (add here the expr.to_string) to t_532 - #load the variable continue_507 - lw $v0, -0($fp) - sw $v0, -100($fp) - - j ifend_54 - then_54: - # assign (add here the expr.to_string) to t_534 - lw $v1, 12($fp) - lw $v0, 20($v1) - sw $v0, -108($fp) - - # assign (add here the expr.to_string) to t_535 - #load the variable t_534 - lw $v0, -108($fp) - sw $v0, -112($fp) - - lw $v0, -112($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - .globl test -test: - # assign (add here the expr.to_string) to t_536 - # calling the method evolve of type CellularAutomaton - #load the variable t_535 - lw $v0, -112($fp) - lw $t0, 0($v0) - lw $v1, 104($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -116($fp) - - # assign (add here the expr.to_string) to t_537 - lw $v1, 12($fp) - lw $v0, 20($v1) - sw $v0, -120($fp) - - # assign (add here the expr.to_string) to t_538 - #load the variable t_537 - lw $v0, -120($fp) - sw $v0, -124($fp) - - lw $v0, -124($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to t_539 - # calling the method print of type CellularAutomaton - #load the variable t_538 - lw $v0, -124($fp) - lw $t0, 0($v0) - lw $v1, 52($t0) - jal $v1 - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, -128($fp) - - # assign (add here the expr.to_string) to t_532 - #load the variable t_539 - lw $v0, -128($fp) - sw $v0, -100($fp) - - ifend_54: - # assign (add here the expr.to_string) to t_529 - #load the variable t_532 - lw $v0, -100($fp) - sw $v0, -88($fp) - - j while_3 - pool_3: - # assign (add here the expr.to_string) to t_517 - #load the variable t_529 - lw $v0, -88($fp) - sw $v0, -40($fp) - - j while_2 - pool_2: - # assign (add here the expr.to_string) to t_540 - #load the variable self_Main - lw $v0, 12($fp) - sw $v0, -132($fp) - - # return the value of the function in the register $v0 - #load the variable t_540 - lw $v0, -132($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 136 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -Init_Main: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 0 - - lw $v0, 12($fp) - # push $v0 to the stack - sw $v0, 0($sp) - addi $sp $sp -4 - - # assign (add here the expr.to_string) to self_Main - jal Init_CellularAutomaton - # pop the top of the stack to $v1 - addi $sp $sp 4 - lw $v1, 0($sp) - - sw $v0, 12($fp) - - # return the value of the function in the register $v0 - #load the variable self_Main - lw $v0, 12($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -Init_Object: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 0 - - # return the value of the function in the register $v0 - #load the variable self - lw $v0, 12($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -Init_Int: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 0 - - # Setting value of the attribute value in the instance self to v - #load the variable v - lw $v0, 12($fp) - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 4($v1) - - # return the value of the function in the register $v0 - #load the variable self - lw $v0, 16($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -Init_String: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 0 - - # Setting value of the attribute value in the instance self to v - #load the variable v - lw $v0, 12($fp) - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 4($v1) - - # return the value of the function in the register $v0 - #load the variable self - lw $v0, 16($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -Init_Bool: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 0 - - # Setting value of the attribute value in the instance self to v - #load the variable v - lw $v0, 12($fp) - move $s2, $v0 - lw $v1, 16($fp) - sw $s2, 4($v1) - - # return the value of the function in the register $v0 - #load the variable self - lw $v0, 16($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - - .text -Init_IO: - # save the return address and frame pointer - # push $ra to the stack - sw $ra, 0($sp) - addi $sp $sp -4 - - # push $fp to the stack - sw $fp, 0($sp) - addi $sp $sp -4 - - # update the frame pointer and allocate the frame in the stack - move $fp $sp - subu $sp $sp 0 - - # return the value of the function in the register $v0 - #load the variable self - lw $v0, 12($fp) - move $v0, $v0 - - # restore the stack pointer, frame pointer y return address - addu $sp $sp 0 - # pop the top of the stack to $fp - addi $sp $sp 4 - lw $fp, 0($sp) - - # pop the top of the stack to $ra - addi $sp $sp 4 - lw $ra, 0($sp) - - jr $ra - -abort_Object: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - la $a0, ObjectAbortMessage - li $v0, 4 - syscall - - lw $t0, 12($fp) - lw $t0, 0($t0) - lw $t0, 4($t0) - - move $a0, $t0 - li $v0, 4 - syscall - - li $v0, 10 - syscall - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra - -copy_Object: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - - lw $t7, 12($fp) # load the object address - lw $t6, 0($t7) # get the type info address - lw $t5, 0($t6) # get the size of the type - - move $a0, $t5 - li $v0, 9 - syscall - move $t6, $v0 -copy_Object_loop: - lw $t4, 0($t7) - sw $t4, 0($t6) - addu $t7, $t7, 4 - addu $t6, $t6, 4 - addu $t5, $t5, -4 - bgtz $t5, copy_Object_loop - - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra - - - -out_string_IO: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - - lw $a1, 12($fp) # reference to string object - lw $a0, 4($a1) # get the address of the value of the string - li $v0, 4 - syscall - - lw $v0, 16($fp) - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra - -out_int_IO: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - lw $v1, 12($fp) - lw $a0, 4($v1) - li $v0, 1 - syscall - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra - -in_string_IO: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - # Read the string to the buffer - la $a0, IO_Buffer - li $a1, 1000 - li $v0, 8 - syscall - - # get the length of the string to allocate the memory - la $t0, IO_Buffer - sw $t0, 0($sp) - addi $sp, $sp, -4 - jal strlen - addi $sp, $sp, 4 - lw $t0, 0($sp) # the length is now in $v0 - - addi $v0, $v0, 1 - move $a0, $v0 - li $v0, 9 - syscall # in $v0 is the address of the value string - - la $t1, IO_Buffer # copy the string value from the buffer to the heap - move $t2, $v0 - in_string_IO_loop: - lbu $t3, 0($t1) - sb $t3, 0($t2) - addi $t1, $t1, 1 - addi $t2, $t2, 1 - bgtz $t3, in_string_IO_loop - addi $t2, $t2, -2 - li $t3, 0 - sb $t3, 0($t2) - - move $t0, $v0 - - li $a0, 8 - li $v0, 9 - syscall - - la $t1, String - sw $t0, 4($v0) - sw $t1, 0($v0) - - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra - -in_int_IO: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - li $v0, 5 - syscall - move $t0, $v0 - - li $v0, 9 - li $a0, 8 - syscall - - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra - - - - - - - - - - - -type_name_Object: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - lw $t7, 12($fp) # get the instance address - lw $t6, 0($t7) # get the type info address - lw $t5, 4($t6) # get the type name - - # create the String class instance to return - li $a0, 8 - li $v0, 9 - syscall - - la $t1, String - sw $t1, 0($v0) - sw $t5, 4($v0) - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra - - - .globl substr -substr_String: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - lw $t7, 20($fp) # get the String instance address - lw $t0, 4($t7) # get the value of the source String - - lw $t7, 16($fp) # get the start parameter Int instance address - lw $t1, 4($t7) # get the value of the Int - - lw $t7, 12($fp) # get the length perameter Int instance address - lw $t2, 4($t7) # get the value of the Int - - move $a0, $t2 - li $v0, 9 - syscall # allocate memory for the substring value - - - li $t3, 0 # current pos in the string - - substr_String_loop1: - beq $t3, $t1, substr_String_eloop1 # if the current pos == start pos break - # else move the current pos - addi $t0, $t0, 1 - addi $t3, $t3, 1 - j substr_String_loop1 - - substr_String_eloop1: - - li $t3, 0 - move $t4, $v0 # move the substring address to $t4 - - substr_String_loop2: - beq $t3, $t2, substr_String_eloop2 - lbu $t7, 0($t0) - sb $t7, 0($t4) - addi $t0, $t0, 1 - addi $t4, $t4, 1 - addi $t3, $t3, 1 - j substr_String_loop2 - - substr_String_eloop2: - - move $t0, $v0 - la $t1, String - - li $a0, 8 - li $v0, 9 - syscall - - sw $t1, 0($v0) - sw $t0, 4($v0) - - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra - - -isvoid: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - lw $t0, 12($fp) - li $t1, 0 - beq $t0, $t1, isvoid_end - li $t0, 1 - isvoid_end: - - li $a0, 8 - li $v0, 9 - syscall - - la $t1, Bool - sw $t1, 0($v0) - sw $t0, 4($v0) - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra - -# function to get the length of a string value -strlen: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - - lw $a0, 12($fp) - li $t0, 0 -strlen_loop: - lbu $t1, 0($a0) - beqz $t1, strlen_exit - addu $a0, $a0, 1 - addu $t0, $t0, 1 - j strlen_loop - strlen_exit: - move $v0, $t0 - - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra - - -length_String: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - lw $v0, 12($fp) # get the string instance address - lw $v1, 4($v0) # get the string value address - - # push the instace in the stack - sw $v1, 0($sp) - addi $sp, $sp, -4 - - jal strlen # length at v0 - - addi $sp, $sp, 4 - lw $t0, 0($sp) - - - move $t0, $v0 - - # allocate space for the Int instace - li $a0, 8 - li $v0, 9 - syscall - - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra - - -compare: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - lw $t0, 12($fp) - lw $t1, 16($fp) - - lw $t3, 0($t0) - - la $t4, Int - beq $t3, $t4, compare_branch1 - - la $t4, Bool - beq $t3, $t4, compare_branch1 - - la $t4, type - beq $t3, $t4, compare_branch1 - - la $t4, String - beq $t3, $t4, compare_branch2 - - j compare_values - - compare_branch1: - lw $t0, 4($t0) - lw $t1, 4($t1) - - compare_values: - beq $t0, $t1, compare_true - j compare_false - - - compare_branch2: - lw $t0, 4($t0) - lw $t1, 4($t1) - compare_str_loop: - lbu $t3, 0($t0) - lbu $t4, 0($t1) - bne $t3, $t4, compare_false - beq $t3, $zero, compare_true - addi $t0, $t0, 1 - addi $t1, $t1, 1 - j compare_str_loop - - compare_true: - li $t0, 1 - j compare_end - - compare_false: - li $t0, 0 - - compare_end: - - li $a0, 8 - li $v0, 9 - syscall - la $t1, Bool - sw $t1, 0($v0) - sw $t0, 4($v0) - - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra - - -concat_String: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - lw $t0, 16($fp) - lw $t0, 4($t0) # the value of the first String instance - - # call strlen with the string - sw $t0, 0($sp) - addi $sp, $sp, -4 - jal strlen - addi $sp, $sp, 4 - lw $t0, 0($sp) - - #save the lenght of the first string - sw $v0, 0($sp) - addi $sp, $sp, -4 - - - lw $t0, 16($fp) - lw $t0, 4($t0) # the value of the second String instance - - # call strlen with the string - sw $t0, 0($sp) - addi $sp, $sp, -4 - jal strlen - addi $sp, $sp, 4 - lw $t0, 0($sp) - - # pop the lenght of the first string from the stack - addi $sp, $sp, 4 - lw $t0, 0($sp) - - # get the total space for allocating the new string - addu $t0, $t0, $v0 - addi $t0, $t0, 1 - - move $a0, $t0 - li $v0, 9 - syscall # at $v0 is the result string - - lw $t0, 16($fp) - lw $t0, 4($t0) # the address of the value of the first String instance - move $t1, $v0 # the address of the value of the result string - concat_String_loop1: - lbu $t3, 0($t0) - beq $t3, $zero, concat_String_eloop1 - sb $t3, 0($t1) - addi $t0, $t0, 1 - addi $t1, $t1, 1 - j concat_String_loop1 - - concat_String_eloop1: - - lw $t0, 12($fp) - lw $t0, 4($t0) - concat_String_loop2: - lbu $t3, 0($t0) - beq $t3, $zero, concat_String_eloop2 - sb $t3, 0($t1) - addi $t0, $t0, 1 - addi $t1, $t1, 1 - j concat_String_loop2 - concat_String_eloop2: - sb $zero, 0($t1) - - la $t0, String - move $t1, $v0 - - li $a0, 8 - li $v0, 9 - syscall - - sw $t0, 0($v0) - sw $t1, 4($v0) - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/tours/TypeBuilder.py b/src/semantics/TypeBuilder.py similarity index 97% rename from src/tours/TypeBuilder.py rename to src/semantics/TypeBuilder.py index 6dc9f5807..997fbffab 100644 --- a/src/tours/TypeBuilder.py +++ b/src/semantics/TypeBuilder.py @@ -1,7 +1,7 @@ from parsing.ast import * -from cmp.semantic import SemanticError -from cmp.semantic import ErrorType, StringType, IntType, BoolType, ObjectType, SelfType -import cmp.visitor as visitor +from .semantic import SemanticError +from .semantic import ErrorType, StringType, IntType, BoolType, ObjectType, SelfType +import utils.visitor as visitor CANNOT_INHERIT = "SemanticError: Class %s cannot inherit class %s." diff --git a/src/tours/TypeChecker.py b/src/semantics/TypeChecker.py similarity index 97% rename from src/tours/TypeChecker.py rename to src/semantics/TypeChecker.py index 2abc5635a..1b91bc069 100644 --- a/src/tours/TypeChecker.py +++ b/src/semantics/TypeChecker.py @@ -1,8 +1,8 @@ from parsing.ast import * from .utils import find_parent_type, is_base_class -from cmp.semantic import Scope, SemanticError -from cmp.semantic import ObjectType, IntType, StringType, BoolType, ErrorType, SelfType -import cmp.visitor as visitor +from .semantic import Scope, SemanticError +from .semantic import ObjectType, IntType, StringType, BoolType, ErrorType, SelfType +import utils.visitor as visitor SELF_IS_READONLY = "SemanticError: Cannot assign to 'self'." diff --git a/src/tours/TypeCollector.py b/src/semantics/TypeCollector.py similarity index 93% rename from src/tours/TypeCollector.py rename to src/semantics/TypeCollector.py index 0e6bb37ca..5dd35b728 100644 --- a/src/tours/TypeCollector.py +++ b/src/semantics/TypeCollector.py @@ -1,7 +1,7 @@ from parsing.ast import * -from cmp.semantic import SemanticError, Context -from cmp.semantic import ObjectType, StringType, IntType, BoolType, IOType, SelfType -import cmp.visitor as visitor +from .semantic import SemanticError, Context +from .semantic import ObjectType, StringType, IntType, BoolType, IOType, SelfType +import utils.visitor as visitor from .utils import is_base_class diff --git a/src/cmp/semantic.py b/src/semantics/semantic.py similarity index 100% rename from src/cmp/semantic.py rename to src/semantics/semantic.py diff --git a/src/tours/utils.py b/src/semantics/utils.py similarity index 90% rename from src/tours/utils.py rename to src/semantics/utils.py index 249ba46aa..8fd08d102 100644 --- a/src/tours/utils.py +++ b/src/semantics/utils.py @@ -1,5 +1,5 @@ from parsing.ast import * -from cmp.semantic import ErrorType, ObjectType, SelfType +from .semantic import ErrorType, ObjectType, SelfType def find_parent_type(current_type, type1, type2): diff --git a/src/test.txt b/src/test.txt deleted file mode 100644 index f5255b3fa..000000000 --- a/src/test.txt +++ /dev/null @@ -1,8 +0,0 @@ - -class Main { - - main() : Int { - let x : Int <- 3 , y : Int <- 2 in if x = y then 2 else 3 fi - }; -}; - diff --git a/src/test1.txt b/src/test1.txt deleted file mode 100644 index f87ad790b..000000000 --- a/src/test1.txt +++ /dev/null @@ -1,10 +0,0 @@ -class Main { - w : Int; - - main(a : Int) : Int { - { - w <- 3; - let y : Int <- 3 in (a + y) + w; - } - }; -}; diff --git a/src/test2.txt b/src/test2.txt deleted file mode 100755 index 92d54783f..000000000 --- a/src/test2.txt +++ /dev/null @@ -1,8 +0,0 @@ - -class Main { - - main() : String { - let x : String <- "hola" in x - }; -}; - diff --git a/src/test3.txt b/src/test3.txt deleted file mode 100644 index 0aade2ce4..000000000 --- a/src/test3.txt +++ /dev/null @@ -1,7 +0,0 @@ -class Main { - w : Int <- 2; - s : Int <- 3; - main() : Object { - while w < s loop 7 pool - }; -}; \ No newline at end of file diff --git a/src/test4.txt b/src/test4.txt deleted file mode 100644 index a0f161d01..000000000 --- a/src/test4.txt +++ /dev/null @@ -1,25 +0,0 @@ -class Main { - main() : Int { - 2 - }; -}; - -class A { - a : Int <- 3; - - main() : Int { - 3 - }; -}; - -class B inherits A { - -}; - -class C inherits B { - b : Int <- 2; - - main() : Int { - 4 - }; -}; \ No newline at end of file diff --git a/src/test5.txt b/src/test5.txt deleted file mode 100644 index da65ab057..000000000 --- a/src/test5.txt +++ /dev/null @@ -1,18 +0,0 @@ -class Main { - - main(a : Int) : Int { - 2 - }; -}; - -class A { } ; -class B inherits C { } ; -class D inherits A { } ; -class M { } ; -class L inherits C { } ; -class C { } ; -class H inherits M { } ; - - - - diff --git a/src/test6.txt b/src/test6.txt deleted file mode 100644 index 196512b72..000000000 --- a/src/test6.txt +++ /dev/null @@ -1,68 +0,0 @@ -(* hairy . . .*) - -class Foo inherits Bazz { - a : Razz <- case self of - n : Razz => (new Bar); - n : Foo => (new Razz); - n : Bar => n; - esac; - - b : Int <- a.doh() + g.doh() + doh() + printh(); - - doh() : Int { (let i : Int <- h in { h <- h + 2; i; } ) }; - -}; - -class Bar inherits Razz { - - c : Int <- doh(); - - d : Object <- printh(); -}; - - -class Razz inherits Foo { - - e : Bar <- case self of - n : Razz => (new Bar); - n : Bar => n; - esac; - - f : Int <- a@Bazz.doh() + g.doh() + e.doh() + doh() + printh(); - -}; - -class Bazz inherits IO { - - h : Int <- 1; - - g : Foo <- case self of - n : Bazz => (new Foo); - n : Razz => (new Bar); - n : Foo => (new Razz); - n : Bar => n; - esac; - - i : Object <- printh(); - - printh() : Int { { out_int(h); 0; } }; - - doh() : Int { (let i: Int <- h in { h <- h + 1; i; } ) }; -}; - -(* scary . . . *) -class Main { - a : Bazz <- new Bazz; - b : Foo <- new Foo; - c : Razz <- new Razz; - d : Bar <- new Bar; - - main(): String { "do nothing" }; - -}; - - - - - - diff --git a/src/cmp/visitor.py b/src/utils/visitor.py similarity index 100% rename from src/cmp/visitor.py rename to src/utils/visitor.py From cc88514f91f484db553fbf86db6140dbd2ed2eb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karla=20Olivera=20Hern=C3=A1ndez?= Date: Tue, 1 Mar 2022 23:35:44 -0500 Subject: [PATCH 71/81] Add last changes to report and attach report.pdf and team.yml --- doc/report.pdf | Bin 0 -> 191783 bytes doc/report/report.md | 28 +++++++++++++++------------- doc/team.yml | 18 +++++++++--------- 3 files changed, 24 insertions(+), 22 deletions(-) create mode 100644 doc/report.pdf diff --git a/doc/report.pdf b/doc/report.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0b698dca5b3c346d01be03630246ffcd3d4d98a0 GIT binary patch literal 191783 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

-a#L-VDmG*Y`nsgV|m z7#`r`+e{~c%zTu^1W%UGUCHzqKLiZUY}`yRnR3={E6!_xZmufu5851Eo#;99JDIuD zdC|_B)n%Waad1>mYVwdwCmsm!*8oZ8)GzNwj&@V@=V|pCy*<_59&#$Y9pgf|Q*9*Q z#?Pk0nL+_FIZQO4)tQ8or(&l@xsLxNxLm2Pd0cj}od*8OnLE~WpKsRRlnuC6HRpL0 zK&CZD-0pUL^B{pgR>Q=PF0rh1-)BMNxT^RsHZ>Jy15(t>*OHH5$b7 z*AJ9X=^x<~OwuW#vvnj=H80JR=;nR8=Ha#YHO9>n%lJUHUcOzK{2Qj`S~gwbK#|ehtt=}qKe{|o-sZ?EKVrW%hf5S%v?3)N z?(@)g=asRSG}XLJD$sf%dl~*_<@vPsc-?%w{TY3{ot5hY+h!=_8J`l9IY*i--G0!l zA6yKJgG4+v82-7Q$6v8GW!wKgS$q%+V{lv@-xtAU;^2?dDzd_b18RqXZI9(!qyV$e zG6PO0Es1Z0gTzmqM8HcyNQM)2$v^RCmSX1NC)kkp8)4?LFi-ai(L8NEmKQC*WDsTE zZXw3>OhL4!%LmVgJ*N6>$pS~ox2c}nbg&_2iOIbequfsTFP7s8nWx`L!B_lcp~>V! zWnE*$^H#as$h*S$*jsU(jbk=1d^V>w=_ z2us#2C%kM$qt+PmgrcJUXB;ep_AoNQi|V{NP@hB%Zp{8q@sfNxU1>=VhC_X+7RFtt z3_A1HL$cV;bP@DOb*WIMNK^Rt{&7!t9;%zf9BM7XV@28x7G>TG;-BSFAWB#vuw&N~ zzj$`!{w&hg{%dV&{ajKWrX#rk;%g#l&`%*U;B;qe#xhStN8HB7xYwizapves-U)lu z2cxMM4dv9??l93)(u(IOkg(K8Pz97#N9Gd`lOq1VgJd?sg|-Q@pk9n(hDEh%$Qc7D z1q-e-q(}oSRUn6sWh9YuV5>ljfWGV+^^a6kBH;eK!&2Tf>-DHDTWbpCY?nml?O6%a z^-Wf%=IsAe*VL*Ad@;F{uEyWUnR&*MLq-h~CjeMLMHbiMCrd$7^r=V<-OKlu;tVXr zGc#IOG!wE^4L(4=j?vC}P2 zJtto*;_7hgx6qE5AL-fs@&KN(QgmEwzBDoozCPmNTDe5et~)0V4z2fe_MAU&%JEh6 zPqkdw@UPf{D3143_x>ZA%|4$2=TK-J#u?(<5{|Ulc@HKl;7nsj#mDrPB-95hm=`0X zIU{WTTeBV`6jnmJ1*aM&y4wl5T-1`O)OLthpmJwG5|(5PM24R19D@Ul8w*f)hUQ(z zrJN|$30xQ^iH|QZ8&;Ad${V2l%q1RCCPpm6{N&(pjaYsD&*(nA>>tN5kimw4oyI@8 zPs!GEB&mO`=u}N|tgKhNE|-P=0N9cKpx94AC}ViQ_+w(glmmBv9})s65@7=<;&KFt zX8-4kAh#R6kdbJfDi; za9Zg3V#nr#V80C^j}d|5j!6!ZjXj1N%X5dg%ZG$SH{=&EmVyf?mSO*H`(qX?&XZCf zWoau)%KA767Vp>`8$ovv)}wCWqO9pLCuRo%jVufS@xFjbgshjvczH|dsmmOOP^LZ_ zSC{ac)=it0K5avv_toFW1`BWCZ$`hHWbpDH*KA7`Op8##D6cSlhgP;h z7qJoN=x%X(hdg`8-sBQRd>%xy3EQF?CN&^>IG`tGOk#X!-7Y@&m|bT#a5YByMpvuJ z9N03VULiK0&r<4hUC+Cv?!;R2W8ccX3|+HTk35Nez1)r2uKtIyZwl_@i@KeOZQHh; z{NhY(+qP}nwr$(C&51Lylbio{AMf{YUwT)auC9LQ-us+dd+oJ;M_E7Hz)QHAE1qcc z5!P>l$3Ku=;=LR|+#thH>2H%Qb;Wvwm%K*`V+(LGNxKp~BX~`6qHZ>lR9MN7-$Gss zCgNTKh_`ZrOgy*CnFeeHleKRFi`L5kZ2sfeE?nf}_?D!C8tS&GmtyKzb!o{Ksv$6N zWmV=z%fOP#98Qo8x|BymI2So*Qr2}Qvkq6@bumr(hVkeqJf&^8Tp~h^)fQ=o>M%X` z8_A*1rvOsJmCr|Y{i&8-zRZ~6=T%dD!}`xh&J?wyHc_4RR*)VU#9SC z5sipe7I&T-Ig_ALOGBnDAM3DBL!^(wG=1Z2{qxq_1J@KTG_`~}vW zC|BJ!NC{7Hcw=+U%<;`#DMM3Aby7_f>`-Y}0Tts8FCRH(5k2b}r&+m2;vCx6E;KV% zf^x#ME#jREMIa5q6C}BaPNBRT@Y$$FBKabj_%5E#(eT5Y8&;Anap|~L<15^b1hnfD z5TRQQ)%j$O8Y{&sNBWa3-O*b%>udw1S{g0K{Ykoxzb|UoW?(Q)LQtB()RB>*XFICB zv*{j`aJaA@3*chN(Kt;;<3|m^@5Tz%j!*I2F)O#$R7zBf%c+6>kgII!&iC>tHF3S%Mk|J^^UEOY?g8h~$1$$%Hpl*aoG zgLxJVb9!FMOeIdfN0yMInfyif#cM;p_m|Nd;^uYZ-bd4k>C?j224f@+8vKY$mJxQ>4OA(C=7eM|gO@sw?C)Efl6MxSS z_I?SY8q0N2JcdayYY?R9Je)*&toinvagomo!$I*g^T_v_qZ7LL!D6mO@OE`LI>P&O zsf709j)W~$7AuL*)^`XhR3|Uj@~$LrJRL#c4{?+Re~QXa#qxKwnX|h6#e=7$Y0}0L z=8}Zv+Xm%Z^jhEGm2X7rK#yx#C30PBxY?{>^!w7d8me8NC6H`}p5c09OL}BYG1I_% zPv5$O?3c;vNe+M@Wn(Gc6sm?zJGxGddNMRv+jZrv983pkX_y+M`=BI{s+jVBJCFEn z>$%ZkFvy|jrQeyR(uwrwv0?s$&xXqgTp#E`HkgG<9!pQrat=4ii`X(*Rt{Dx_*Y5d zY(Y8AcB4LfcE?q}_zU-SIzot%StnmN{9H~bvhrlNlaX*oUg zL12a^?F4zCxi5)8JjF@Uz80l8%nT}~n-8kAgaJzf56a4K^Ibfmrf=&9Tmji%<44HxEv;hAWcH2D2yB) z=-_59M^uZt1iJw~{E!m>^d2U#tbeJ8GDFIM_m?aUvkn(#0aWQ4!a?IzwMrWdzhkHv z2V~O zDa%Y+u8)7$up2q{2-1RHPtIM@f&O$^=19ycfoBHlB4e82~K$BIrBYIjUDB z;!^Nvo&sSFx>e|H2@Jv_Z*eEBewex?qa~*8D$!!ZM#7ekCP*2r5<> z4A?&Rz>)(V;l_+DQD~?3va^W2sTh99tpFR|HK{&+E4sMp$^s~n%oHsHFUkN5yc-*& zcs?p=@>qY;rW>z#^2qZRC8MW0Z2qdlW{Brkhq#m_ZMBo09b%%vvmmsvF}$WfTcH$c zC71CLBUtF}xI_KZ)=!AzfA z>+QB&Lxwn2jLCX$vv;;>}5u@>$A8hXBS zuxI`mwB8S!FtJ0@aIs!$%%CrX_T=d7L!Awc!Opn%;jB=!+T(|}s@_pe=s&`+svQTL zhKU4ahc|FZVPj`#VPUWBN{}U$ZQf+HR$75`l-;nqi8Ncy2#`{S9=zOPv==Z(D$?}o|om<#fCtv zmcTyJ{F;Am7+7@}g)4O$eN$$M1uX(k*`%K|Da>-92fCTWcB(Pt94~(}_09k((Wq>g zg;mq4qyejwgzz>RS;KGn7L^TvNw?hCgm5lb4Trmy_ZtBN&m4mmX;B#0P5h`|NaGf2i?SU#X`tP`q7*g>o3hEwe zrekw{SMU722Yu$yKHW0fE3l+|{S(3Z@=5M-EeNLP7rQiQ#u}ki(@dTy$q$V-nyo1; z4#Rz~Ck*V!q=t|~wV-rXo6s3thh9-r_;%gK({OaL=(`B{_l8hRb(UrBC@yPap+|7M zymF4-xw5QAGhYJGCgoHNtma9VncuqgP5FLJ8T|SO*}MAoLJ0-7{R?n{yQJy?1HHLa zeIuT9%=rJ#Ub>O&x0j47Ga9ys)VuwkL*>GCYH-f^+d6ik4^Qnr2w`?;L5QICfEn7F zm{oC{F6x$l3D11iBFqb^V(Qf|n=}4)*mL&2`6Yrlf-3dDUS!dXvF+rO_*&J*_+C)#UJ9Q#^f~DfmpR?2zJi z?|$^3J+hD69Vz4{efYy33a&8Ky>6^kFkXGJ^RRHOR{8RHdHsbToE*8e{Ye%^hThZZ zspfQ7JXg8D?adfQl{(h>VnrcMm-(!1ONBgcQ~YeBnh{R*yz1FnIomYOjX@5d^&yV8 z%K@KIVst1t-`L{Ln5lI%^@j?@T|qBBl({e!WrcbGK!VQH>Tq0c?_q*FsbB_Ku4m(az8 zD1=E&v~k)@AeoIHlZ8@fW8iKOkb_6dy2kxY5}dl-0t_ zxJz95qy$bKZehq8;Nw177P=y`q>2q?@r1*&;a3lCJ-h}X%K93;VwwP;W`*qF^>r9d z8TKAB{ejLM13C%nOq9*1>2`n4)VX0Lt4`r1J}*;9?Q@b?Q+V&~otYp%lC4k3+{^g^ zW*%UJQRu7C4R}2?0xZ*@{b(YoP~vgtQvep;Z$hfymf5IgrqRuQ+d{!diveV6&_CT7 zuyFB0k;1=Ljpt!SGBk5^rWQ$g{yRb|4xEa&@d(n{-}+NVoSD;_6Sys8;g)4uDDO)U zVFNd2$dMecZF*^7ibBeP^o|bVWS;4GOj7U(;npi$W*PO?Z2V?9o7OH#3(VIM*L$U=-Grv1<)3u z$)cnU8q(VV&Gf0a0LJRlvOYEr0WaAU|7y7`69zPyf5wcX#vk&phKSs((1fVwYY>MB%BeLtvJ14@V8vgGEQFTi-HR z*;&F!p9%nRU%vfq=JzY9DtX!owu`05F^7W9MY!7{{*lR zn4@5Ib|XsPoxyI{z&Qw$CSeCp)Hn$jT19J{T{?)dgcGouO{)fJuBa(WC8O@=K_Z!E zR6&48BXTENiL{|cV@xQiBf@3S{0?);&(`wUn=R#m+B)8ZPzc%TcANgaTxWb+SFDngbLrH5Knn(MDgw*bwA%zo;VcA2tH+VX-4uzBSi6bc+6}jX*AL)Bo}|v z>f>eT`HqZrx>C6z>49O5sT4m=v{70{43{gn8?no)T``Knq`qor_DnlwDQNqb~7F}vWiiuKPO}b^VnfI1g_%#kt;sL-+ zF|+I->z&BLKI%cB3QhfC-u;nOZ<5Y{uc$0Z-I1Tu#YZsXg7MA>x`&_{b%!Ja(*iei zy7imyz$gv(?FWimUp@^4rnrz_7$-MKql|MWJ3Llb{_D%pec^y6aP{CK)Pb`JFq2_S$Vl?;ZHKofy6bI zaK1#%tx<%#tW%3C#^L}NkS)k!yq zG*WV%{NM~?yns?ILqwgkWA4Cj00Nmwt_*u z;7uwggiO(Q(+F*;jc9bM343Xh0e=LQ;OS7%byo>Z>66N}F7oy55mlOqWD|~uS%#nr z$kd}t9M+o3Obl?WvV~Dw=JOh6{R5RTBIn$qQcX+}ukLC#3n3w{R!GdBJ~i+7UqSk3 znMB;!Fz0JYzmXH+UUSo262HSyU*om1R~UM5hD$r}Q5N0(x z0j`VGtar5Adx#Q~;iGQahgz5bHA5how#m9)?xJhQUdP;QN4~*KaTgqH%57aQCo+ic z=}N~Tv9l;Cz*9MdRL0H)che{G(m&;XhKp$Foztla;Sfn9q2941NN}dmIU{Z^ zOgdw6ulH9Z(;?W*Ty;;WVnOcUiXzU-;=8}oZ1z;Zk4bUyBs}pF+)D7Y;Ns3C+*hV| zLZ2*z>j^)S`a@-{=%W5L23@Gh-(ZEmeV6B50vj8J0@1goyhNs0hDZgs>Td*~LiEB( zLarruF>?&E<)88Yju4+(plBP^Q4g2zgGo||qTM8$B4 z)`$je1gTxIMw8^8PIFz_$lpBMNmdioF*W=W4LPH`$im}A;_=sMd{8MhT5U5Jt}0%Y zXsf(Aj~3`;_60o<;X_z<49m3$>*?RBVN{f`WY1w_CXQU_t@ z2Au^#(m(Kzz*pnZQlk3)5`~$2#m?n{(mZEU`4q=#`BNhAA`cn%c1+yv;$DeSiM|YE z2Ba?=Kk!c{-`_HQ(eJBn3ub=ci&5HvSr{5&j3qd53T|8e3_t)ge{`zNlF36CmfRw; z7-&7kxaiDWY8#LjM%LD08_*~oau7YhvW-Mi!GRR^C=V8Fu1W{Hftt%aj*_}gLvQ7KanstB@on1e9o8_!_Y(xNk^Nmaa{`%w77~8vp z@#&)l*SC{{fWqlAf0Ky|QxE2a`wJoL1kE=l&@ll2de>fHE$>T{JOEscWo`txeU%3I z>w4{V%>3^6i2$L>-x_3G;+xZywKoL9g47@rnP*&vtQ{H9}ZX#OF=ulqG@_wfteO(Gp%VuBZ8c z(nB?lF)m}WKzTkzvni)E#m${GY%sjcUjqebt88~+R;38e@7S( zB~W@uszX$n?F`sJI1hM$sy9jAGK0yS?_apJa7TGsi+wh=oJdfbr6SXkk2A-YK3$1S zn3qr)@c!GlV1~ay4iD%gOYKfN@Q}dZBB_b`1`zLw4R;fmcO!r`O%>AA#FsL>3aLe2 zfC=||L&JU;^ApV}&cmpB)^KfjmdMw$sb;e*NM`MsVQ1F}nug z-+hWKuQ3pflWICt9PCDObTd+5&41$VyP9VA=SZ0`ACiDe!P7OYgpu@k=?qilF8fWC zjuSww#cVX}T#w#ifMbyk{B9ou6q?%ZxOkO#BWM33RVl;&kgAN513CZ~d1*Vca(eji zWn57>Q3LKEBZpl-q^g=9Qk7Q=w?mf67pdv3x?wl)*c-9m{#1DVbDh%^aMMR0?J$up zOoq~NeCblcCEwDA4EhWU6Ce3MUiyRtl9uC1T@rVRYd^#Y63*~2(ufivbpf&YE=q{H zh!a)FUxpDR2J4$ZZV@F`fFNa-=EyEyA2uPi;>(b_KkJVRNhnnButQYEyZ&mz$(0&& ztqZmUD{Ap+o%k^=HtYzIX6FJN>#D8X2$5xCVZ%*@rxtbLN_g&A!wGNkBT!eGG1Bj1 z`0r+WzeWuRfW&zB!R|)=An)dX!8mNi!$piBApV(+ON2;eObN?kM578!1u4G80(6@! z=7sKv&8gx~Dp_H$sQER5(+saeu(7_vj{FVyP0ae5&gzR~WRI`Umqt)&Hh`c=-NQf{ zE~4O1?>>)0LOn)hZj*+=MUk*%1dbrTu;rg_S7?@#1lCtXvN^~2qQG+VM-xHi7KS#a zE`rR#KFAn3V9T2duGC3EAV>t{&4*k-O}MeUCcIAE+4{$2Ppw1eIKUqzda@p_-2oyt ztg9U99GFv$m11n-qGNlHx&*gawKcrX=&Fn)jYx#fLL{ zotwI`3xzO*x2cZid%&G8%#+hMNPh%FUFdg&IvNXIThiUh9gn*CuyUk4B*$HT$F5ub zYfUbmR`I$~G<@v?v&k6OPn(COMN&3yHEvTwDotC88f8B8pRDM>gOW{4BC%aB9vm zX0)d*6J~HC+y1Pp*UV1^pEw4JF|XodOm9Vav|Xy_jxOtHJV9*DNyIL}7T%`qO!o1< zvHu$j2m+?(&1h@j-S`;L9|Z{D<=~Kv+eGq7kSqehn9ymofH9kH5Tvqy*K`epB<`c=aUY7Wml-XY)NTai_)z~?`N<>-$$ zgDJQOjd>a$Bn&PHiG)uHHM5*_ji)9*6ts*+edgprKam)yZMS7f_uz3{=09>~A-|I( zv=qxFrA}*?C}3803eth2@>D-C z1Cvf1nYF)pm%^&O#3Y%<;CJUR%V6|j^4#TpBnmT@V>RxAjuB5l%^2#4WV*V0c?z)D zBL!%83C>ZQVX@3{LuQ-@{>~0z41D5t?fa7zsVCcaWB$`9tCK~~Q@=A+q<0|s%ZaX~ z&qfjBtr0)ujdYaGzOOm|;e&FRUZVgZ9f!^=%s!%l7KTPT;CNASl7*HH%rjbcq6fLe z+0&RcdB+v4P%Y{9w}y?5a-FopQHi_hBNS;n{Z?HvgHoP|$23#Ni*K&zHuH0i6Cj^} zf(vpV_VBiG;+Z+;0Nn$9?oGn0YAS^<3GHJ6TWB*s+nUW!`^MRJUoYZ{nGIt*-|C~y zMEf>h4Ou6GT-T*&=P<^=DZcWePD%O|Uv=B~*gf-e%@qn}wf?|?FYhRd&LzfYk;UeB zXPFXP9Ff&YkdWAT8Gi&cE`<`{Gl@%J^9PHwq!ApAWXK>o7{WIHaCXpsI6Jm;d}cqK z9hNn*AI^^94`+w&hqJ@}A7|%AFOH6|PBZnW>8@71Tl^zo^Zu8s%6reBU8?f zna8i>*F=@N&e5y0XQZxOzw_8j#NM42dl*Nru8xQ6o`-HrMe_nc)PeJ%+~lu!M3-Xd z2r)d~kxu(Y5dKKZTI*}gsas}WWhYRdUw^khUygv*yY-gDR1c3o9rjd!DBaI9H`#a# z6G1nC(2ZbXterio?hH@c1CQ?Enmi>d1E0p2uI1g@e|Hjf)=2@p#jEP|+}a1_PN41_ z&E2uIH$Rl|g)|rMU?Prlv&{L^C_KBEg~kYGvQn5cArg)Mx}D(a7g#ZRMkD|xT^H^c z)CUmVHjqmswgS=#g2UO(-P1gzCWVA&s{7%amWgT?=OmvcU$iQmddvAMD>A`V{8TPX zFpcs8o$tkeJCd-vDgDNAhD{j+!%zwYS4pd?>OaIH*tD#};UXaFHl#;QV^FUKvOSIn zso$zMv%*sQO&u)_OsxlgaP5y;*JzI}+zmsmaUf*`xa^^izATW4d#;PGufMQipCEA2 zB%!&B&}N^PFRQ0@DeD!&_h7hpgaV-GfdY!)(@E-t+Inik#{jiZxHr z%Nm>}ks4Wa+2IiwIyKm#Nf<_z*kd{U4r}|7Hh$Gw)Ge|1Eo1SV|NfH~;b=EbQH|x* zxH7B}IIg`z#gT55CB<UwMj!mmd7DJ<VoydWlKgmG;IP>?2j>TD z#ymsYME93kgJ|qm^~!PZ$yGvjV?R3SdAvZEpZC|8CDs?gpA6~KyFq9Vgr@Zsh!~Sr z>-MD8o1yc!LVUWtn2z`DtQrcucHAo$Y$VK&-w#>5^NY6*JGdm?uKG@B4}|tB zg&e$_*I+CN%iBYeCG~YRS~bg5+^NJglLwx*=m+rT-XqiBj9>5g^px?>=KB|qw;52w zf3ffv+;DSmZb1vRZ*SKzE(UzPUsHQKKe)RY^~|S@r_MBW{iPJKE^>O|y;=Af zTsuDQE`G&Zi=%u`6Wobs<^G=Ni3?SO#?6WPifZ}(0PcL(?2$*Qpkd#&=Z5|3<{@^% z(l)og@5Bd7_weRaH`Q1n6KFirn8{sgn`BGwTXwPak1w=S_tEFg(r4oBo-TLfnFkcV zv|nUa%@;4`p(&ai!nz&M6o5e7>iRZ+?23$ zX8({fTF-$CCKtaFo39R#_*0CcFJs z>blf6YnI%XG`Gm<3HKEdDn9q?()&Q@_4x25jSUYu@1tkq1(vC_4bwi_ddM^vM zyASjQy=Cn!{KQjfX-O%c!Le&!Z|<1lG8)4#iEC+&{fq~6v*LLsCke3I7)7v8_>dj&(%d9CqPv}Ca;_Dgs$wPE0wr|sM z=@;}j{9Iru?*BGO#`OOwlg-J>@&Cwv#n7}md*{}kngU;=+>juE%*D@+I~x3c{WUCu z5CydM>Pztcr>5dM;~Fy>rQaUsU8%O5sJ(V;t4rGu>&`bd`s@Ck`s0#QOAMn>*XQHx zn4X@{W;I74;?p3u@ULXlgGzO?mV(tL>xw*`@8{xV@8|X1?t^qkh?--#^dH^cysF*N zHH|hKQhV0@f$!H<-=5PSNBP5_2{KOYuR~v*mv^+6Nd)56e}7Xi)+XBaz873u36kXx zi<8mljf*0Eap>Q^Kce{;D|LO`UPEneDfAtb25Q}@wSTjhD z9+P_(sp_27>#DzF0e@<=%F#dky;wO{L5a+F?Kij#&v&^Z4VsMAnqhsc78Y?VCBmdG z9L`sx=!RU;ti5wC7OTkZxyJrPwba-M_HB`g3Uvr;v&>_2t%~bM`r{wMxHRs;j36i2 z)iC^kTOM^nn*t)GUljtdR+}=6vQo6vXR}@I!DFPn7r~R*F={uC(}a{5p2#IZeY$|| zNe5fhp;IH$k2Y`apl;-|o$@nqR-{%`O5#AE6PGq=6*MN^KFU31#8}J{3Ob>sSdEIm z91Ey3V9cspVXO8C55YA=0i!)*WCKGU93Yj}s}6g6c?+1>vn^O~3op?&RAsHmXGdCI zHU|vrC>26-_|7S1#p)?W?wfhhVX-Kn@3Z{H*Zo4)ax_c+VpoXX%Rr~N?r!i*6%7!I z!#_b9VGWclv-m8&>jWy^T9#Y_Smdph0O^GUp#@OcNs92}+1MAICZmL=|1=nkBZh?? zm|7H9O~6F(LERgRxu)Jc^LiU_B zVy+Q@o2|+P-J{}#oMlZ|8^1=dwi6|=MWz)aP|ftKmRA;HEZDNAw^MG#rpiZC{9~hv zt(Sse&^4u$!`a3mzM9zu;v5D}>pNsw@#0_QdR6GgB-zUG24gOQimNjfbMN#6r9_So1&v@ngxXS$2?N4# zng@49Y3~%|cU3;i(svY=^hzO|z2{?8_O%2r>}?9tX?qHPCd%f1Cd%}VFUh~$u!7a+ z$onydy@t>s|Gd*t81gmYHPPZ_9+TCJciIpxODXLBB+h&Acbx2(9G(|IfBG{oj-iBwvS&MNg0R1=`v&{=v@mk5uIE!FF(#kD zd=^I4R;d3u)F0r~Xmj-VSZ`$nnNN16-{CYVbO`y@=_FD}Md1$~xMfbtm~qVrHMrHg zoL?8j45J{H_D4?c01vEvR%zN6k0@B9$Ws}8o+ZN|?tMQ$O;|h1J`@+WXkIG*rt;xx zIbz%F!(Klw(2wZL&-X(2^;7=gHW|NN_Nrf}AQ#0Ig~n9rJeLw}T~&fYj0sg!3`2|u zw;Ur{2soMytv^TsMLC`o#J+AhE;Ptq4ej}oED5+R+Xw?&r8!d0CqC>ou_nORyPv%h zL`efabq$3WtVq4pEGooIrM0!;4~;6lfK+l^?M+$Dydm+CY%&9rc3iCTz%&DA4oaa) z*%S#84wQo9B51H`;fOnx<~f}jZ3bUY&t;N+PlN^Yq%f*xb0E`^ppZFL8|15g43Q)`Gp>j-RvGg|f0KLw0$BSlmOKDT zHDbO`TZ@UGP$wR64c$r27b-BNan07edx=LIj#3ute4pAE0l1E+^hffqH)~&|15>Cw zi3#9-xg^s_e1n7n(O|Lih_L*vO9%+0(1IeJQiaUpAOWX{C2(l7)@3Yb5o3eh9IMEk zO6Ot>vaeEla!Ta1S86sy%v4)tOl?dcfLlDzxv!l)i>!r~r5 zR=SnzGdi6JnjGpfjkz5n?v(yXE*v>Da-l-1mK87i<${Jh@+=x3d%$vjQ=^YvZup5L zznq*Fxg`0-Ki8WwL~TwAXWCHPl|7Vr2RGi8NikE%BZ(k`vvCkED#e!~gcJv?91c>g z-4C?tME>uwZ)H=rqj~lA@|Y(~n_c1GhUPl+UASMW2NAMo3(keAA?}g3={&N5ga`H%q^No- zXrCxqUWQgh56Te77EKS&FsDk(%4Dg~06k0(yuY}*LhCiLV!`Jp1vnx5)Y)j_!F#i! z2Rl3;x^P<(IA)H-GKGgU6fuJ- zK$6Yi0duVwEn&p7bfp`YY9*_^wPC~sNGTRRt79bdo+TYacnKl7W4nnH-YLWSVylQl zjp!h2j@8RJ*EpLNzGAhIn?_$ZLzp38!7(MtSTo?nDugywZ-7Fec}E7)G3jT}Z4=D( zLA%W<5u5GdfDe`}Jb!aZ679|nJ#Fk~_Trt%*0e(7skPu-jhl6><>1Ey56VTjaOad= zP0gvK*N3n+w%&cx?+!VDCt9B(Q(wxBat-QLdX|dkN3OsV+^c;*2L9@a5@>lRj!7qf z+Qp^`JoR(c+eSy0+*xf$mQ=USD8CyNHz!vpt*?m>X`K|Ksn4Y;q^L{!vA`qs*7o%c zN!k8)FbP~<>_V%q@Gj{l8_snt?2U7z&uj;h_*5z7prZ)vs@jSpDw0cg$1eOPj@rI; z`>2vtc0FwO7q+GifH-+`bBSvyG>(rwZLg6%giPtMINBEp{HL~ujHr=0bs4$)b%@)L z$xScnV1@$UhHpxb#T+X`9y5-?#PKU?yzl3Gx~pe~#M=G2>51}_*JfGhq-WQYLQj3T zuGGP3qzqjM1v$}{PtVe;vcLhX6-P^R}(+d;)~X+>qv9s(QkI|grFf@g>K2M%XwRq$7+N(jw276$OCs5OM{7tn+#fK zfI0@0!L-R4McMBaBPEBa9OD?D0h#&rhG!g*7RXe0$iH_bmleyvmfaI!Kki@#J?%#c zOJ?ARB|6UMnP-5M!ur~MkXeJ!6Yx*Lv*>;hP$@4TxtnZn`O%dTL;+3dWta*X4>2n1iMT0Th~2XaS&^*QlwpptcE_&%{OeuRS};F9awnIo*-c~|I(t7 ztH8r6g=WF+Z}y{(i_>9|{Ml}Ye!(Lx(8w^(lx6}Gy)~9|f^K)ul2vfm8RI0PjATst z{hqesY+*8T5UY|~XlZ~vu%bB;eP4QJElAe#trB*9@DE}&}%Fka+U zbv*yNiK|`YPqTR0ECZ-eRAemi1yEK{7q=oOuZ{s|b)5=%IRfWwvf|D3Bah7@>2O%o z(TOl#$YBn{oL5OAwFs)-udPm zF;sKGJ4%0_623gt2akR;`wbB+0UtH&cv?!d^pYFKmHB2K!b1qUS|2s^=>EP94frS4 zw1Y{4lN#y!jJgpzIo8V;r;se}ui%u$g><3wsfFRM!!w)tbE%CZ?ju*OQ=pKyi#{`;G4GiE{gpg1!b(rF=5& z3hVt{I z0|ve`lFXv~@~+%HE$C4?&rtKs*#o7a>7(OJQ>FV%HOMlM>$(4_2 ze(YEKcKNDrVE*OKE}jI1PPys6xB=ujW&H`IN^7*Oz(MM8Kx<0-Um*~JgJHKD22z5j zf72a7^pPTqIa;VaTk_cruKUK^Wy6W*jwiX-&CgT#-R;=>b9BYG^9M9odZ|O2L@9bX zNQT)4UbQ6!tZsFW+Y2Mwzno4M?8p9voX%F|?83(i8kaaI-I%@oeM>ORLTGehDDS}) z#9Yzg*xmH1J! zsZlYG{kzwE8*L?M3Qkm-Dnt=+_5nyr78a@FGQ}#W;#{b$oR$z)&s;)TD39boe`>9s zl87nt`~`FD#1ZV4r8ujp6t%b?bqiFHg}V6Y(6yAi`0!LfQ+4Rvr3s_Fp+@(06H8Bc zVcA8;DYpHr2l0J^8MKp^7ngXg38_X}$V1!DEpB>ZEml1sKh%v)b8O9%@$}ftWp%T`XHQG44hnH8uLsj(1F5j~j zZh#ka)-hp8pgUwA-FL*7U=PW-y&#cDnCkGzF1Y9I8YM41{pw4ZxuwhJ`NPcJ0*NJY z?i#oytu-&NRaz-d2=6LaVA@4(P$`EO$n&~4U0cT)+ucITA!SzLwiIeqQrmR)38akh3aC zi@(4wpk6~Vg9aImyF%^Q-F_nm7-WNFEJo8vj7K{_%XrZsaTn50AoFV-GEzE`yEa=2 z6GXQDEK2v*^bxIu>Wj`I2|c2t^<0ehv7~?vTcqqM(uD=V6d5bweo@M12={QFLtE5r zknYFEJeT2{I0_msx9G|!hSbORF4T#wKk-~$-qe?48`Us=#q&ueS4PR(y|e5dmaRQb zbydA+xK_IY-C#ab$#Ol`G1mNK8v?|^otf?tVCw(!7HD{*UeXGFaL68ecFS|XSi07t z9dL3@ah}fD(FRbD1%vT1uv=ZZ{s1?8Fx=2j9d%$6?(41250@P#oOE6Pw2tq=zVKaN z(hd<)NS1N4!wDWj zzPS3g##X$Tp?j%-Bs=Aa*M4jEdD?BBk!c=}%&sLs>`J$c%x7=!ebO%1v4=fVVjmNp zXX-V^o6{u${X$LqJwFk4&TJzoHyhR*3Mc6&0?8bAMcHRdUO@8E*&*!8Ed38J;U?U+ zimO|jox11-HwWlyoii4kIn4ChxAm>F>dy4@x}{e=UGTY3$3gCr2>KxvAqPqQyzL-= zyJ1fe>7Bf)cNG}#bJNpnlW`79SJk~u&E%=4cgbj2vEtttl=1ow(wyP}jhVk}BTUEU zzCC%}WjbBq^JR7)@Ic$7Uu*6q(+c|SDSICB=w5%|kLC3{@2)JwU5st}>i$mVZ~nJj z`Wg<(zEjPDN_K42$@z4?zMCgeS~HQw7?U0S?nMX3c&ndVFGOl%jOgJ!cYspSud&%F z;OYOVr4Oy8DnGW8-KJ9S>enw-*y$Cwjw53wWUgoTZ`;GGkDtsBH%c^le|V8}6JUe| z{dq`xvh>Xd6p5pJB)^)#n%0V_=e6$HsV}PM7pA%Tm=SyDrMK0FxJM3SSKGYwc9qfC zRCnwNVD|=#G@d1`Cy%81zC;GD(5h0Cf(;n^6hqkugXy0AAMnoyf08nfQa|P1wJ$McYPzML9*xO}`du z)-@QNmi`ZZck?i08140idKc=O$}*TXVX71-d%v z*aJ#UzB@dy^7FjI-8P+pd;=)8=`Q+U8va{mqir6dXVRg+<5M(SfOM@L?H;<5tc+w& z;HZxExa(`xT}IZa+%qaW@0Q$jJW;XnW>^plJEzkCXUUei1Bb}Aef>BiTJhEE zbW2*r!ruh_OM*TXt-d#Dz;hg+)#w=xWr91~C>36**0W%X)m_N>If;vnT%1jPI4tSH zq-u|DS&d|~B}r&TVtpHxs6ng6|4e?60DGN5MTw10U|WqXJ1{51;2Iz+4VX@|4FsE3 z0IcTu%uTGz&FPeaFX2Fd2d3cw4I;{fv@kR7yQg0dN68l#W?x66qz3zr;8jg=%}>xN zd4AKZuS;pYe)S6$t9&XIDu0i32DmKZ$No&V!L9l+^buu9CnYG0maRw~9TJ7SZ@rFZZCMGxV6^D{sQj zo6NhCH&Lps5w9dCmHG+uvM>0gvz62f=ULFX=M$~6Bv(U?2IaTq-<0deKrrhuZ&@l@ zat+trrc-eHL{UCy-g&L=$#DEVcZIlTq&IW)@Mac@6Y~cCLmw;`yZ7YutXqt6 zDr&ZgvCW8c|BwL_=<;jBo+TgHidUq2{2d4WiT%5W%Q z8Vto{GE!$Z$f$nM!ADS5{T@gxW@xPnQdV$9N!9*!VYy`qND9_DnDd)00JA+^0I#%7 z;dZ;)9G|quVjRDRxyXXdh_?R+gDJwN8=X8=PZN;{KXEQ$_kU43ml4`B2;bwH@1kZ$ zBVMI;oQtkirRZo>iSgtoE+eK|{TK8bX~(NkDc>R0qt<17M0p`79ONpwfFn^cGOqVD z`Up>9!3t*ygmp>#=tRUS7TE}1pQuyPb|#K$pwh%o1-R18g1rLV(Cot^PV zghSkTm)Ghwr{Yp|{PjRKCu8#)x&}@XRD0t9jV}mdG)WB6ig|AvCc=#ygdF3FQ!^*{g+f&fz@T_ zPOBg55jBe(cTV!kKFuco*W)p?;ZY)Yd#!L>erw;>@`j(VOus#qk*>@uNL`AUls-kQx+lHbJa=Cxy< zspwc+j=e^vrnLvLjdD$ETNfXT26%P0y?OaqC@j%GyZ2Sd<8_v(ttG1JOJY^VlxLu- z$c#KJ(`sN&cH))c4)ASS(@GKd^PQ226ttJl)bU?9sxEXbqg5b6_;dJ!iV8Evm

zwc~H_pYGi4R(YdG+}YhZsw`-768Bw5t|f=`o@a6Kmf>k@smvoMC@bseuLXQEyT;LM zBo%f8e=n-`}r8 zC3CACjl_+1HNa*DF5zb z^c8)Jy0yg@Z$vvdB01O2(|*Q#`pR*xH@}??XG}pEfG{#8x33KsKiKJP*OC(yPASdq z)-*Y7XwF@9l71#mRo-A#wTds#Or=ZVD`Zd_vLFSvXxrla277bN9XOu9+dXP!zB=g>=l`YIQv|bd+CCz_pwD(dkuf6|Hdngs0BvXG2n| zjc#-tB@gJ#xUX;u#{`MY#km@ewIszGO1H;;&X%&Diz6C3x4hvx6a6DQ0H++85lr?0i=J5dZqHhvMM`6MUCUeWZV@Ew;f zftfP$wBh64O(T2i=d#`1W77UXvmbw1wd-aPpr=>02G#ZVX*-G0JsQkBf;(A+Jg2(< zEcX@&XzVrsja?DTbpAUx7d5`H2r*#636eEWCw0GEYofI2)<3ZhF|zz_ly1E7;q6zZ zBDdhc#1)(sa>D4uwx#%`%*yuHE6n@*Tk7m124=_AH53%DyXQTl&<}X=WRCWDqZ!zF z-ZhrmTTj4k)_M5#$%hZ)rZ0Jso|h-TapiYy7e0R~6l^2u+M7$M0QGfi*J3yx1sfJb z96#4ypZlQ?E-&}0EvWNM+10mUpSCAJCjMcc&Y&Dr5$+eVD0a0RR7#(2-Hwc1Hqg%2 z5Nku5HAj0l1XT|Umw-!bhbq_;!&+7dr8|KMVQr%0OvHyiuY==|~;u zlUx!m(na>!fDmVv34dI_Il9At*t%F)_HLFlXZ%Y8doy{~ZwzwU)zbZ$`hq+t^e-{} z+;VP^<0(^8Hr=-q0xXq7hb&$BFNmlklUTlYwKc>sl*cYmK6W&@YV+{sxn@Q;|0kSN zjD+^bPWrk}pn`9V#}JYEQmDu}t}kin4|tw?PP#6Ql4I*Xi|JI5TcdVbZZeqEDx`xcV+T~3=*+$Ps?&(_K{!&Ai0 zjF7HDsoB2PgKs0Rp_YyA!xUAHc?<{}*`$@N53D(~Xwz|fsH9XU?E!eyvS-Eq)%2w8 z%eVwvjk|3H#~g_7S5xPNm3#_RF8O?Jj;Pa^v6HfY;Z}XnP4kc%-1;YdUJMiG5Kw7V_$41OX1}Xd$Cc<&yh;4cEn@nSBp;*&B@O+BgE@f zBr09kQ~dd_1U&tYmAz3qszaB9=~CnF?zXSejZCtyGKwUDHybV^yoNqqgpE|G-{Tna zMrA(uMFXuSb-lqp-n(63Ugz>Eb>)RqF~Au72W(2GUCMt_$z$D(UO0WvA6~iu;+CL5_*>-{ZrEG#W@ggIP*F9&hB?L+?&FwtgmL zb>MK^cA&td#3ok(X0Rc6J5=%0b8YQ8mI;?=MZ~I@KdRJnz316yjtP0QmJ$k(X zqc101Qik$>5kHfs$HeRm-Kh3>n<*0b*_WZZxi zbgjzB)GfT;&v5rO=pSL2Y;NVxo`Kx0(wS3*UHS*^0KI?$QglqP%8^d*UQ49;%5Zp z9c&$(wH%+A0{7m9x?7n-HI?q15x8UJ>hb{UEbn0F=wJ`EcfEY;jDVt*tt-^|vVfxP z6IbY6sHuY)AXXJ>Zvn`?B_#2;4;fFuv8_GMp5-Ri6cI0&s>ADT_#nWZa)(l+PgYeW~_~Fw&|nHiMdQ zjH2KYX0PCNvK8-2@WdcE+{qF|@eHq541ZVA6lyv#rcD+(IGE``#&n&c`0C4Drm@yB zeQ(sKm;>%>cu7X|tk8|UQbJVTaWHJPkZExg`e{qMGN4N;ZSma~b8!mMQjF!vtN3Potcn=VKO_v;DnQ=3Cv8oJ-GwYJO9Ct}n7jOBrJuAuY*3^~yq=upPDxn_dM|P#_=HkS>mC zaCbgvU9wv3#Cs+@e!LQrUQ#X&Q|`f`uv)EygHv5}q8ZH-lE6I9E$s)!O&MR^pFd0S zOgfupy+;X*c2cIGaHJZ%wAd$gi?UNH?QxYcjq%C6+?sgiCKBIWt>btwW zh6l}XV<{;H{WqL00&!#`N4^!hapW0vdp|=~YHzD819Gsx63UFQKKl(RQ%Aa)2L*((tM60gorcDIPoR;~V_~2Uhnq{4Sytf67c7?(*7j zNr0~}AB^gD?Y9-q^?^Hqi@!SWjBl?`o8UZrckzA0ge0~@v0Xg78x8ho@9(3H!LY(n zneFYR^A;tXwbd}8_1e1=z^T%D=cepl#Q|!D+&8cqzVSWQi0lJj#o2E*G*0ite1NCF zhZA4GF|LN0QR547c}Wf>2(%?CA)UF_+l4k|RJ3W5FeFYW2E$j3JTD!p)QB)4i!{T& zdv6|W4uB`)8u;cfj_|J}(g1@~gua|fY1nF-;ez$6=7C8vPExOGmaZ3JTPK`ydK`8`OY^jFlzV-=bl)GnEFw*isW?KFP zmmlNq=*sbfFudR7&bu$;L-SR{Ewj-e1FEGYTUwVYyf{ zBLeJJ57Ic(wRjzRhTop;oJ>i{)*Bh)de3AVnqui*GLMS^@u`UijdQ!n`E~+-1Q2XD z%C(C=1L_#RxBg~!1~d63>A0k&(@uvimpE<0SwKZeS2}lz#;v2l@f|dMu{o^P*tyTl z2AlI+CtR`UtJD+n$M}LfpiH^#x`|sm)iSJJE|Vh`z*` z_)PKm#NGL`Ia$TbaFYe%39mU#orS~*x6uqxc$D+~Iq(QB_S@;^fJ+hICI_a!wR}ge zpolyc+8x3O*20x$`91|gRPF1j(`NaM^nHu0W@BLTl{`>UGQ4pi@%8SkuN^s+Wo9Ek zsf#KZsUik6Kl!AwUy{(}oV?95^IF1MeGMh5D&FHkQ|cZz;&Ubgi0#^lLXVC)c;{SJ z{0NVJHXH~KHN~PBw7ai}v~W%k@jRmb;6~#6>s$gQH6{{3ceur$uMfBKcfzozXfi$Jp%>+GiAoqrkhy zr5dob&XbizdrThdxwfd^{i7O`wI|w}XTSJSZ3@(gUc!c) zC5U26(6ij{&2t!0u?q>mjH!5QCjp^Yk<`KdB4tGx8HBkp7)w-HUXb@;JNjy z-lki&KZM6>l9wl_oCmQdrNg@b&#-lan<_)wb^N0eOP#o??0}2fC2gkT5>KeR4~iw) zR>kGM8JKIcG|sjA)aZGe%xGhyE_OJbIJdz;A@9?-M)XIWoQI?)4%WDU<-B8_Sen=l zp#g5bn9y!sRuQRhVRxli0G;^(*}H&<~SA@+xg&5!6V_bS{f8sL$h>z-3Rp^&wnC0Yv^uVcnP?qNf< zCmWS?$%JgQxV<{me-Rv~P+^H00UmUpwBKCA?O>_|d%)`jadyU*Ai!vCuT3AuE-TbF z!gq(XzYufKGb>rKlE_hdQW5Y^lP2l_e7vzMm ziBBxd*UEk*6ir&XS;VZj%^?vHl&}q79dd~Vo3EI!h$JD$qzPm<-am~5AuI+imHCnO z$-Gi=9k!#BG}w&OTcxVraafUjxbP_i;ugzOO}S38P7=b_=jG9%@4nzHvgtoF`()zu%Uedhz8E!6O1Q_GE;hwQy1OTjG4&c2`pCm&t-C z0jGVIu9fK*6LG#J>52`{jJjI(%*$lK2XJrs`uk%2;5tt>eesIQHXUrA(Q#hdmPU(R zXqDFk{DGt1aBzuioDb1OZ$iB}@@uYLR)8hS-@Fr^>?F0Zcu%xMft`CnT1rl~pb2%zkDBl`>mR>q zx(Uw`g-v95ZQdz)yw#N{CDj8RSWDq3tkhY#s=nW9Hs?Eho7|pAzFT*HF?|e-d(tN* znx8v@K?Lmgsd(flYOU}CO^oW8Z zvuDgez~adlO<5v|otFkhAc$1ARyt;?tJz#Z#Vs)sTxE$$4$+OzKFGz9-)Nez47JQV|9HP+d25gZn_-|F zS7XSPav~L&8BwHogo~R-G9TWn;S+q%BM!K}zs2$#a6KgeR%z{1W)}bLuZcg)!iy2< z_wcZ^X#Irc8=PEZ09k*3U9jWBl$%|8ww#gH5@h<{Zt#ETv>DO0{RR83RkRK270?g5 zT-*tSjhFiVE~&?Ub9rwO)3MX%O}0gQukAEImG-|aekW28j?LXBKg#OBYI57;F@kD$ zs(0dnyX+Fjc2A;em-Z)$;NvnAr3Xg?jeLCe95=V{&GEHrhYlh?vc_#Jem*>CGGZg{>kff#?aoZNnRAaX6ZivbI4xb; z^cSC9?J~^RWJ?bc$Jy)@B$^4g3A>c)Omwkq*gnVBqA>gcJ%1UH=O|~+60kmfg&?f7 zPUxeB27)Av@*$4bfCx1wQ=3{XpkvRjbWlHi3%=XAfVG%uiEHjO>I+3^O@QZaAk}84 z+*uE!xU<#vQWGMu!pCNI*g>w9rosGMz`_Yg`O^o9wVvzmHTt%?&n3Y?O}(S1H7^QO zhq2l%vJ$!$!^mI`g3Cz4J?`Qm8`Orbtf0_bgSX9_29GJF2H1m*L}%^<3DAN@c_qBF z(krK&N9yFacj%_W3>|BySsEzBYi_bRC|^W5N`IL=)pACD7g`kdz{x(Ci#E;W)+1+S z0m9w=d*1Y-s`aTe#0B_KK>`j(-LoxQtUh{g>t0#lMg=b8IbgrMoq2JE zYBF7e+t_8TSyb3uiFya-niT&^Gutx&@5P+q8eO&2+u=zJ2?)Gm2? zgoZiz`v@D{rj}H&Ff7u+^!jBnPvut1IT+}ZoQtWj_(o~8vR{RyJ z*9`b8$y$3-;U37e(1GoRG!F#}w8jFDQzPvIUH}?TY*fRU+*Y0(_l+4ZZ{csMSE*e+ zp!t-rAyJ5QgOJ;6R-%^gf7IMY;p;U%@Ic*NQ1SfZxT>#HXVmTi^SrSRL%lZ6Y!1zv zQW{mbMYR^ND1(QYo4 zVCbe0^_lR1Zh_L}sKV+F)*HEsol|k%lzL<}PNj0l8`&qCBrfna_!P zWZS#SacS^`G$1?j-i;K>K6HkVkB<_Bh^1{ow1}Cp$CR%%&8Hd} zntyie|9Snt4x9NuYw>O_OH6qZ&gwAL1(wNSH1OOroLv)_Q!c0tL9>%^~aDbi#N`7)j0n#UW4(E{~v zGOV3Vz@1obtnwIL**9WzBTjdygqkARXRg_SuNcB zxI}h*(~AXZV$ctgXAa%)tn0(4Rf$pE>KvP{rY@`QEozu7sOxg)x_L|1c#5X0npRn@A$2e6=<-UIBX1mCJLGqj zG@x9S)S+a2MVGx#;1zxRbvRSRodKq>V^YzblaGpHWmnj>fXe)ie94zJ*J4UZ37a8f z>pE@zz6?$>ls2?Nb=I`QFXLU!r$=+rlrmzo?&z9Wja;#NQDUDi0G=M=!zA`x2&%6% z!j_HLbXcOkTJ%-wn}3k!E{?BQq1&rHPureA?&rBbXg&)@&$G$^e43|Ni*C`h^{IzK zz`?6Ruh-DvwStlKl$-jn*5s9h+Lb6Zi#P2j^L?jEuf>3c?NFI&#p{P|F@|;-9)v7Jts{90u52X;Db*G}UsG%BQa{*qzvAMUs?Hdv5I2kA`}c|a(Ru2@XsyEfn?A{0ve=BR z4#h^9Oci%lPji692|Ec}`jW%OF7O3go=)?VyKbi9my?1#l%-=%1(L$oJGcNmy9rB) zdvusD%5fdy13t;{GN5VE3+_Bb2HlqBFCFh!u@-t~cpdYN%U;Kv{e2ARNh-%Rw*0v6 zzx6c^!!VOmdiGQ?4Cu&)wjcdu@UsW}m`?{Kkm6QacI3bGq@MWpfb!_G*|>ju976Oz z`#6N4;4QJ=pN9|?6#bv}JcQ6q!JEQ={nmAyO!g(+{@J~K$NJX~FFVc%2>Q+pA5-i( z8`1RijT3vM!zJo481e4&sL8^P;a7~%sZZ2G0iw@uJ94$|KEezcdepdT>k?{w{rJN) zP(<8-Qua_*_TYHc{x;=*`bhf!-3{WaH43k)Cp@~7S1GTKdHlj>dX1=FK|*mOMF zA(RfsrEw;HlN^cMTX+7Z@(e#xS7sb@N!bOWtikyTn_1f!0=gEi)* z(WV464mjWR8$+psI|SuJzBUCZ)urws z;dE8VAla;Fp^*posdWUv8KZ^QJJgkBN<0o%UQM1ceqw^itBG1j zhsJgBh1R{8!G>X7>l$gJlq#eyyxNbU%5F2pMLTzYV-Xs;(>i!8cP@&INI_DDS=rLBXe(|Mxf!uz9*_$&y)9Hx z?L}-s2vj*gs_^dBhHXoQWq2bx4838^R>lH0O}T}M5AlZGPQ>PkBOGs?c^CZltvc)S zi0?*)U{zz$0>+kEV9Z!+e#Xm1^ZxZShT{w9!nb>irADjjx^1p3atB(nf}@Jq?`LMf zV?3g1^kRf4RrSJ0R%iNK$4Uhh+%~N69K%nU-#+hid(#yA*88Nb#4x!2d%WRxP#Lih zwhtMyc*DSf6q_r#bQ;|Yiz``aY}jy<%s4abKCV4ty1M(KvUH5CX%fwEepEgV%DXVD zJnEA7kwzP4{;)@VVr^$Vfl!xFiz}URxe<+bt4$lyp@O~+r8)3}M=geo%&hA)QnSd3 z8$+zVS?}>+RGh9h-?M>y5;(f-<2kU9qKlzl&+^!Z9GVyxs^S_inrs^Bh_&p3ggJERZ+mpR%9kMiuT*s~| zjAo{YE`Qo>uZ&q+H+EqmFO^jku<@^~Whs8RvA6M*!THOz0WO!xcfHB&<>y@c@S^75 zbkdO`v?<88s^KkOI5$7!VPT_4B!8|Jwp@Bfb?G!Cl5#A73H^q+LfV&Lsxc_eX~Y{F z0Hmtu-wU?b+qd;zIR9FrB4h_*^hAKmAj3J}z#|>4Fg=+EW$zZ~y z_>CN9NRbps_e31!9u(saEo1{^2kMu-VVfcGtavhGh$QQ(sji+jn?Q`=6=B=sGVS=7 zBpqYJq2cO}WnQjRKf)MD^bOVOm^DV^(AXyiFYCTQmVLRJZaISWEGMKxSE3Elb-#!ve#{am0s4R);7?_ zTwxlgx`yv=?%1m;B8f-d&R}CeI=pp|voqD(7DB`umzx^9kk=MZ=Hk_jECR^A;TyJs zXMtJ#@$;IoB1WWu-c;QGKmX{{A5#AI3jJ;VVEf>DQ7p~v!x1{IggMOK(gb&UxikRu z*FsH#GoYoe6zZQi_yr0`FP{K!S~&$>(uXBn37!1X$`J%OExnP+*$nR#bR&p^7r_V^ z_x7U2m)9}POht?lInqxVf%;;Qa79Un&Em_`TSbRL%Il|8wygB|SfAaCQR<95#*65` z^7H0ryw_b`r?o#3(Nr?Szn1*$Xof%6@HVC~zoDuVtfJ=o`)7v&aT=16M> z|I|>-u5ed}jr$HYphPfCAySh4cZp3o_s+eJQ40B`0r;QV^jvBLV71%JAGQnfYTgC3 zu>aJecRZ7$h;)zjr;Y6)^ylix&BX3SM0lQUOeKnzSyF9?k<;pFIUO!Z?F63X?5;Q2X~3Zch&mo?cXD&Noy)q3Rb(o zCUzff3&tu{83UG@bK>ab(7XuxpAKzezlxG{AG9ro?czXv)QxyfB?H0gQfJh`x21&x z75){13C2hJGieBO!_8I}UNcjL&;nejf1g*OyQGyv;isbtPi1CA;3QV3Es3@~z_Mt* znq1v&&*sl}xC+X1u$91=ZGNp~8GcJ+;FW^=+RHWx*@piKN%|UFrynPL<5Dl=}*R3ywc6pUG-HV&npoiW(^9HQoqlM1S4N zdefFIvpqALwR*<`!_#cH@F41&*N@pgr%$)0+d}@v2e|#se}or0({!VaIqyIt8JJjT!A^f6VNjG$dzx3;Qm)UweL5;st`#0` z-Zbo{7m+bvRXm|do949v5qrk%StG649Aa9|abrnXZ1a0xHV;8SOJqzxv@KiFZS^#P zfJvl*ID{zV1CwEF%E`H<(7g<}|LVmCyuuM-2;U6p8I4YYWamDy9$ij4k?&bZBWmGW zM(z0ksuCL_BfVD!ek2JI046oXNbGCN27|xqoSO4pyFjOV01*jssL?i-m9CM#+LfjC z+1a{9w#F|$5(vLnjgEF9_wb~x7gL7{;w7{C+OdyhKx{=+dv&s9{3cn@FzZ-L@TBt_ z39lMahcJ}VqMjW!Y5*V!+_onh+kM-j8&s?XK>ZcG+^7A}x<6v)vO>xHgN#`+voq}U z>)X^0ZAP#`t?gYqhW0*|JQm~eG^+jV!zfeGb6T9A#}CBQd+Ul?_L|q=1}n`L>O-nK zGf$D}ylbkr^_{47`%MuYPH55md@h;V>e2%D=*AbjILMF1kD-6qV^1Jh6eqBNKI1t* zXPK5uK+^{B>tNQb9KHOS#a&3_7J*@0gUkE^(nGJ^S9)`l#@maOrORnX*P!=8J0n8N z`C}5xP;HxbkapUlgdLx$$f_nLoT&B9!y5>69Z*AfWR)+bnvKhClp*P8jxBW?|BC;U z9FG>XfW)N$GX9FnAd3B+p$LeLsk(6ZlXy)XKJ5)Z;9B1B$w8K#U2PATe7b?%^rG}5 zyDW>8VeJWY^)LILi+WD5_}M23L{N!&KJpNlblyoWS}zxlc%76=r`0TTzCbr51}$0g zdL+4TpATd@yWm*zcW+xAYb`Q;2Z?S`BRi*4h3pJJ^tirDh-KN9hvbEnE1TV8*+O%v z8-zU7r&e3#ycn5wJ1Mgm+=p~$?+$6r&x=pDE}7fSeypJIF;l7Z=^dyQytAH=d#+0q z>G7dHZ)^zwC%qQ~X%RM(YRR=C%~dA6sb6FV1bhtzR_ci_-8l5636XST0uJ17LY}-k zgkp1O8uwJaGj2McCIFL0tj=;;9N|xc);hP2dWaV?eN}w^?`+BMS!DRDn z%*UwdY$I;tX((zR0P(9#4I;0Ba?;+qsQGyy*JEO^Q@y$Up~S~toTci%?by|Ml0&|U zoH2T+jYA=aKd8zZHqb19DihU4y)2@wjy>1PpWo<7;|e1~HkdUQ0ZBLN7d0ty4*?ju z0YuV75rkx!aR^~WMf5!|kD*1nAiEnn4`Dbtmqg?3*Gm|JsFQ0hdZ--`eK*wQ)>L5IGKNvEj{{iCiN8oLgG)WCG5RtU15X#>3p+xi<$Lw=)k^zhQr z)!EnVIt&ejD;|ZSV`!wVpTP)TbP%t-X}&Prk%PnM;wA_`3Yku#WK$MYD^%EOMN}{s zkgwl#bN$heXs`+?FW_I%1Yx>TJFwk2s{L2ZlGCXoE%d}WTRvIlwR z$2(-ic#T&!WW=&f*f-nc_pe4uT8jOt@``4>Y+{SgU6qjHf)TY%-aQ)O-r0HO(QE~) zYBQ|Bi~^OWaF)@&htJzK77gCoL1LxbdqsEIZ=oL=oW}IpP?2>;=<=J1yxH1^8GrAF zTX*W83hJ!sFaB7e|GUcnMkD09gKE#^oJLlu81?leD{ zgtHlzPxbtzl)^!h54 zmj^pJp!@}YXCeP?Xu+17r-6#O&gyxSLrN1jFeJIB9C>yuS^8w)?DnH%w z>iQ-4_Hvi5-|j?(>G}J>+QgESGXFYPQIR03DqY5!dZN`Lz(Ic(`1{h?7*S(9*Ym!4 zg+UwvvZ=X$-R-Y@PqFzMW_M|{eo2ibFGTYo3N3fWX9h1g3c%UZSBNF|iF=?(zC>T)S z!)F@S!}-X_-8DD2jk!rGK8a0QLSX}Viq4Bh~xMXL%AYJXVSS7>6pX9hj*r;<+ zy4I10B6;X0PG^l3OMR>$D^I+~R#ucf!_1KQjga^H4=e857&Fb|9q)hO!VP}fl>5AH z(du`X=33G&j=w*l7L#Nw_~m;}c^Xpp-JA~d2N8XKiTsRR+(XtU`l!MRL^dRGY7ZI` zBwF>Al-G6Cj+S)cN7P<@!)|#IF!{~PN%`%2Gj}chO77oKnIqkNcU7}_v4)Cvew%d!|X~_LaB{0BGC@fOZY3iZ|`-` z`}4QFTA%UjX5t^AM>@Z@7})V77C6Da#M5gkA^LDYv0T36_x51KlXL>4%EpNdi8*(na)nmZ`)M5eik&HH}}r%Towknd|@Ty_{E}GXp4jIyEPi{YI*f^ z^*bs~=fH;@K!9bduBc-70v$%1)v+qjuK|axKqo_|@n&}ffer=h}Z1DkJFs>LM zBNHSt>##xriA&5)dfJ+FWgV*shYn@Bx4Vpcy+lwG}!blv##Y~+E`p*lZy&5+Ax_z z=?}MA();#E?v2@L_@4X=nr2~rE?JqG6@eH)2yPPVN^(@Eb#U@E^;6GcV?knJQ2ZnOZSO zFt}GPNidZc{Zd*;^`K2?ph^4nebZZA@TV2kUvl`}x>TN?c0+pWKw!?D!COCf@`7;Ikw^4gN9ujZBLwS-lLj zt;C=a>`Spim{WUQ}Eqi zn_}WkH<1iXztRc#)8W*PuR!N3t^MKR6zL}O@9*n{Q$_roD?gCCuO-=4whs;eKnL`r zq9v4#|5(w`Hu-<*20W<_Fwwty0+5vWH(eOpwWUpjcsu~%mL;g#aa-`g)l}&Y<7Y;=U~m|QpY$BhS4H}wUgTwVuh44520aAZk(S;8pKiR%L+Gt6ELw8Gubop zotdoaLhsw(m%=b3(cTk;*CHlGtM$bPz(KR?6t%=}K1iV@>42^}nTJm1Vn(%`U>RFh z$9vsajk+dznqk8()INJE>zsyCu$eVQJY`qDWYf1mQ~TP2eaIX`gm3|YKYy==$l73S z|iI;df82-A(xjWQ58}~#Ni4|ZyEykwb^3=v$3mf zjhI~hn$c~|n!DHBKq=w75pO)cAm6dL{;#H93!hw-T?>S)ZcOZ~WgBm;*MJ{*K->(` z-b>T69@DMzcr=3%1UHy?(xD>aA@hg5nrlw5G!02DX&2c1XP|@oTabZLCCb6~3{)8# z!u@uF%IaJq(!4C)Xdyyc>+f@4$O&KNLAY+FusqSHD(J29s2<`I9J|;hb6`Z*RKUz| z3F!R(7IW~(*t&JOH&aQ1Mzq*Hj5@{-d4)f}$2HGbjA@dDW$v!>aCkMWZ#3R{c?mzc ze@i~%w_KeMD51`yeM9fDtc1##)md;WoN8jsyPnIK)I70{cp}Pwt22`0x18F!%onf} zaJ6x7FjhxEEBe4{r+h_@Ki^d8{S!gy5|D9xl#e`h*TTw9^M7C;g!~!uE_8H=?rg~9 zZ2iC#dX7sR;*G-(zlHFx8=8Mf;zOAEv$Fp(WciDsZl=@>`26esT7m4n zcYaoaKOq#3u^}G>2E+HwvmU7WPt@XU#kzc@_Sb-JIB9w!l&$CKKm3$8YPzL9;Xgqo zrCp{QT8B>rc2R#rNObczWY@mW!DQdn51xU!=$)ySsCttnjFNSPinIha02HJ zT7*_!d5YgvLhHRgHr_6iy}L66=)x zAoP_0WFHf*v=3&}aJm{ix5Adg)=-C!8BcTdlp59Bcs4gg^wpl-h57lp`<7T+sRYA) zkgK<-+M&ijcEwdnV{3<-{A>+s7g*h|At8F78guY%q0Pc?T<44jyfUOAYu|dsgSmD= zGLTPF7B-jEDZ8$CRZZ(H^1Aro(4_eeU2(8!aSQKJ}uA zwGfSeESK7a!{xfDxU#S+-jHFRq^4X2&wiVai&E-z&Qaf5ULhHT=?&mxP!HJ53fgSi z55^?>8eX&$qVhX*j6W^i|G8KGBMkGbOt%`dJpy}p_YL3H))UvAe59sb?4bIr)4$?rKu5u-K@HP(R*SCbc28I|BMjDPMeGu`&Cf(a~b+iD7E<9Z|n))PRNrtFApLqtiaoV3fKE`>4Gwn#;$RJlg2ym_fOOSaXKWu`C)V+=Cgp zm9t`ehUZ{egv~aaF}TB*7Xu^z#0oS(pN?RBHs-E=cvL1QIq|yIy3gCzTIvV*Gu>XHDbp6$2@}~<>BF%@FZvU)V zz~~Sy2nF_Y34UO7#qVIttQfX2dN*Zn1L#&YwqdxK3HE;@v4D0Npd5VIKYYxp#b|)w z2s^lUuJAX0^DCzYE&))n_TZZp@xfT!doDx6b@G^l8=iuPKdg~4PU#=#V!<_3Gjed`A5GvZPr$v%g@gt(F*!TxS zHS6GCBXtI>_}*B@x>KF*3K;So!wl7#vdMbma}hduo|7XXv1;=?)k%MFkY7_>^m>qq ztj~?G@xD2SAPtk_~Zv`g`L3FljX~k{+ynD`VX|I~Vi#)`CvY@8MZ@$8@Q>B4Be1lcvZ8jn+ zi&~(38ktY{7#1^5dq>!Mpyw#ZL{)Wcgqhv$v}-pnu5zykTqA9u3hXNXlp>;eNZo2{ zldY5LxatD_{KD0iz*299lQp?W-Pxp?YGE?M#LwpfPyqhTWxo{w1tU17b#OZ&F-khS zYk7&3=kQgc9e);r)E(Kvla%ycV@5gt!P(AYO^ZEAOTh@bM%;og3_9`X>BQt>A)8%f zn@z3p_tCzn_(4)uTed@wKDlt`oVB;@#p#6ck0NNGU1SMuO>ci_hC4591Tkad_IvJT zx~O*=IBx(V#=vL?6FMG|)W_e~FY6=Pd(#@TX>8H;Jf8i)TkVNTP4 z*I$dfo-E~m{;|b_3)IFS`Sic7F8~ykIQ#)c|C2@f{|rw44;^)5;rF__&R?rOApwZ` zr5=D7qRT~2mi`;BEKB*`oz8E6GYcFCQ}_jVPG$t{4|#WM@_OdG&O86=kAg91_4?LJ? zoX;JSEh$S`R0_${Yva+*d3i5?!dl|uXSyq)pm3Jmaq2{A?&>1 zoWmWUa>P6N-=dG)jH{atn7}Qk11%@~ZrMs2=+9Lw8&}fnkrLbd*ICW%uO+Hy%!Zs~ zj#Fo^`*m5poYTBlKVRN0M@_Tn>=~8!902^zFufw|e?gp?7=SpQNg|&a?PB$cEOcd8 zVbyD55+-avXMEnuJnE_02Z(_Z)e47pw1$9tzDP zmFc*;A?=>LVu&Svp8#e#GcXs(CV>&Mz<}-z>0VVj+pN0Q0zOn44%h29nxS7f8d~Ch zGo^nEvIIP_4031(W>~D+w=^rgilBudrOFHQ4OQ%H&gAxClj7m}6waXPB^p)e@Sz1D ziLUf}Af+^7yZ%dhgG;H!uwONJK{FKSm%|4})y+QapC)a~r#qN+;FH{DzVUz;pp`6< zGsMF_ymLXm4zw%}Ohv6KMVFMf>fX7qmF+X7gXx2pOfwqc=A^?Q&Gc|jY z`{9Bjhyp;hBO45U4uI{8>vz*bl)(Ong#(g-CxTu#XY&~tLH{uZM(-9o^1Qhl4gip} zx>p_6pRA|vJHQAw0x8B{Bq2T#xE*?3t2es8a)UpY@NcSab{E$NXd+DQBp>O&vW|ZN zV0@hJ!1ii#lz+kFKbcJ{g_;&1Yy={@z|hAeI?_+i!0ao2GS5s1keCzz7+h!oA%S@x zwNYH3`_pfNcLk5vy}oxOz2}byzK?>8#1Ef%4F4?z=LanTatnO~^1QdJkJs(@73+^c zv{29m`x}!1^QQ6FSe@Q+F#iG^>Fz0=zcC1S_kZ+$#+)yxAe zJ_r;0UiGIvzyYlvf?Eg7s!^TRJ@CM(ME;<9TU+`0tu#W_u<3o|>hVjwc?e`q*C! z40!i$xfB{#Xr|4!1zrK1vDV>)2~oKnA^DN@F)~tT+9(efteYV5s`umOq}ui?#Dt-> z)u+1&|!O6D>BU_LI#LO&JfWG%x*PrP5`1R7}Q*D zBbI)+dGx+6?#8FU%mhsR&)b?d=K&OM3qpYvRnBF=QM>*lx>9?hf}8smix_)oxktzL znn{7GZ_dU!N~i06t4F{6!Kx+u?2Ud-g>JiyT$bRe8NT&msX(JV zINBOM0MnuSFr*g8YiENo#00LU2}5?aM#GzDePy*4-qS@VV*;iwpT-R==Z7Ad?Hc)( z{N`Sd6#Jr4@jEh?<(g6%!!ztefdRb7Ul94<9E_F4we zB*9ybHji)BtSnn48K8tJ=^gIiW%!$nyBCp14eg!R&lg}CkC9mJ>egN5H%41WiGNAK z29Sc{+6pgR?e%@V$aW2)gL~QXz7ye0^C%H>#e+`Cz4|p=ju}yf9W2>2lF-DE%Jyq5 zq}VXE;VmR?sl}NJX#_2gi?hhQf|IA?+tfa_Xv{LD_*-ZA2~N_!9oH@Y@|Y0>?Bu>; z^i%$(@^0-Fz1jn;TE*t57+G)FtQp*uq8sQ^-;Wb^VR|-Eo7)Un=b>N|FqzPJnf6T+ z)D!s$Ba}YRzz=lr=sN6FJ)`=nyDGxb9Y+qr^wQ&}-YnL34!cT2YRLdb8!!X;%uYlH zhx-8Gbd^eYCw{N9;+LlD5w6fox+>nP1fck|s9cl6+t^0Asm{d2BhxyqeS3GnCP5CQ zQ+c=#dlFu~(8IxAD(l)(AxSMxaC^wv+cMAr>k@dbHBvwfEPNI0S2kKZ6L|+2_betu zRN!^T*vxEK(zabvm$3qrrZKT|p6s1%pS#_Iv}yMBWoBH1WUes(*f;5u&-2X*v#w4h z?m8=h%WB&W?iX8PPPfeuCgm6||GJq!fS83BD#Sz@Ue)s7uREWBApm2=B!KD|4q z5IOEx@t_Gz($?*+Y0@K}8D1FqIPBV7(7*@gnEehLosya@qJ{^9V%n8)##0jxr;qFG zeZo3{aL8LvFk$w}KOq?3%leAJDXq|-6_54 zEB~>}ODfA|2+apvJIQbU?WYntCpW!!iu2U>>)L~7*wKxJ^wTh zNcv}f)WJQr35X+pIp-D;+9w@^KwbL3{Af??fK18=ID_9ALHE@A(60mg;a{&v1i)29 zw*ll3L+=15@=sq%*n`5Fz)8yg@Y{h0m|rb=`(Df)B3e8t3|s~B)1c=}x$p-8w8c3< zOEm}nOPi{k%u(bAiu#xjBcXf{c&7tJn)*6)PWNBW3;~BVLs?|x05Hw9ec*T~UBFkV z@JGfiEG2|Y*uVCQ5KOy11V4TkZ2uAUnDh3u{o(4ddmVBB%7htgOTlSJz>R@Ztmxq0 zueU#Ltv+1&KG;2${CNDCKZP8C_;s!6Hx7=P(s<+!__w)t&@*vhpZ@u|$F|KANh071 zYHpQ{Gl<*|XE+*ZTXyZR2syB%I)G~gyih* zw^*uf5(Hy7At^(D4&Sem*7wtN`(2R(1iIKyc?+q>wu5`})Aa)j6?_4Bl@tFQ+Rs-1 z006*2bVa*e-(KAIrwnrm%Dz~T*R$gUit4RacOK8CP0y!Cn;#$lt5|=!-yO6C2`98- z5?K!JOuWV5>gcL<@zSw5_4s?{inEz+ot5LQ;RNfnjR0RQ@KXP!^>83(=96!3zOlaA z9lIPlbB@d>K>kwV5xP$GI9h{vPW})TY*iXseoD~9>v~bMG3Q-zV@q0p(pdQSsZi~e za(B1Ha`!i75si}>$FCO4&kC4jpAr4E3V)uFc;@!As>=IbI%B*}y!1H-uU3tjomO4E zrM!3Q@)~TUou-Go`^Ov*uUr3qdf`o1kWq2X^i6Y1P_uQd^=yHj?hhN2vz@)uLEk%# z!3=y@(l>v)q<+odo*fEV)YNjHT$RqBe;*^CzH5ApyfLd*bL2HVZaKZO`-VJh_f;Lt6nS`;Z?n@lyB`I!j{NrOV9gRzzlm#S_E!RG zr!u7Gtc10fWjN|`7TlN#m`}U{ zL>M{$7J8Ge?!~v2D`edDvq6S4&AV~91houRj|WmFQ%n4W*>Czgb`?O-wkiQQ?U6qs zCpQhrA7fcP(;uV{TO3H?NYQiWd{Wk<|$xGB2tYjz1FApcey_PrbQuFw0c7>7UC z*-z662?tu*s&KA94s#Qdl)D$0Dhu0APF~`6{E4-G&C35P{mZ`lIe0L#{%tMG>jw=Po%C#PnLE`?^H7k0z%dKj`Ro@>k zz9^{pc-9qFm6iZoF~Wc5gntDavRh}m038)IzSz_fQ^J$j1|L4X%F;e(-F9DgCfCih zD9dbThMRFOaNG+)ohj*uslmSy0H74wsD_q~eZ6fSx_y0sGsd;B+KRj^*gku>zU{YR zKibmcY7?Vow)2FTmWRv~{6`?A@H#7hXyCk4KEd;1kmt1I)z3ZTGurV4T&g#1>6bqjgBE$y(w9rR($a#9WiJk=LA-AZLH$lIG+-I( zoifdG+HoL54$dxHfCAkAVt|?Z-7ej1sPll$ zymNcW)71LD32L6r`5*?tEVe_1gjsW?c=1Jn>wVar3%{>_nfz^l?I+|inrE?VZ&RHLuYTEpxYXQ2jHCZGGK zhL6EUV)@+j*nL9#y&G(To3ksFj;_0y?m={`lh(Ony{+IEB^H$3kbjn~l_pT0)KoCK zii!U);RB2c%fucr`ymbmFhj-tF0IF+)Pvw<_q%d$#v&*{o>k0J4MjuhA+swq!r?0g#VWP_ZM3 zIAtr&cGPDvIp@quoo;Dbm+1Kjy*uAcE*^IYh_(-%nUSQx<}t`@dsFfUbf;$sgkZh7bS$dGJj_J29f z?~dm42XR;))4$rlbZipV0S@h4Y{fD%?MFT`ArxSeO^Q-kg=&K7RgiOf-5@E9jRq zy};ji**2`Z;(oduMa88_RCdw7p+z#Re+|y0;nsbhrJWboMM;GD>j}uB}I;zSG!P@4b=FdevMY_ASHiK2`> zmDO;F&pbK;{_>dhvF-P!jJ%0AMd=v%Y?w`T1f3Y?SFf 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%0Ap%A`oCB=?Gb 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 ZIvF@PxjB3R3giSbv$DXDlZ(oU{U7ilL6HCe literal 0 HcmV?d00001 diff --git a/doc/report/report.md b/doc/report/report.md index efa1a5901..09d97c27e 100644 --- a/doc/report/report.md +++ b/doc/report/report.md @@ -126,7 +126,7 @@ arg_list_not_empty -> exp COMMA arg_list_not_empty ### 3.2 semantics -El módulo `semantics` implementa la fase de análisis semántico del compilador, este recibe como entrada el árbol de sintaxis abstracta producido por el parser y tiene como salida una lista de errores la cual si es vacía indica que el programa es válido. +El módulo `semantics` implementa la fase de análisis semántico del compilador, este recibe como entrada el árbol de sintaxis abstracta producido por el parser y tiene como salida una lista de errores, la cual si es vacía indica que el programa es válido. **Análisis semántico** @@ -160,7 +160,7 @@ EL lenguaje CIL está dividido en tres secciones: **1.** type: Se definen los tipos (clases) con sus atributos y el encabezado de sus métodos como se explica en la bibliogarfia de la asignatura. -Se conoce que el ast producido por el parser tiene como nodo raíz un ProgramNode que está formado por nodos ClassDeclarationNode que son las clases, y estos a su vez por nodos AttrDeclarationNode y FunctionDeclarationNode que son las definiciones de los atributos y los métodos de una clase. Cuando se visita un ClassDeclarationNode, se crean los nodos CILTypeNode que contienen una lista de CILAttributesNode y una lista de CILMethodNode, los cuales solo contienen el nombre del método y el nombre de la función que lo defino en la sección code. +Se conoce que el ast producido por el parser tiene como nodo raíz un ProgramNode que está formado por nodos ClassDeclarationNode que son las clases, y estos a su vez por nodos AttrDeclarationNode y FunctionDeclarationNode que son las definiciones de los atributos y los métodos de una clase. Cuando se visita un ClassDeclarationNode, se crean los nodos CILTypeNode que contienen una lista de CILAttributesNode y una lista de CILMethodNode, los cuales solo contienen el nombre del método y el nombre de la función que lo define en la sección code. ``` type A { @@ -169,13 +169,11 @@ type A { } ``` -Como se sabe los métodos y los atributos de un tipo deben siempre definirse en un mismo orden y si un tipo A hereda de B, A debe tener acceso a los atributos y métodos de su padre y de los demás ancestros de él hasta llegar a Object. Para lograr esto se tomaron en orden topológico todos los nodos de las clases y al recorrerlo se fueron agregando los atributos del padre y métodos en el mismo orden, y por último los suyos. De esta forma, cuando se llega a un nodo su padre tiene ya todos sus atributos y métodos definidos, asi como los del los ancestros en orden de aparición. Además, por una mayor comodidad en la implementación, todas las variables o atributos almacenan un tipo además de su nombre, dejando el trabajo de la memoria para la segunda fase de generación. +Como se sabe los métodos y los atributos de un tipo deben siempre definirse en un mismo orden y si un tipo A hereda de B, A debe tener acceso a los atributos y métodos de su padre y de los demás ancestros de él hasta llegar a Object. Para lograr esto se tomaron en orden topológico todos los nodos de las clases y al recorrerlo se fueron agregando los atributos del padre y métodos en el mismo orden, y por último los suyos. De esta forma, cuando se llega a un nodo su padre tiene ya todos sus atributos y métodos definidos, asi como los del los ancestros en orden de aparición. Además, para una mayor comodidad en la implementación, todas las variables o atributos almacenan un tipo además de su nombre, dejando el trabajo de la memoria para la segunda fase de generación. -Además a cada tipo se le añade un método especial, el init, que va a ser llamado cada vez que se inicialice una clase desde el código de COOL. Por cada atributo declarado en la clase y que se le asigna una expresión, se van a añadir las instrucciones responsables de inicializar esos valores. Este método va a ser invocado pasándole como argumento la referencia de la variable a la que se le desea asignar este tipo. +Además a cada tipo se le añade un método especial, el init, que va a ser llamado cada vez que se inicialice una clase usando la expresión `new` desde el código de COOL. Por cada atributo declarado en la clase y que se le asigna una expresión, se van a añadir las instrucciones responsables de inicializar esos valores. Este método va a ser invocado pasándole como argumento la referencia de la variable a la que se le desea asignar este tipo. -Para el caso de los tipos basicos Int, String y Bool, además de añadir el método init, se define un atributo value que contendrá su valor, asignándole cero en la función si no se provee de ninguna expresión de definición; y para el tipo Object e IO, el método init solo se encarga de retornar la instancia de la clase,este mismo método init es el llamado cuando en el lenguaje COOL se utiliza la expresión "new". - -Los tipos built-in quedan implementadas de la siguiente forma: +Los tipos built-in quedan implementados de la siguiente forma: ``` type Object { @@ -233,9 +231,9 @@ type IO { **3. ** code: Esta sección contiene la definición de todas las funciones, sus parámetros, las variables locales que se utilizan y el retorno. -Un método en el AST devuelto por el parser es un FunctionDeclarationNode este en CIL se convertirá en un CILFuntionDeclarationNode, como se mencionó se deben guardar en una parte de la sección code las variables para esto se creará una subsección .local para las mismas y una sección subsección del .code también pero anterior a la .local es .param en donde están todos los parámetros de la función delcarada. Para crear las variables se utiliza un alias que depende de su nombre original, esto se realizó porque una variable de un método o un argumento pueden llamarse como un atributo de la clase y a la vez en una expresión let pueden utilizarse nombres de variables que estén en los parámetros o en otro let más externo, este alias posibillita que la variable al crearla sea única y no sobrescriba variables creadas en otro entorno accesible. +Un FunctionDeclarationNode en el AST devuelto por el parser se convierte en CIL en un CILFuntionDeclarationNode que está formado por tres secciones: `params` en donde están todos los parámetros de la función declarada, la sección `local` donde se crean las variables locales e `instructions` donde se encuentran las instrucciones a ejecutar. Para crear las variables se utiliza un alias que depende de su nombre original, esto se realizó porque una variable de un método o un argumento pueden llamarse como un atributo de la clase y a la vez en una expresión let pueden redefinirse nombres de variables que estén en los parámetros o en otro let más externo, este alias posibillita que la variable al crearla sea única y no sobrescriba variables creadas en otro entorno accesible. -Como se conoce en el lenguaje COOL solo existen expresiones y en el lenguaje CIL se tienen tanto expresiones como instrucciones, por tanto una expresión COOL se traduce a una lista de istrucciones CIL ya sean de asignación o de cambio del valor de un atributo, ifgoto, goto, label, entre otras. Una asignación en CIL puede ser la traducción de una `asignación` de COOL o puede ser creada para llevar una expresión de Cool distinta de asignacion a una instrucción en CIL, ejemplo cuando queremos realizar una operación suma en COOL cuando una de las partes izquierda o derecha no es un nodo atómico debemos separar en en una asignación a una nueva variable creada en CIL que guarde la expresión de esa parte que no es un nodo atómico y luego a esta sumarla con la parte que si es atómica, lo mismo pasa para todas las expresiones binarias. +Como se conoce en el lenguaje COOL solo existen expresiones y en el lenguaje CIL se tienen tanto expresiones como instrucciones, por tanto una expresión COOL se traduce a una lista de instrucciones CIL ya sean de asignación o de cambio del valor de un atributo, ifgoto, goto, label, entre otras. Una asignación en CIL puede ser la traducción de una `asignación` de COOL o puede ser creada para llevar una expresión de COOL distinta de asignación a una instrucción en CIL, un ejemplo es cuando queremos realizar una operación suma en COOL y una de las partes (izquierda o derecha) no es un nodo atómico, debemos separar en en una asignación a una nueva variable creada en CIL que guarde la expresión de esa parte que y luego a esta sumarla con la parte que si es atómica, lo mismo pasa para todas las expresiones binarias. Un caso de especial consideración dentro de las expresiones de COOL es el `case`, el comportamiento esperado es que se compute el tipo dinámico de la expresión de del `case` y se seleccione la rama del tipo ancestro más cercano a dicho tipo. Para resolver esto se recorrieron las ramas del case en orden topológico inverso de acuerdo a su tipo, por lo que visitamos los tipos más especializadas primero, y por cada de rama generamos código para que los descendientes que no tienen una rama asignada sean dirigidos a esta rama. Al final se genera el código de la expresión resultado de cada rama. A continuación presentamos un sencillo pseudocódigo con la idea general del algoritmo @@ -256,13 +254,17 @@ for branch in case: generate_code() ``` -En el caso de una expresión `block` en cool , para llevarla a CIL recorremos todas las exresiones que la compongan , cada una sabe como convertirse al lenguaje CIl y luego retornamos la q devolvió la última expresión del `block`. +La conversión de la lógica del `loop`, así como la del `conditional`, a código CIL fue muy sencilla. Con la ayuda de los labels y de las expresiones ifGoto y goto se decidía cuales eran las próximas instrucciones a ejecutar haciendo saltos en el código. + +En el caso de una expresión `block` en cool , para llevarla a CIL recorremos todas las expresiones que la compongan, cada una sabe cómo convertirse al lenguaje CIL y luego retornamos la que devolvió la última expresión del `block`. + +En el caso del `let` se debe crear un nuevo ámbito de variable que te permita definir varibles que ya están definidas y a la ves utilizar las anteriores creadas, luego se crean tantas variables como tenga el `let` y también para cada una de las expresiones de las mismas y a estas se les asigna lo que devuelve cada una de las expresiones y luego se procede a crear una nueva variable que guarde lo que retorne el recorrido que se le realiza a la expresión in del `let `. -En el caso del `let` se debe crear un nuevo ámbito de variable que te permita definir varibles que ya están definidas y a la ves utilizar las anteriores creadas, luego se crean tantas variables como tenga el `let` y tambien para cada una de las expresiones de las mismas y a estas se les asigna lo q devuelve cada una de las expresiones y luego se procede a crear una nueva variable que guarde lo q retorne el recorrido q se le realiza a la expresión in del `let `. +Las asignación es un caso importante, ya que tiene la tarea de verificar a qué tipo de variable es a la que se le asigna un valor. Por tanto, primero la busca en el scope y en caso de no encontrarse es un atributo, por lo que la instrucción a ejecutar es un `set attribute` ; en otro caso es un `assign`. -Para las expresiones unarias en el caso del `prime` lo que se hace es restarle al valor cero la expresión que devuelve el recorrido de la expresión del `prime`, en el caso del `not` se devuelve una nueva variable que guarda el valor de un nuevo NodoCIL CILNotNode que guarda la expresión del `not` la segunda parte de generación de código es el encargado de procesar dicha expresión . En la expresion `isvoid` se recorre la variable y se crea una nueva para asignarle el resultado de este proceso para luego esta pasarla como parámetro y llamar a una función creada llamada `isvoid` que se implementará en la segunda parte de generación de código. El proceso de llamado de funciones en CIL a traves de las expresiones VCALL o CALL estas se utilizan en dependencia de cómo lo necesite la segunda parte de generación de código. +Para las expresiones unarias en el caso del `prime` lo que se hace es restarle al valor cero la expresión que devuelve el recorrido de la expresión del `prime`, en el caso del `not` se devuelve una nueva variable que guarda el valor de un nuevo NodoCIL CILNotNode que guarda la expresión del `not` la segunda parte de generación de código es el encargado de procesar dicha expresión. En la expresión `isvoid` se recorre la variable y se crea una nueva para asignarle el resultado de este proceso para luego esta pasarla como parámetro y llamar a una función creada llamada `isvoid` que se implementará en la segunda parte de generación de código. El proceso de llamado de funciones en CIL a traves de las expresiones VCALL o CALL estas se utilizan en dependencia de cómo lo necesite la segunda parte de generación de código. -Cuando se encuentra un nodo string en el ast se agrega a la seccion .`data` y para utilizarlo se utiliza la función `load` de CIL que es agregada a la lista de instrucciones. Para los valores boleanos se crean un expresión `equals` entre 0 y 1 para el False y entre 0 y 0 para el True , esta expresión se le asigna a una nueva variable y es lo que se retorna. En el caso de las variables si esta es un atributo se crea una nueva variable que se e asignará el resultado de hacer `get attr` y si es una varible local se busca en el scope. Cada vez q se crea una varible esta se añade al scope y a esta se le asigna el valor de una expresión que esta expresión es un nuevo nodo creado que pertenece al lenguaje CIL , estas asignaciónes se añaden a la lista de instrucciones al igual que aquellas instrucciones de CIL que se necesitan para convertir una expresión del leguaje COOL a CIL. +Cuando se encuentra un nodo string en el ast se agrega a la sección .`data` y para utilizarlo se utiliza la función `load` de CIL que es agregada a la lista de instrucciones. Para los valores boleanos se crean un expresión `equals` entre 0 y 1 para el False y entre 0 y 0 para el True , esta expresión se le asigna a una nueva variable y es lo que se retorna. En el caso de las variables si esta es un atributo se crea una nueva variable que se e asignará el resultado de hacer `get attr` y si es una varible local se busca en el scope. Cada vez q se crea una varible esta se añade al scope y a esta se le asigna el valor de una expresión que esta expresión es un nuevo nodo creado que pertenece al lenguaje CIL, estas asignaciónes se añaden a la lista de instrucciones al igual que aquellas instrucciones de CIL que se necesitan para convertir una expresión del leguaje COOL a CIL. **Generación de código MIPS** diff --git a/doc/team.yml b/doc/team.yml index c16162532..d5aa8f7bd 100644 --- a/doc/team.yml +++ b/doc/team.yml @@ -1,10 +1,10 @@ members: - - name: Nombre Apellido1 Apellido2 - github: github_id - group: CXXX - - name: Nombre Apellido1 Apellido2 - github: github_id - group: CXXX - - name: Nombre Apellido1 Apellido2 - github: github_id - group: CXXX + - name: Amanda González Borrell + github: amyGB99 + group: C411 + - name: Karla Olivera Hernández + github: karlaoh99 + group: C411 + - name: Victor Manuel Cardentey Fundora + github: Vitico99 + group: C411 From 751a980d522c2ba79ff21364dc714f1de0c165b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karla=20Olivera=20Hern=C3=A1ndez?= Date: Wed, 9 Mar 2022 23:52:08 -0500 Subject: [PATCH 72/81] Add BoxNode to CILAst and use it when an assign in cool is made and a boxing is necessary --- src/codegen/ast_CIL.py | 18 +++++++++++-- src/codegen/cil_codegen.py | 7 +++-- src/codegen/generate_ast.py | 51 +++++++++++-------------------------- 3 files changed, 36 insertions(+), 40 deletions(-) diff --git a/src/codegen/ast_CIL.py b/src/codegen/ast_CIL.py index 25d97a5b5..477b9fc69 100644 --- a/src/codegen/ast_CIL.py +++ b/src/codegen/ast_CIL.py @@ -213,6 +213,18 @@ class CILExpressionNode(CILNode): pass +class CILBoxNode(CILExpressionNode): + def __init__(self, var, type): + self.var = var + self.type = type + + def __str__(self): + text = "CILBoxNode:\n" + text += f"var: {self.var}\n" + text += f"type: {self.type}\n" + return text + + class CILBinaryOperationNode(CILExpressionNode): def __init__(self, left, right): self.left = left @@ -305,9 +317,11 @@ def __str__(self): class CILVariableNode(CILAtomicNode): pass + class CILExceptionNode(CILAtomicNode): pass + class CILTypeConstantNode(CILAtomicNode): pass @@ -349,7 +363,7 @@ class CILEqualsNode(CILBinaryOperationNode): class CILNotEqualsNode(CILBinaryOperationNode): pass + class CILNotNode(CILExpressionNode): def __init__(self, var): - self.var = var - \ No newline at end of file + self.var = var \ No newline at end of file diff --git a/src/codegen/cil_codegen.py b/src/codegen/cil_codegen.py index 0f9e46deb..85c5f2ace 100644 --- a/src/codegen/cil_codegen.py +++ b/src/codegen/cil_codegen.py @@ -115,6 +115,10 @@ def visit(self, node: CILReturnNode): def visit(self, node: CILExpressionNode): pass + @visitor.when(CILBoxNode) + def visit(self, node: CILBoxNode): + return f'BOX {node.var.lex} {node.type}' + @visitor.when(CILBinaryOperationNode) def visit(self, node: CILBinaryOperationNode): pass @@ -213,5 +217,4 @@ def visit(self, node: CILNotEqualsNode): @visitor.when(CILNotNode) def visit(self, node: CILNotNode): - return f'~ {self.var.lex}' - + return f'~ {self.var.lex}' \ No newline at end of file diff --git a/src/codegen/generate_ast.py b/src/codegen/generate_ast.py index 4a8d9d7f2..711523073 100644 --- a/src/codegen/generate_ast.py +++ b/src/codegen/generate_ast.py @@ -64,14 +64,14 @@ def visit(self, node): @visitor.when(ClassDeclarationNode) def visit(self, node): self.scope.current_class = node.id - attributes = [] + self.scope.attributes = {} features = [] methods = [] locals = [] type_info = self.scope.infos[node.id] for a in type_info.attrs: - attributes.append(CILAttributeNode(a.name, a.type)) + self.scope.attributes[a.name] = CILAttributeNode(a.name, a.type) methods.append(CILMethodNode(f'Init_{node.id}', f'Init_{node.id}')) for m in type_info.methods.keys(): @@ -101,7 +101,7 @@ def visit(self, node): init_class = self.scope.create_init_class(features, locals) self.scope.functions.append(init_class) - return CILTypeNode(node.id, attributes, methods) + return CILTypeNode(node.id, self.scope.attributes.values(), methods) @visitor.when(AttrDeclarationNode) def visit(self, node): @@ -242,8 +242,6 @@ def visit(self, node): self.scope.instructions.append(CILLabelNode(f'pool_{count}')) return var_return - - @visitor.when(CaseNode) def visit(self, node): @@ -305,9 +303,6 @@ def visit(self, node): self.scope.instructions.append(CILLabelNode(f'case_{self.scope.case_count}_end')) self.scope.case_count += 1 return var_result - - - @visitor.when(CaseAttrNode) def visit(self, node): @@ -332,11 +327,19 @@ def visit(self, node): local = self.scope.find_local(node.id.lex) if local is not None: - self.scope.instructions.append(CILAssignNode(CILVariableNode(local.id), variable)) + if local.type == 'Object' and node.expr.computed_type.name in ['Int', 'Bool']: + self.scope.instructions.append(CILAssignNode(CILVariableNode(local.id), CILBoxNode(variable, node.expr.computed_type.name))) + else: + self.scope.instructions.append(CILAssignNode(CILVariableNode(local.id), variable)) return CILVariableNode(local.id) else: - self.scope.instructions.append(CILSetAttributeNode(CILVariableNode(f'self_{self.scope.current_class}'), self.scope.current_class, CILVariableNode(node.id.lex), variable)) - return var + if self.scope.attributes[node.id.lex].type.name == 'Object' and node.expr.computed_type.name in ['Int', 'Bool']: + var1 = CILVariableNode(self.scope.add_new_local('Object')) + self.scope.instructions.append(CILAssignNode(var1, CILBoxNode(variable, node.expr.computed_type.name))) + self.scope.instructions.append(CILSetAttributeNode(CILVariableNode(f'self_{self.scope.current_class}'), self.scope.current_class, CILVariableNode(node.id.lex), var1)) + else: + self.scope.instructions.append(CILSetAttributeNode(CILVariableNode(f'self_{self.scope.current_class}'), self.scope.current_class, CILVariableNode(node.id.lex), variable)) + return CILGetAttribute(CILVariableNode(f'self_{self.scope.current_class}'), self.scope.current_class, CILVariableNode(node.id.lex)) @visitor.when(BinaryNode) def visit(self, node): @@ -449,28 +452,4 @@ def visit(self, node): self.scope.instructions.append(CILArgNode(CILVariableNode(name))) name = self.scope.add_new_local(node.lex) self.scope.instructions.append(CILAssignNode(CILVariableNode(name), CILVCallNode(node.lex, f"Init_{node.lex}"))) - return CILVariableNode(name) -# for (new_branch,i) in s : -# try: -# if new_branch not in keys and (new_branch,i) in valid[case.type]: -# try: -# if type[new_branch] : -# new_cases.remove(new_branch) -# else: -# type[new_branch] = True -# new_cases.remove(new_branch) -# except: -# type[new_branch] = True -# self.scope.instructions.append(CILLabelNode(f'branch_{self.scope.case_count}_{index-1}')) -# case_expr_type_of = CILTypeConstantNode(new_branch) -# self.scope.instructions.append(CILAssignNode(var_condition, CILNotEqualsNode(CILVariableNode(name_type_expr),case_expr_type_of))) -# new_cases.remove((new_branch,i)) -# if index == len(node.cases) - 1 and len(s) == 0 : -# self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'case_end{self.scope.case_count}'))) -# else: -# self.scope.instructions.append(CILIfGotoNode(var_condition,CILLabelNode(f'branch_{self.scope.case_count}_{index}'))) -# self.scope.instructions.append(CILAssignNode(return_, expr_attr)) -# self.scope.instructions.append(CILGotoNode(CILLabelNode(f'case_end{self.scope.case_count}'))) -# index +=1 -# except : -# pass + return CILVariableNode(name) \ No newline at end of file From 1ca84236efb071051707378688575b1cb390a11a Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Sat, 12 Mar 2022 05:02:55 -0500 Subject: [PATCH 73/81] Make Int and Bool value types --- src/codegen/ast_CIL.py | 19 ++- src/codegen/cil_codegen.py | 5 + src/codegen/generate_ast.py | 120 +++++++++------ src/codegen/mips_built_in.txt | 279 +++++++++++++++++++++++++--------- src/codegen/spim_visitor.py | 163 ++++++++------------ src/codegen/utils.py | 14 +- src/cool.py | 5 +- src/semantics/semantic.py | 3 + 8 files changed, 385 insertions(+), 223 deletions(-) diff --git a/src/codegen/ast_CIL.py b/src/codegen/ast_CIL.py index 477b9fc69..781ec2bf8 100644 --- a/src/codegen/ast_CIL.py +++ b/src/codegen/ast_CIL.py @@ -224,6 +224,17 @@ def __str__(self): text += f"type: {self.type}\n" return text +class CILUnboxNode(CILExpressionNode): + def __init__(self, var, type): + self.var = var + self.type = type + + def __str__(self): + text = "CILUnboxNode:\n" + text += f"var: {self.var}\n" + text += f"type: {self.type} \n" + return text + class CILBinaryOperationNode(CILExpressionNode): def __init__(self, left, right): @@ -357,11 +368,15 @@ class CILElessNode(CILBinaryOperationNode): class CILEqualsNode(CILBinaryOperationNode): - pass + def __init__(self, left, right, ref): + super().__init__(left, right) + self.ref = ref class CILNotEqualsNode(CILBinaryOperationNode): - pass + def __init__(self, left, right, ref): + super().__init__(left, right) + self.ref = ref class CILNotNode(CILExpressionNode): diff --git a/src/codegen/cil_codegen.py b/src/codegen/cil_codegen.py index 85c5f2ace..90d17bf47 100644 --- a/src/codegen/cil_codegen.py +++ b/src/codegen/cil_codegen.py @@ -115,10 +115,15 @@ def visit(self, node: CILReturnNode): def visit(self, node: CILExpressionNode): pass + @visitor.when(CILUnboxNode) + def visit(self, node: CILUnboxNode): + return f'UNBOX {node.var.lex}' + @visitor.when(CILBoxNode) def visit(self, node: CILBoxNode): return f'BOX {node.var.lex} {node.type}' + @visitor.when(CILBinaryOperationNode) def visit(self, node: CILBinaryOperationNode): pass diff --git a/src/codegen/generate_ast.py b/src/codegen/generate_ast.py index 711523073..bd8539c72 100644 --- a/src/codegen/generate_ast.py +++ b/src/codegen/generate_ast.py @@ -1,4 +1,5 @@ +from weakref import ref from parsing.ast import * from .ast_CIL import * from .utils import * @@ -83,7 +84,7 @@ def visit(self, node): self.scope.all_locals = [] if isinstance(feature, AttrDeclarationNode): if feature.expr is not None: - expr = self.visit(feature.expr) + expr = self.visit(feature.expr), feature.expr.computed_type features.append((feature.id, feature.type, expr, self.scope.instructions.copy())) self.scope.instructions = [] else: @@ -212,7 +213,7 @@ def visit(self, node): elif isinstance(node.computed_type, IntType): expr = CILNumberNode(0) elif isinstance(node.computed_type, BoolType): - expr = CILEqualsNode(CILNumberNode(0), CILNumberNode(1)) + expr = CILEqualsNode(CILNumberNode(0), CILNumberNode(1), False) elif isinstance(node.computed_type, StringType): expr = CILLoadNode('str_empty') else: @@ -247,59 +248,75 @@ def visit(self, node): def visit(self, node): expr = self.visit(node.expr) # the code for computing the expression is generated self.expression_var_case = expr - expr_var_name = self.scope.add_new_local(node.expr.computed_type.name) - expr_var = CILVariableNode(expr_var_name) - self.scope.instructions.append(CILAssignNode(expr_var, expr)) - expr_type_of = CILTypeOfNode(expr_var) - name_type_expr = self.scope.add_new_local(node.expr.computed_type.name) - type_expr_var = CILVariableNode(name_type_expr) - self.scope.instructions.append(CILAssignNode(type_expr_var,expr_type_of)) - # until here we have - # t0 = expr - # t1 = TYPEOF t0 - name_type_comp = self.scope.add_new_local('Bool') - type_comp_var = CILVariableNode(name_type_comp) + expr_type = node.expr.computed_type + expr_var_name = self.scope.add_new_local(expr_type.name) + expr_var = CILVariableNode(expr_var_name) + self.scope.instructions.append(CILAssignNode(expr_var, expr)) # save the expression result in a local - # use the topological sort computed in the ProgramNode to sort the types of the branches of the case - print(self.types_heirs) types_ts_pos = { type.name : i for i, type in enumerate(self.types_ts) } - case_types = [case.type for case in node.cases] - case_types = sorted(case_types, key=lambda t: types_ts_pos[t], reverse=True) - least_ancestor = {} - case_labels = {} - for type in case_types: - least_ancestor[type] = type - case_labels[type] = CILLabelNode(f'case_{self.scope.case_count}_{type}') - try: - queue = self.types_heirs[type].copy() # place the children class - except KeyError: # last type in a branch of the Type Tree - queue = None - while queue: # travel to all descendants - descendant = queue.pop() + + if (expr_type.ref): # when the expression is a reference type we need to compute least ancestor for all valid dynamic types of the expression + expr_type_of = CILTypeOfNode(expr_var) + name_type_expr = self.scope.add_new_local(expr_type.name) + type_expr_var = CILVariableNode(name_type_expr) + self.scope.instructions.append(CILAssignNode(type_expr_var,expr_type_of)) + # until here we have + # t0 = expr + # t1 = TYPEOF t0 + name_type_comp = self.scope.add_new_local('Bool') + type_comp_var = CILVariableNode(name_type_comp) + + + # use the topological sort computed in the ProgramNode to sort the types of the branches of the case + case_types = [case.type for case in node.cases] + case_types = sorted(case_types, key=lambda t: types_ts_pos[t], reverse=True) + least_ancestor = {} + case_labels = {} + for type in case_types: + least_ancestor[type] = type + case_labels[type] = CILLabelNode(f'case_{self.scope.case_count}_{type}') try: - # this type was visited by a type that is later in - # the topological order so is more close to the type in the class hierarchy - least_ancestor[descendant] - continue - except KeyError: - least_ancestor[descendant] = type + queue = self.types_heirs[type].copy() # place the children class + except KeyError: # last type in a branch of the Type Tree + queue = None + while queue: # travel to all descendants + descendant = queue.pop() try: - queue = self.types_heirs[descendant] + queue + # this type was visited by a type that is later in + # the topological order so is more close to the type in the class hierarchy + least_ancestor[descendant] + continue except KeyError: - pass - for type, lancestor in least_ancestor.items(): - self.scope.instructions.append(CILAssignNode(type_comp_var, CILEqualsNode(type_expr_var, CILTypeConstantNode(type)))) - self.scope.instructions.append(CILIfGotoNode(type_comp_var, case_labels[lancestor])) + least_ancestor[descendant] = type + try: + queue = self.types_heirs[descendant] + queue + except KeyError: + pass + for type, lancestor in least_ancestor.items(): + self.scope.instructions.append(CILAssignNode(type_comp_var, CILEqualsNode(type_expr_var, CILTypeConstantNode(type), ref))) + self.scope.instructions.append(CILIfGotoNode(type_comp_var, case_labels[lancestor])) result_name = self.scope.add_new_local(node.computed_type.name) var_result = CILVariableNode(result_name) - # first generate the instrcutions of the labels to get the CILLabelNodes to use - for case in node.cases: - self.scope.instructions.append(case_labels[case.type]) + # first generate the instructions of the labels to get the CILLabelNodes to use + + for case in sorted(node.cases, key=lambda c: types_ts_pos[c.type], reverse=True): + case_type_ref = case.type not in ["Bool", "Int"] + if (not expr_type.ref and case_type_ref and case.type != 'Object'): + continue + self.scope.instructions.append(CILLabelNode(f'case_{self.scope.case_count}_{case.type}')) + if (expr_type.ref and not case_type_ref): + self.scope.instructions.append(CILAssignNode(expr, CILUnboxNode(expr, case.type))) + if (not expr_type.ref and case_type_ref): + self.scope.instructions.append(CILAssignNode(expr, CILBoxNode(expr, expr_type.name))) branch_expr = self.visit(case) self.scope.instructions.append(CILAssignNode(var_result, branch_expr)) + if (node.computed_type.ref and not case_type_ref): + self.scope.instructions.append(CILAssignNode(var_result, CILBoxNode(var_result, case.type))) self.scope.instructions.append(CILGotoNode(CILLabelNode(f'case_{self.scope.case_count}_end'))) + if (not expr_type.ref): + break self.scope.instructions.append(CILLabelNode(f'case_{self.scope.case_count}_end')) self.scope.case_count += 1 return var_result @@ -372,7 +389,7 @@ def visit(self, node): elif isinstance(node, LessNode): oper = CILLessNode(left, right) else: - oper = CILEqualsNode(left, right) + oper = CILEqualsNode(left, right, node.left.computed_type.ref) name = self.scope.add_new_local(node.computed_type.name) self.scope.instructions.append(CILAssignNode(CILVariableNode(name),oper)) return CILVariableNode(name) @@ -433,14 +450,14 @@ def visit(self, node): @visitor.when(TrueNode) def visit(self, node): - oper = CILEqualsNode(CILNumberNode(0), CILNumberNode(0)) + oper = CILEqualsNode(CILNumberNode(0), CILNumberNode(0), False) name = self.scope.add_new_local('Bool') self.scope.instructions.append(CILAssignNode(CILVariableNode(name), oper)) return CILVariableNode(name) @visitor.when(FalseNode) def visit(self, node): - oper = CILEqualsNode(CILNumberNode(0), CILNumberNode(1)) + oper = CILEqualsNode(CILNumberNode(0), CILNumberNode(1), False) name = self.scope.add_new_local('Bool') self.scope.instructions.append(CILAssignNode(CILVariableNode(name), oper)) return CILVariableNode(name) @@ -448,8 +465,11 @@ def visit(self, node): @visitor.when(InstantiateNode) def visit(self, node): name = self.scope.add_new_local(node.lex) - self.scope.instructions.append(CILAssignNode(CILVariableNode(name),CILAllocateNode(CILTypeConstantNode(node.lex)))) - self.scope.instructions.append(CILArgNode(CILVariableNode(name))) - name = self.scope.add_new_local(node.lex) - self.scope.instructions.append(CILAssignNode(CILVariableNode(name), CILVCallNode(node.lex, f"Init_{node.lex}"))) + if node.lex in ["Bool", "Int"]: + self.scope.instructions.append(CILAssignNode(CILVariableNode(name), CILNumberNode(0))) + else: + self.scope.instructions.append(CILAssignNode(CILVariableNode(name),CILAllocateNode(CILTypeConstantNode(node.lex)))) + self.scope.instructions.append(CILArgNode(CILVariableNode(name))) + name = self.scope.add_new_local(node.lex) + self.scope.instructions.append(CILAssignNode(CILVariableNode(name), CILVCallNode(node.lex, f"Init_{node.lex}"))) return CILVariableNode(name) \ No newline at end of file diff --git a/src/codegen/mips_built_in.txt b/src/codegen/mips_built_in.txt index f5d866647..faab5ae62 100644 --- a/src/codegen/mips_built_in.txt +++ b/src/codegen/mips_built_in.txt @@ -1,3 +1,5 @@ +######################################## Object ###################################### + abort_Object: # calling conventions sw $ra, 0($sp) @@ -29,6 +31,9 @@ abort_Object: jr $ra + + + copy_Object: # calling conventions sw $ra, 0($sp) @@ -64,7 +69,203 @@ copy_Object_loop: jr $ra +type_name_Object: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + lw $t7, 12($fp) # get the instance address + lw $t6, 0($t7) # get the type info address + lw $t5, 4($t6) # get the type name + + # create the String class instance to return + li $a0, 8 + li $v0, 9 + syscall + + la $t1, String + sw $t1, 0($v0) + sw $t5, 4($v0) + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + +############################################### End Object #################################################### + + +################################################ Int ########################################################## + +abort_Int: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + la $a0, ObjectAbortMessage + li $v0, 4 + syscall + + la $t0, Int + lw $t0, 4($t0) + + move $a0, $t0 + li $v0, 4 + syscall + + li $v0, 10 + syscall + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + + +copy_Int: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + + lw $v0, 12($fp) # load the object address + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + +type_name_Int: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + la $t6, Int # get the type info address + lw $t5, 4($t6) # get the type name + + # create the String class instance to return + li $a0, 8 + li $v0, 9 + syscall + + la $t1, String + sw $t1, 0($v0) + sw $t5, 4($v0) + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + +########################################################## End Int ############################################################ + + +########################################################### Bool ############################################################# + +abort_Bool: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + la $a0, ObjectAbortMessage + li $v0, 4 + syscall + + + la $t0, Bool + lw $t0, 4($t0) + + move $a0, $t0 + li $v0, 4 + syscall + + li $v0, 10 + syscall + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + + +copy_Bool: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + + lw $v0, 12($fp) # load the object address + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + +type_name_Bool: + # calling conventions + sw $ra, 0($sp) + addi $sp, $sp, -4 + sw $fp, 0($sp) + addi $sp, $sp, -4 + move $fp, $sp + + la $t6, Bool # get the type info address + lw $t5, 4($t6) # get the type name + + # create the String class instance to return + li $a0, 8 + li $v0, 9 + syscall + la $t1, String + sw $t1, 0($v0) + sw $t5, 4($v0) + + # calling conventions + addi $sp, $sp, 4 + lw $fp, 0($sp) + addi $sp, $sp, 4 + lw $ra, 0($sp) + + jr $ra + +################################################################## End Bool ######################################################## out_string_IO: # calling conventions sw $ra, 0($sp) @@ -97,8 +298,7 @@ out_int_IO: addi $sp, $sp, -4 move $fp, $sp - lw $v1, 12($fp) - lw $a0, 4($v1) + lw $a0, 12($fp) li $v0, 1 syscall @@ -183,16 +383,7 @@ in_int_IO: li $v0, 5 syscall - move $t0, $v0 - - li $v0, 9 - li $a0, 8 - syscall - - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) - + # calling conventions addi $sp, $sp, 4 @@ -212,34 +403,7 @@ in_int_IO: -type_name_Object: - # calling conventions - sw $ra, 0($sp) - addi $sp, $sp, -4 - sw $fp, 0($sp) - addi $sp, $sp, -4 - move $fp, $sp - - lw $t7, 12($fp) # get the instance address - lw $t6, 0($t7) # get the type info address - lw $t5, 4($t6) # get the type name - # create the String class instance to return - li $a0, 8 - li $v0, 9 - syscall - - la $t1, String - sw $t1, 0($v0) - sw $t5, 4($v0) - - # calling conventions - addi $sp, $sp, 4 - lw $fp, 0($sp) - addi $sp, $sp, 4 - lw $ra, 0($sp) - - jr $ra substr_String: # calling conventions @@ -252,12 +416,10 @@ substr_String: lw $t7, 20($fp) # get the String instance address lw $t0, 4($t7) # get the value of the source String - lw $t7, 16($fp) # get the start parameter Int instance address - lw $t1, 4($t7) # get the value of the Int + lw $t1, 16($fp) # get the start parameter Int instance address - lw $t7, 12($fp) # get the length perameter Int instance address - lw $t2, 4($t7) # get the value of the Int - + lw $t2, 12($fp) # get the length perameter Int instance address + move $a0, $t2 addi $a0, $a0, 1 li $v0, 9 @@ -323,13 +485,7 @@ isvoid: li $t0, 1 isvoid_end: - li $a0, 8 - li $v0, 9 - syscall - - la $t1, Bool - sw $t1, 0($v0) - sw $t0, 4($v0) + move $v0, $t0 # calling conventions addi $sp, $sp, 4 @@ -390,17 +546,6 @@ length_String: addi $sp, $sp, 4 lw $t0, 0($sp) - - move $t0, $v0 - - # allocate space for the Int instace - li $a0, 8 - li $v0, 9 - syscall - - la $t1, Int - sw $t1, 0($v0) - sw $t0, 4($v0) # calling conventions addi $sp, $sp, 4 @@ -421,6 +566,9 @@ compare: lw $t0, 12($fp) lw $t1, 16($fp) + lw $t2, 20($fp) + + beqz $t2, compare_values lw $t3, 0($t0) @@ -468,12 +616,7 @@ compare: compare_end: - li $a0, 8 - li $v0, 9 - syscall - la $t1, Bool - sw $t1, 0($v0) - sw $t0, 4($v0) + move $v0, $t0 # calling conventions diff --git a/src/codegen/spim_visitor.py b/src/codegen/spim_visitor.py index 3ecedcb75..0381ca620 100644 --- a/src/codegen/spim_visitor.py +++ b/src/codegen/spim_visitor.py @@ -178,8 +178,7 @@ def visit(self, node: CILArgNode, frame): @visitor.when(CILIfGotoNode) def visit(self, node: CILIfGotoNode, frame): value_addr = frame.get_addr(node.var.lex) - self.add_line(f'lw $t1, {value_addr}') - self.add_line(f'lw $t0, 4($t1)') + self.add_line(f'lw $t0, {value_addr}') self.add_line(f'bne $t0, $zero, {node.label.id}') @visitor.when(CILGotoNode) @@ -264,22 +263,24 @@ def visit(self, node: CILVCallNode, frame): # the instance of type T is always the first argument to be passed to the function self.add_line(f'# calling the method {node.func} of type {node.type}') - if node.static: - self.add_line(f'la $t0, {node.type}') + if node.type in ['Bool', 'Int']: + self.add_line(f'la $v1, {node.func}_{node.type}') else: - instance = frame.arg_queue[0] - instance_addr = self.visit(instance, frame) # load into a register the address of the instance in the heap + if node.static: + self.add_line(f'la $t0, {node.type}') + else: + instance = frame.arg_queue[0] + instance_addr = self.visit(instance, frame) # load into a register the address of the instance in the heap - # register0 has the dynamic type address of the instance - # since every instance stores its type in the first word of the allocated memory - self.add_line(f'lw $t0, 0({instance_addr})') + # register0 has the dynamic type address of the instance + # since every instance stores its type in the first word of the allocated memory + self.add_line(f'lw $t0, 0({instance_addr})') + + # use the information of the static type to get the location of the method in memory + t = self.scope.types[node.type] + method_addr = t.get_method_addr(node.func, '$t0') + self.add_line(f'lw $v1, {method_addr}') - # use the information of the static type to get the location of the method in memory - t = self.scope.types[node.type] - method_addr = t.get_method_addr(node.func, '$t0') - - - self.add_line(f'lw $v1, {method_addr}') self.add_line(f'jal $v1') # calls the method and by convention methods return in $v0 for a in frame.arg_queue: self.gen_pop('$v1') @@ -304,15 +305,7 @@ def visit(self, node: CILLoadNode, frame): @visitor.when(CILNumberNode) def visit(self, node: CILNumberNode, frame): register = '$v0' - self.add_line(f'# Creating Int instance for atomic {node.lex}') - self.add_line(f'li $a0, 8') - self.add_line(f'li $v0, 9') - self.add_line(f'syscall') - - self.add_line(f'la $t0, Int') - self.add_line(f'li $t1, {node.lex}') - self.add_line(f'sw $t0, 0($v0)') - self.add_line(f'sw $t1, 4($v0)') + self.add_line(f'li $v0, {node.lex}') self.add_line(f'') return register @@ -341,18 +334,11 @@ def visit(self, node: CILPlusNode, frame): register0 = '$v0' self.add_line(f'# computes the sum of (node.left.to_string) and (node.right.to_string) and stores it at {register0}') self.visit(node.left, frame) # in $v0 is the address of the Int instance - self.add_line(f'lw $t0, 4($v0)') - self.gen_push('$t0') + self.gen_push('$v0') self.visit(node.right, frame) self.gen_pop('$t0') - self.add_line(f'lw $t1, 4($v0)') - self.add_line(f'add $t0, $t0, $t1') - self.add_line(f'li $a0, 8') - self.add_line(f'li $v0, 9') - self.add_line(f'syscall') - self.add_line(f'la $t1, Int') - self.add_line(f'sw $t1, 0($v0)') - self.add_line(f'sw $t0, 4($v0)') + self.add_line(f'move $t1, $v0') + self.add_line(f'add $v0, $t0, $t1') return register0 @visitor.when(CILMinusNode) @@ -360,39 +346,25 @@ def visit(self, node: CILMinusNode, frame): register0 = '$v0' self.add_line(f'# computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at {register0}') self.visit(node.left, frame) # in $v0 is the address of the Int instance - self.add_line(f'lw $t0, 4($v0)') - self.gen_push('$t0') + self.gen_push('$v0') self.visit(node.right, frame) - self.add_line(f'lw $t1, 4($v0)') self.gen_pop('$t0') - self.add_line(f'sub $t0, $t0, $t1') - self.add_line(f'li $a0, 8') - self.add_line(f'li $v0, 9') - self.add_line(f'syscall') - self.add_line(f'la $t1, Int') - self.add_line(f'sw $t1, 0($v0)') - self.add_line(f'sw $t0, 4($v0)') + self.add_line(f'move $t1, $v0') + self.add_line(f'sub $v0, $t0, $t1') return register0 @visitor.when(CILStarNode) def visit(self, node: CILStarNode, frame): register0 = '$v0' - self.add_line(f'# computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at {register0}') + self.add_line(f'# computes the product of (node.left.to_string) and (node.right.to_string) and stores it at {register0}') self.visit(node.left, frame) # in $v0 is the address of the Int instance - self.add_line(f'lw $t0, 4($v0)') - self.gen_push('$t0') + self.gen_push('$v0') self.visit(node.right, frame) - self.add_line(f'lw $t1, 4($v0)') self.gen_pop('$t0') + self.add_line(f'move $t1, $v0') self.add_line(f'mult $t0, $t1') - self.add_line(f'mflo $t0') - self.add_line(f'li $a0, 8') - self.add_line(f'li $v0, 9') - self.add_line(f'syscall') - self.add_line(f'la $t1, Int') - self.add_line(f'sw $t1, 0($v0)') - self.add_line(f'sw $t0, 4($v0)') + self.add_line(f'mflo $v0') return register0 @visitor.when(CILDivNode) @@ -400,71 +372,47 @@ def visit(self, node: CILDivNode, frame): register0 = '$v0' self.add_line(f'# computes the sub of (node.left.to_string) and (node.right.to_string) and stores it at {register0}') self.visit(node.left, frame) # in $v0 is the address of the Int instance - self.add_line(f'lw $t0, 4($v0)') - self.gen_push('$t0') + self.gen_push('$v0') self.visit(node.right, frame) - self.add_line(f'lw $t1, 4($v0)') self.gen_pop('$t0') + self.add_line(f'move $t1, $v0') self.add_line(f'div $t0, $t1') - self.add_line(f'mflo $t0') - self.add_line(f'li $a0, 8') - self.add_line(f'li $v0, 9') - self.add_line(f'syscall') - self.add_line(f'la $t1, Int') - self.add_line(f'sw $t1, 0($v0)') - self.add_line(f'sw $t0, 4($v0)') + self.add_line(f'mflo $v0') return register0 @visitor.when(CILLessNode) def visit(self, node: CILLessNode, frame): self.visit(node.left, frame) - self.add_line(f'move $t1, $v0') # get the address to the left Int instance - self.add_line(f'lw $t1, 4($t1)') # get the value of the instance - self.gen_push('$t1') + self.gen_push('$v0') self.visit(node.right, frame) self.gen_pop('$t1') self.add_line(f'move $t2, $v0') # get the address to the right Int instance - self.add_line(f'lw $t2, 4($t2)') # get the value of the instance - - - self.add_line(f'slt $t3, $t1, $t2') # l < r ? - - self.add_line(f'la $t4, Bool') - self.add_line(f'li $a0, 8') - self.add_line(f'li $v0, 9') - self.add_line('syscall') - self.add_line(f'sw $t4, 0($v0)') - self.add_line(f'sw $t3, 4($v0)') + self.add_line(f'slt $v0, $t1, $t2') # l < r ? return '$v0' @visitor.when(CILElessNode) def visit(self, node: CILElessNode, frame): self.visit(node.left, frame) - self.add_line(f'move $t1, $v0') # get the address to the left Int instance - self.add_line(f'lw $t1, 4($t1)') # get the value of the instance - - self.gen_push('$t1') + self.gen_push('$v0') self.visit(node.right, frame) self.gen_pop('$t1') self.add_line(f'move $t2, $v0') # get the address to the right Int instance - self.add_line(f'lw $t2, 4($t2)') # get the value of the instance self.add_line(f'slt $t4, $t2, $t1') # r < l? self.add_line(f'li $t3, 1') self.add_line(f'xor $t3, $t3, $t4') - self.add_line(f'andi $t3, $t3, 0x01') # get the last bit - - self.add_line(f'la $t4, Bool') - self.add_line(f'li $a0, 8') - self.add_line(f'li $v0, 9') - self.add_line('syscall') - self.add_line(f'sw $t4, 0($v0)') - self.add_line(f'sw $t3, 4($v0)') + self.add_line(f'andi $v0, $t3, 0x01') # get the last bit return '$v0' @visitor.when(CILEqualsNode) def visit(self, node: CILEqualsNode, frame): + + if node.ref: + self.add_line('li $t0, 1') + else: + self.add_line('li $t0, 0') + self.gen_push('$t0') self.visit(node.left, frame) self.gen_push('$v0') self.visit(node.right, frame) @@ -472,6 +420,7 @@ def visit(self, node: CILEqualsNode, frame): self.add_line('jal compare') self.gen_pop('$t0') self.gen_pop('$t0') + self.gen_pop('$t0') return '$v0' @@ -484,23 +433,45 @@ def visit(self, node: CILNotEqualsNode, frame): self.add_line('jal compare') self.gen_pop('$t0') self.gen_pop('$t0') - self.add_line('lw $t0, 4($v0)') + self.add_line('move $t0, $v0') self.add_line('li $t1, 1') self.add_line('xor $t0, $t0, $t1') - self.add_line('andi $t0, $t0, 0x01') - self.add_line('sw $t0, 4($v0)') + self.add_line('andi $v0, $t0, 0x01') return '$v0' @visitor.when(CILNotNode) def visit(self, node: CILNotNode, frame): self.visit(node.var, frame) - self.add_line('lw $t0, 4($v0)') + self.add_line('move $t0, $v0') self.add_line('li $t1, 1') self.add_line('xor $t0, $t0, $t1') self.add_line('andi $t0, $t0, 0x01') + self.add_line('move $v0, $t0') + return '$v0' + + + @visitor.when(CILBoxNode) + def visit(self, node: CILBoxNode, frame): + print("Boxing shit") + self.add_line('# boxing some stuff') + self.visit(node.var, frame) + self.add_line('move $t0, $v0 # boxing some stuff') + self.add_line('li $a0, 8') + self.add_line('li $v0, 9') + self.add_line('syscall') + self.add_line(f'la $t1, {node.type}') + self.add_line('sw $t1, 0($v0)') self.add_line('sw $t0, 4($v0)') return '$v0' + @visitor.when(CILUnboxNode) + def visit(self, node: CILUnboxNode, frame): + self.visit(node.var, frame) + self.add_line('lw $t0, 4($v0) # unbox something') + self.add_line('move $v0, $t0') + return '$v0' + + diff --git a/src/codegen/utils.py b/src/codegen/utils.py index 65b44fce9..56d2a645d 100644 --- a/src/codegen/utils.py +++ b/src/codegen/utils.py @@ -1,3 +1,4 @@ +from cmath import exp from semantics.semantic import IntType, ObjectType, StringType, BoolType from .ast_CIL import * from collections import deque @@ -158,12 +159,10 @@ def create_init_class(self, attributes, locals): for id, type, expr, inst in attributes: if expr is not None: + _expr, _ = expr instructions.extend(inst) - if not isinstance(expr, CILAtomicNode): - variable = CILVariableNode(self.add_new_local(type)) - instructions.append(CILAssignNode(variable, expr)) - else: - variable = expr + variable = CILVariableNode(self.add_new_local(type)) + instructions.append(CILAssignNode(variable, _expr)) elif type == 'Int': variable = CILNumberNode(0) elif type == 'String': @@ -175,6 +174,11 @@ def create_init_class(self, attributes, locals): else: variable = None + if expr is not None: + _, t = expr + if type == 'Object' and not t.ref: + instructions.append(CILAssignNode(variable, CILBoxNode(variable, t.name))) + if variable is not None: instructions.append(CILSetAttributeNode(CILVariableNode(f'self_{self.current_class}'), self.current_class, CILVariableNode(id), variable)) diff --git a/src/cool.py b/src/cool.py index b304c7441..c91e87887 100644 --- a/src/cool.py +++ b/src/cool.py @@ -51,6 +51,8 @@ #print(cil) cil_codegen = CILCodegen() code = cil_codegen.visit(cil) +with open(f'{input_file[:-3]}.cil', 'w') as f: + f.write(code) mips_scope_builder = MIPSScopeBuilder() @@ -61,6 +63,5 @@ #print(mips_codegen.code) with open(f'{input_file[:-3]}.mips', 'w') as f: f.write(mips_codegen.code) -with open(f'{input_file[:-3]}.cil', 'w') as f: - f.write(code) + exit(0) diff --git a/src/semantics/semantic.py b/src/semantics/semantic.py index 4d9748406..91494b9ac 100644 --- a/src/semantics/semantic.py +++ b/src/semantics/semantic.py @@ -43,6 +43,7 @@ def __init__(self, name:str): self.attributes = [] self.methods = [] self.parent = None + self.ref = True def set_parent(self, parent): self.parent = parent @@ -172,6 +173,7 @@ class IntType(Type): def __init__(self): Type.__init__(self, 'Int') Type.set_parent(self, ObjectType()) + self.ref = False def __eq__(self, other): return other.name == self.name or isinstance(other, IntType) @@ -190,6 +192,7 @@ class BoolType(Type): def __init__(self): Type.__init__(self, 'Bool') Type.set_parent(self, ObjectType()) + self.ref = False def __eq__(self, other): return other.name == self.name or isinstance(other, BoolType) From 3a69b0ba52ff73a8c591d34247e306c43d41e0a9 Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Sat, 12 Mar 2022 05:03:43 -0500 Subject: [PATCH 74/81] Updating report with value types discussion --- doc/report/report.md | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/doc/report/report.md b/doc/report/report.md index 09d97c27e..e76b6c12b 100644 --- a/doc/report/report.md +++ b/doc/report/report.md @@ -404,7 +404,45 @@ El segundo recorrido se encarga de generar el código MIPS del programa, la idea - Retorno de operadores: Dado que los operadores tienen un tipo de retorno bien definido debido a las reglas de tipado de COOL los operadores se encarga de almacenar el resultado de la operacion en instancias de la clase de su tipo, las operaciones aritméticas crean instancias de tipo `Int` y las operaciones de comparación de tipo `Bool`. - ​ +**Tipos por valor** + +En la especificación de COOL todos los tipos del lenguaje se especifican como tipos por referencia, por motivos de mejorar la eficiencia del uso de la memoria se implementaron los tipos básicos `Int` y `Bool` como tipos por valor lo cual nos brinda ciertos beneficios: + +- Al ser un tipo por valor para cada instancia solo se guarda en memoria su valor, a diferencia de si fuera un tipo por referencia se guardaría su valor, el puntero a la estructura `TypeInfo` y la dirección de memoria de la instancia. +- Debido a que no se implementaron mecanismos de liberación de memoria dinámica automáticos esto ayuda a liberar de forma automática la memoria utilizada dado que estos valores se almacenan en la pila. +- Las operaciones son más rápidas dado que no hay que estar redireccionando en memoria dinámica para buscar los valores. + +Los principales problemas a resolver durante la implementación fueron: + +- Upcasting/Downcasting: + + ``` + (* Upcasting *) + a : Object <- 10; + + (* Downcasting *) + b : Int <- case a of + x : Int => x; + esac; + ``` + + Para permitir el upcasting/downcasting entre tipos que se representan de forma distinta en memoria utilizamos la información obtenida durante el análisis semántico, asociamos a cada variable de CIL su tipo estático, así tenemos información sobre si lo que almacena esa variable es un valor o una referencia. Luego cuando se genera una asignación de CIL se comprueba el tipo estático del miembro izquierdo y derecho, para los casos `(RType, RType)` y `(VType, VType)` se procede a copiar el valor de una variable hacia la otra. En el caso `(RType, VType)` se realiza el boxing (`CILBoxNode`) del tipo por valor, es decir se guarda el valor que está en la pila en una instancia de la clase `VType` la cual solo se instancia para estos casos. La definición de estas clases (`Int` y `Bool`) se realizó de acuerdo a la especificación de COOL y tienen un atributo llamado `value` para almacenar el valor. En el caso (`VType, RType`) se realiza el unboxing (`CILUnboxNode`) de la instancia de la clase `VType` correspondiente retornando el valor de su atributo `value`. + + > Nota: `RType` se refiere a un tipo por referencia y `VType` a un tipo por valor + +- Expresión case + + La implementación propuesta de la expresión case utilizaba la instrucción `TYPEOF` para poder elegir la rama a evaluar, sin embargo, en los tipos por valor no tenemos una referencia a la información del tipo por tanto se tuvo que tratar como un caso especial, para ello se aprovechó el hecho de que las ramas se recorren en orden topológico inverso según su tipo y por tanto la primera rama válida para evaluar es la rama a escoger dado que los tipos por valor en este caso no permiten que hereden de ellos. + + Cuando el tipo de retorno del case es `Object` debemos realizar un casteo antes de retornar la evaluación de una rama que retorne un tipo por valor, no obstante esto se resuelve con el boxing/unboxing automático discutido anteriormente. + +- Dispatch + + ``` + (1).type_name() + ``` + + Los tipos por valor pueden usar los métodos heredados de `Object` pero no tienen acceso a la información del tipo para obtener la dirección del método, para resolver esto implementamos métodos built-in para los tipos por valor, estos no sobrescriben los de la implementación de su clase dado que los métodos de una clase `VType` tienen el mismo identificador que los de la clase `Object` al ser heredados. Durante la generación de código MIPS sabemos si la variable de CIL ejecutando un dispatch es una variable de tipo por valor o por referencia y hacemos el binding dinámico de los métodos o llamamos a los built-int de los tipos por valor según corresponda. From 93ff535330999e3db99460bb7014480eec46c1aa Mon Sep 17 00:00:00 2001 From: Amy Date: Sat, 12 Mar 2022 11:35:01 -0500 Subject: [PATCH 75/81] change report --- doc/report.pdf | Bin 191783 -> 212238 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/report.pdf b/doc/report.pdf index 0b698dca5b3c346d01be03630246ffcd3d4d98a0..3b76f3b4661e95951c430c28a773d20749d84d8e 100644 GIT binary patch delta 147959 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%0A~(VA5uC3gBWct3n89*m@lj(kVczq68z%>yNaiI) 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 Date: Sat, 12 Mar 2022 14:45:14 -0500 Subject: [PATCH 76/81] Add case optimization with O(n) running time with n branches --- src/codegen/ast_CIL.py | 10 +++++-- src/codegen/cil_codegen.py | 8 ++++- src/codegen/generate_ast.py | 39 +++++++------------------ src/codegen/spim_scope.py | 2 +- src/codegen/spim_visitor.py | 58 ++++++++++++++++++++++++------------- src/codegen/utils.py | 52 +++++++++++++++++++++------------ 6 files changed, 98 insertions(+), 71 deletions(-) diff --git a/src/codegen/ast_CIL.py b/src/codegen/ast_CIL.py index 781ec2bf8..e8205fa95 100644 --- a/src/codegen/ast_CIL.py +++ b/src/codegen/ast_CIL.py @@ -23,10 +23,11 @@ def __str__(self): class CILTypeNode(CILNode): - def __init__(self, id, attributes, methods): + def __init__(self, id, attributes, methods, hierarchy_branch): self.id = id self.attributes = attributes self.methods = methods + self.hierarchy_branch = hierarchy_branch def __str__(self): text = "TypeNode:\n" @@ -381,4 +382,9 @@ def __init__(self, left, right, ref): class CILNotNode(CILExpressionNode): def __init__(self, var): - self.var = var \ No newline at end of file + self.var = var + +class CILConformsNode(CILExpressionNode): + def __init__(self, left, right): + self.left = left + self.right = right \ No newline at end of file diff --git a/src/codegen/cil_codegen.py b/src/codegen/cil_codegen.py index 90d17bf47..a0c578b21 100644 --- a/src/codegen/cil_codegen.py +++ b/src/codegen/cil_codegen.py @@ -222,4 +222,10 @@ def visit(self, node: CILNotEqualsNode): @visitor.when(CILNotNode) def visit(self, node: CILNotNode): - return f'~ {self.var.lex}' \ No newline at end of file + return f'~ {self.var.lex}' + + @visitor.when(CILConformsNode) + def visit(self, node: CILConformsNode): + l = self.visit(node.left) + r = self.visit(node.right) + return f'{l} CONFORMS TO {r}' \ No newline at end of file diff --git a/src/codegen/generate_ast.py b/src/codegen/generate_ast.py index bd8539c72..296040ce5 100644 --- a/src/codegen/generate_ast.py +++ b/src/codegen/generate_ast.py @@ -34,11 +34,10 @@ def visit(self, node): self.scope.functions.append(CILFuncNode('main', [], locals, instructions)) self.scope.data.append(CILDataNode(f'str_empty', "\"\"")) - table_ = bfs_init(self.scope.context) - self.table = table(table_) + types_ts, types_heirs = get_ts(self.scope.context) self.types_ts = types_ts - self.types_heirs = types_heirs + self.hierarchy_branch = hierarchy_branch(self.scope.context) infos = self.scope.infos = {} for type in types_ts: t = TypeInfo() @@ -58,7 +57,7 @@ def visit(self, node): types.append(type) # Add built-in types and functions - types.extend(self.scope.create_builtin_types()) + types.extend(self.scope.create_builtin_types(self.hierarchy_branch)) return CILProgramNode(types, self.scope.data, self.scope.functions) @@ -102,7 +101,7 @@ def visit(self, node): init_class = self.scope.create_init_class(features, locals) self.scope.functions.append(init_class) - return CILTypeNode(node.id, self.scope.attributes.values(), methods) + return CILTypeNode(node.id, self.scope.attributes.values(), methods, self.hierarchy_branch[node.id]) @visitor.when(AttrDeclarationNode) def visit(self, node): @@ -271,31 +270,13 @@ def visit(self, node): # use the topological sort computed in the ProgramNode to sort the types of the branches of the case case_types = [case.type for case in node.cases] case_types = sorted(case_types, key=lambda t: types_ts_pos[t], reverse=True) - least_ancestor = {} - case_labels = {} + for type in case_types: - least_ancestor[type] = type - case_labels[type] = CILLabelNode(f'case_{self.scope.case_count}_{type}') - try: - queue = self.types_heirs[type].copy() # place the children class - except KeyError: # last type in a branch of the Type Tree - queue = None - while queue: # travel to all descendants - descendant = queue.pop() - try: - # this type was visited by a type that is later in - # the topological order so is more close to the type in the class hierarchy - least_ancestor[descendant] - continue - except KeyError: - least_ancestor[descendant] = type - try: - queue = self.types_heirs[descendant] + queue - except KeyError: - pass - for type, lancestor in least_ancestor.items(): - self.scope.instructions.append(CILAssignNode(type_comp_var, CILEqualsNode(type_expr_var, CILTypeConstantNode(type), ref))) - self.scope.instructions.append(CILIfGotoNode(type_comp_var, case_labels[lancestor])) + label = CILLabelNode(f'case_{self.scope.case_count}_{type}') + + + self.scope.instructions.append(CILAssignNode(type_comp_var, CILConformsNode(type_expr_var, CILTypeConstantNode(type)))) + self.scope.instructions.append(CILIfGotoNode(type_comp_var, label)) result_name = self.scope.add_new_local(node.computed_type.name) var_result = CILVariableNode(result_name) diff --git a/src/codegen/spim_scope.py b/src/codegen/spim_scope.py index dc0077985..4c462e05b 100644 --- a/src/codegen/spim_scope.py +++ b/src/codegen/spim_scope.py @@ -40,7 +40,7 @@ def get_attr_addr(self, attr, register): def get_method_addr(self, method, register): offset = self.methods_offset[method] - return f'{(offset + 2) * WSIZE}({register})' + return f'{(offset + 4) * WSIZE}({register})' def __str__(self): r = '--------------------Type----------------\n' diff --git a/src/codegen/spim_visitor.py b/src/codegen/spim_visitor.py index 0381ca620..820bb03d9 100644 --- a/src/codegen/spim_visitor.py +++ b/src/codegen/spim_visitor.py @@ -73,12 +73,13 @@ def visit(self, node: CILTypeNode, frame): self.add_line(".data") self.set_tabs(0) t = self.scope.types[node.id] + discovery_time, finish_time = node.hierarchy_branch methods_str = ' '.join(m.function_id for m in node.methods) assert len(node.methods) == len(t.methods_offset) self.add_line(f"_{node.id}: .asciiz \"{node.id}\\n\"") self.add_line("\t.data") self.add_line("\t.align 4") - self.add_line(f"{node.id}: .word {t.size} _{node.id} {methods_str}") + self.add_line(f"{node.id}: .word {t.size} _{node.id} {discovery_time} {finish_time} {methods_str}") self.add_line('') @visitor.when(CILDataNode) @@ -235,18 +236,9 @@ def visit(self, node: CILAllocateNode, frame): @visitor.when(CILTypeOfNode) # Get the dynamic type of an instance def visit(self, node: CILTypeOfNode, frame): - self.add_line('li $a0, 8') - self.add_line('li $v0, 9') - self.add_line('syscall') - self.add_line('move $t0, $v0') # save the address of the allocated space - self.visit(node.var, frame) - self.add_line('la $t1, type') - self.add_line('lw $t2, 0($v0)') # get the type of the var - self.add_line('sw $t1, 0($t0)') - self.add_line('sw $t2, 4($t0)') - self.add_line('move $v0, $t0') + self.add_line('lw $v0, 0($v0)') # get the type of the var return '$v0' @visitor.when(CILCallNode) # I don't think this is necessary @@ -319,14 +311,8 @@ def visit(self, node: CILVariableNode, frame): @visitor.when(CILTypeConstantNode) def visit(self, node: CILTypeConstantNode, frame): - self.add_line('li $a0, 8') - self.add_line('li $v0, 9') - self.add_line('syscall') - - self.add_line('la $t0, type') - self.add_line(f'la $t1, {node.lex}') - self.add_line('sw $t0, 0($v0)') - self.add_line('sw $t1, 4($v0)') + + self.add_line(f'la $v0, {node.lex}') return '$v0' @visitor.when(CILPlusNode) @@ -396,7 +382,7 @@ def visit(self, node: CILElessNode, frame): self.gen_push('$v0') self.visit(node.right, frame) self.gen_pop('$t1') - self.add_line(f'move $t2, $v0') # get the address to the right Int instance + self.add_line(f'move $t2, $v0') # get the value of the right Int instance self.add_line(f'slt $t4, $t2, $t1') # r < l? @@ -471,6 +457,38 @@ def visit(self, node: CILUnboxNode, frame): self.add_line('move $v0, $t0') return '$v0' + @visitor.when(CILConformsNode) + def visit(self, node: CILConformsNode, frame): + self.visit(node.left, frame) + self.gen_push('$v0') + self.visit(node.right, frame) + self.add_line('move $t1, $v0') + self.gen_pop('$t0') + + #Load discovery time of left + self.add_line('# Check conform') + + self.add_line('lw $t0, 8($t0)') + self.add_line('lw $t2, 8($t1)') #Load discovery time of rigth + self.add_line('lw $t3, 12($t1)') #Load finish time of rigth + + self.add_line('slt $t1, $t0, $t2') # first condition + self.add_line('li $t2, 1') + self.add_line(f'xor $t1, $t1, $t2') + self.add_line(f'andi $t1, $t1, 0x01') # get the last bit + + + self.add_line(f'slt $t4, $t3, $t0') # r < l? + self.add_line(f'li $t3, 1') + self.add_line(f'xor $t3, $t3, $t4') + self.add_line(f'andi $v0, $t3, 0x01') # get the last bit + self.add_line('and $v0, $v0, $t1') + return '$v0' + + + + + diff --git a/src/codegen/utils.py b/src/codegen/utils.py index 56d2a645d..278ea3203 100644 --- a/src/codegen/utils.py +++ b/src/codegen/utils.py @@ -67,7 +67,7 @@ def ret_type_of_method(self, name_meth, name_class): method = type_class.get_method(name_meth) return method.return_type.name - def create_builtin_types(self): + def create_builtin_types(self, hierarchy_branch): types = [] obj_methods = [ @@ -76,7 +76,7 @@ def create_builtin_types(self): CILMethodNode('type_name', 'type_name_Object'), CILMethodNode('copy', 'copy_Object'), ] - types.append(CILTypeNode('Object', [], obj_methods)) + types.append(CILTypeNode('Object', [], obj_methods, hierarchy_branch['Object'])) init_Object = CILFuncNode( 'Init_Object', [CILParamNode('self', None)], @@ -90,7 +90,7 @@ def create_builtin_types(self): CILMethodNode('type_name', 'type_name_Object'), CILMethodNode('copy', 'copy_Object'), ] - types.append(CILTypeNode('Int', [CILAttributeNode('value', None)], int_methods)) + types.append(CILTypeNode('Int', [CILAttributeNode('value', None)], int_methods, hierarchy_branch['Int'])) init_int = CILFuncNode( 'Init_Int', [CILParamNode('self', None), CILParamNode('v', None)], @@ -107,7 +107,7 @@ def create_builtin_types(self): CILMethodNode('concat', 'concat_String'), CILMethodNode('substr', 'substr_String'), ] - types.append(CILTypeNode('String', [CILAttributeNode('value', None)], str_methods)) + types.append(CILTypeNode('String', [CILAttributeNode('value', None)], str_methods, hierarchy_branch['String'])) init_string = CILFuncNode( 'Init_String', [CILParamNode('self', None), CILParamNode('v', None)], @@ -121,7 +121,7 @@ def create_builtin_types(self): CILMethodNode('type_name', 'type_name_Object'), CILMethodNode('copy', 'copy_Object'), ] - types.append(CILTypeNode('Bool', [CILAttributeNode('value', None)], bool_methods)) + types.append(CILTypeNode('Bool', [CILAttributeNode('value', None)], bool_methods, hierarchy_branch['Bool'])) init_bool = CILFuncNode( 'Init_Bool', [CILParamNode('self', None), CILParamNode('v', None)], @@ -139,7 +139,7 @@ def create_builtin_types(self): CILMethodNode('in_string', 'in_string_IO'), CILMethodNode('in_int', 'in_int_IO'), ] - types.append(CILTypeNode('IO', [], io_methods)) + types.append(CILTypeNode('IO', [], io_methods, hierarchy_branch['IO'])) init_IO = CILFuncNode( 'Init_IO', [CILParamNode('self', None)], @@ -223,18 +223,34 @@ def dfs_visit_ts(context, u, list, heirs, visited): list.append(u) -def bfs_init (context) : - table = {} - d = {} - d = init(context, d) - for c in context.types.values(): - list = deque() - list.append(c) - visit = [] - m = bfs( list, d.copy() , c,{}) - - table [c.name] = m - return table +def hierarchy_branch(context): + heirs = {} + + for type in context.types.values(): + if type.parent is not None: + try: + heirs[type.parent.name].append(type.name) + except: + heirs[type.parent.name] = [type.name] + + branch = {} + + hierarchy_branch_visit(context, branch, heirs, "Object", 0) + return branch + +def hierarchy_branch_visit(context, branch, heirs, type, time): + discovery_time = time + finish_time = discovery_time + try: + for heir in heirs[type]: + finish_time = hierarchy_branch_visit(context, branch, heirs, heir, finish_time + 1) + except: + pass + + branch[type] = (discovery_time, finish_time) + return finish_time + + def bfs ( list, d ,s , m ): d[s.name] = 0 From 5bf53169145ba7c25d672cd54a8ea8df9aa67c85 Mon Sep 17 00:00:00 2001 From: Vitico99 Date: Sat, 12 Mar 2022 14:46:03 -0500 Subject: [PATCH 77/81] Update report with case optimization --- doc/report/report.md | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/doc/report/report.md b/doc/report/report.md index e76b6c12b..ad1b5dd83 100644 --- a/doc/report/report.md +++ b/doc/report/report.md @@ -235,24 +235,6 @@ Un FunctionDeclarationNode en el AST devuelto por el parser se convierte en CIL Como se conoce en el lenguaje COOL solo existen expresiones y en el lenguaje CIL se tienen tanto expresiones como instrucciones, por tanto una expresión COOL se traduce a una lista de instrucciones CIL ya sean de asignación o de cambio del valor de un atributo, ifgoto, goto, label, entre otras. Una asignación en CIL puede ser la traducción de una `asignación` de COOL o puede ser creada para llevar una expresión de COOL distinta de asignación a una instrucción en CIL, un ejemplo es cuando queremos realizar una operación suma en COOL y una de las partes (izquierda o derecha) no es un nodo atómico, debemos separar en en una asignación a una nueva variable creada en CIL que guarde la expresión de esa parte que y luego a esta sumarla con la parte que si es atómica, lo mismo pasa para todas las expresiones binarias. -Un caso de especial consideración dentro de las expresiones de COOL es el `case`, el comportamiento esperado es que se compute el tipo dinámico de la expresión de del `case` y se seleccione la rama del tipo ancestro más cercano a dicho tipo. Para resolver esto se recorrieron las ramas del case en orden topológico inverso de acuerdo a su tipo, por lo que visitamos los tipos más especializadas primero, y por cada de rama generamos código para que los descendientes que no tienen una rama asignada sean dirigidos a esta rama. Al final se genera el código de la expresión resultado de cada rama. A continuación presentamos un sencillo pseudocódigo con la idea general del algoritmo - -``` -branches = {} -for type in reversed_toplogic_order(case.types): - branches[type] = type - for heir in type.heirs(): - try: - branches[heir] - except: - branches[heir] = type - -for type, branch_type in branches: - assign_branch(type, branch_type) - -for branch in case: - generate_code() -``` La conversión de la lógica del `loop`, así como la del `conditional`, a código CIL fue muy sencilla. Con la ayuda de los labels y de las expresiones ifGoto y goto se decidía cuales eran las próximas instrucciones a ejecutar haciendo saltos en el código. @@ -278,7 +260,7 @@ El primer recorrido del AST del lenguaje CIL se realiza con el objetivo de crear A continuación definiremos las ideas seguidas para la representación de los tipos en memoria. 1. El valor de los atributos de una clase son independientes para cada instancia de la clase, sin embargo, los métodos de la clase son globales para todas las instancias. Esto permite separar la información global del tipo en memoria estática y la información de las instancias en memoria dinámica. -2. Los identificadores de las clases en COOL son únicos y por tanto los identificadores de los tipos también lo son. Esto permite utilizar su nombre como alias a la dirección de memoria donde se almacena la información del tipo. La información que se decidió almacenar sobre los tipos fue su tamaño (para la creación dinámica de instancias mediante `copy`), su representación como string (para la implementación de `type_name`) y las direcciones de los métodos del tipo. +2. Los identificadores de las clases en COOL son únicos y por tanto los identificadores de los tipos también lo son. Esto permite utilizar su nombre como alias a la dirección de memoria donde se almacena la información del tipo. La información que se decidió almacenar sobre los tipos fue su tamaño (para la creación dinámica de instancias mediante `copy`), su representación como string (para la implementación de `type_name`), el tiempo de descubrimiento y finalización en el grafo de la jerarquía de tipos (implementación del case), y las direcciones de los métodos del tipo. ```mips .data @@ -328,7 +310,7 @@ class TypeInfo: def get_method_addr(self, method, register): offset = self.methods_offset[method] - return f'{(offset + 1) * WSIZE}({register})' + return f'{(offset + 3) * WSIZE}({register})' ``` Otro aspecto fundamental a tener en cuenta durante la generación de MIPS es el manejo de memoria durante el llamado a funciones, para la resolución de este problema es común la adopción de convenciones por lo que en este caso nos hemos adherido a las convenciones propuestas por `gcc`. Estas convenciones se definen en torno a una estructura llamada *procedure call frame* la cual definimos a continuación. @@ -446,6 +428,12 @@ Los principales problemas a resolver durante la implementación fueron: +**Optimización del case** + + +Un caso de especial consideración dentro de las expresiones de COOL es el `case`, el comportamiento esperado es que se compute el tipo dinámico de la expresión de del `case` y se seleccione la rama del tipo ancestro más cercano a dicho tipo. Para resolver esto se recorre el árbol de clases iniciando por Object utilizando un DFS y para cada clase se almacena su tiempo de descrubimiento `dt` y tiempo de finalización `ft`, estos tiempos se guardan en la estructura `TypeInfo` que se almacena en memoria estática para cada tipo. Luego recorremos las ramas del case en orden descendente de acuerdo a su tiempo de descubrimiento y comprobamos si el tipo de la expresión del case (obtenido mediante una operación `TYPEOF`) conforma con el tipo de dicha rama. Esto se traduce a la creación de un `CILConformsNode` el cual cuando es procesado de la siguiente forma `T1 CONFORMS TO T2 <=> dt(T2) <= dt(T1) <= ft(T2)`, dado que el `dt` y `ft` se almacenan en la memoria esta comprobación se realiza en $\Omicron(1)$, como se recorre en orden descendente de acuerdo al `dt` la primera rama que cumpla esta condición es el ancestro más cercano, dado que a lo sumo debemos recorrer todas las ramas del case esto es $\Omicron(n)$ donde $n$ es la cantidad de ramas. + + From cc99b48bd1bc834a2c875230766c154fd2095dce Mon Sep 17 00:00:00 2001 From: Victor Manuel <61758132+Vitico99@users.noreply.github.com> Date: Sat, 12 Mar 2022 14:48:46 -0500 Subject: [PATCH 78/81] Update memory structure images in report --- doc/report/inheritance_memory.png | Bin 28326 -> 33050 bytes doc/report/memory.png | Bin 12369 -> 12591 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/report/inheritance_memory.png b/doc/report/inheritance_memory.png index 8cecf34f19802e99a189e66c416abc2173ba7d2b..3f5a006501c1d30b3f8e4a720af0f89219f0b9bd 100644 GIT binary patch literal 33050 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 WU#l57?ZF3x-B8y2BkP*!qyGU@a{Y$@ literal 28326 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 l07V8~)&0c3u1dRp{{9Laxo|SagagdqH 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 v{%BmZ0;1o|FDd1_7qye4;6HF5=k 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 literal 12369 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 lgfz#Q Date: Sat, 12 Mar 2022 15:41:09 -0500 Subject: [PATCH 79/81] Add report in pdf format --- doc/report.pdf | Bin 212238 -> 224687 bytes doc/report/report.md | 3 +-- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/report.pdf b/doc/report.pdf index 3b76f3b4661e95951c430c28a773d20749d84d8e..e8d2a45795f7b3702155279121ec20caafc9451e 100644 GIT binary patch delta 184941 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 z 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