def init_deklarator(self, inherited_type): curr_line = self.lines._iter pprint("# init_deklarator") pprint(self.lines.get_line()) if self.check_expressions(["<izravni_deklarator>"]): tmp = self.izravni_deklarator(inherited_type) if self.terminate: return tmp expr, num = tmp if expr.is_const: return self.parse_error(curr_line) elif self.check_expressions(["<izravni_deklarator>", "OP_PRIDRUZI", "<inicijalizator>"]): global currLabel tmp = self.izravni_deklarator(inherited_type) if self.terminate: return tmp expr, num = tmp self.assert_leaf("OP_PRIDRUZI") tmp = self.inicijalizator() outputCode.addCommandToFunction(currFunction, 'LOAD {}, ({})'.format('R' + str(currRegister), currLabel)) currLabel = None if self.terminate: return tmp expr2, num2 = tmp if not expr.is_array and not expr2.is_function: if not expr == expr2: return self.parse_error(curr_line) if not expr.is_array and expr2.is_function: if not expr == expr2.get_return_type(): return self.parse_error(curr_line) elif expr.is_array: if not num >= num2: return self.parse_error(curr_line) if type(expr2) is list: _expr = Expr(expr) _expr.is_array = False for e in expr2: if not e == _expr: return self.parse_error(curr_line) else: if not expr2 == expr: return self.parse_error(curr_line) else: return self.parse_error(curr_line)
def init_deklarator(self, inherited_type): curr_line = self.lines._iter pprint("# init_deklarator") pprint(self.lines.get_line()) if self.check_expressions(["<izravni_deklarator>"]): tmp = self.izravni_deklarator(inherited_type) if self.terminate: return tmp expr, num = tmp if expr.is_const: return self.parse_error(curr_line) elif self.check_expressions(["<izravni_deklarator>", "OP_PRIDRUZI", "<inicijalizator>"]): tmp = self.izravni_deklarator(inherited_type) if self.terminate: return tmp expr, num = tmp self.assert_leaf("OP_PRIDRUZI") tmp = self.inicijalizator() if self.terminate: return tmp expr2, num2 = tmp if not expr.is_array and not expr2.is_function: if not expr == expr2: return self.parse_error(curr_line) if not expr.is_array and expr2.is_function: if not expr == expr2.get_return_type(): return self.parse_error(curr_line) elif expr.is_array: if not num >= num2: return self.parse_error(curr_line) if type(expr2) is list: _expr = Expr(expr) _expr.is_array = False for e in expr2: if not e == _expr: return self.parse_error(curr_line) else: if not expr2 == expr: return self.parse_error(curr_line) else: return self.parse_error(curr_line)
def postfiks_izraz(self): curr_line = self.lines._iter pprint("# postfiks_izraz") pprint(self.lines.get_line()) if self.check_expressions(["<postfiks_izraz>", "L_UGL_ZAGRADA", "<izraz>", "D_UGL_ZAGRADA"]): expr = self.postfiks_izraz() _expr = Expr(expr) if not _expr.is_array: return self.parse_error(curr_line) ## We are accessing an element of this array so the return type is not array _expr.is_array = False self.assert_leaf("L_UGL_ZAGRADA") if not self.izraz() == Expr("INT"): return self.parse_error(curr_line) self.assert_leaf("D_UGL_ZAGRADA") if _expr.is_const: return _expr else: return _expr.set_to_lexpr() elif self.check_expressions(["<postfiks_izraz>", "L_ZAGRADA", "D_ZAGRADA"]): expr = self.postfiks_izraz() self.assert_leaf("L_ZAGRADA") self.assert_leaf("D_ZAGRADA") if not expr.is_function or not expr.is_function_from([Expr("VOID")]): return self.parse_error(curr_line) ret = expr.get_return_type() if len(ret) != 1: raise Exception("This should not happen") else: return ret[0] elif self.check_expressions(["<postfiks_izraz>", "L_ZAGRADA", "<lista_argumenata>", "D_ZAGRADA"]): expr = self.postfiks_izraz() self.assert_leaf("L_ZAGRADA") expr2 = self.lista_argumenata() self.assert_leaf("D_ZAGRADA") if not expr.is_function or not expr.is_function_from(expr2): return self.parse_error(curr_line) ret = expr.get_return_type() if len(ret) != 1: raise Exception("This should not happen") else: return ret[0] elif self.check_expressions(["<postfiks_izraz>", "OP_INC"]): expr = self.postfiks_izraz() self.assert_leaf("OP_INC") if not expr.is_lexpr or not expr == Expr("INT"): return self.parse_error(curr_line) else: return Expr("INT") elif self.check_expressions(["<postfiks_izraz>", "OP_DEC"]): expr = self.postfiks_izraz() self.assert_leaf("OP_DEC") if not expr.is_lexpr or not expr == Expr("INT"): return self.parse_error(curr_line) else: return Expr("INT") elif self.check_expressions(["<primarni_izraz>"]): return self.primarni_izraz() else: return self.parse_error(curr_line)