def primarni_izraz(self): curr_line = self.lines._iter pprint("# primarni_izraz") pprint(self.lines.get_line()) if self.check_expressions(["IDN"]): idn = self.assert_leaf("IDN") if self.table.contains(idn): return self.table.get_var(idn) elif self.table.is_JUST_declared(idn): return self.table.get_function(idn) else: return self.parse_error(curr_line) elif self.check_expressions(["BROJ"]): expr = self.assert_leaf("BROJ") if int(expr) < -2**31 or int(expr) >= 2**31: return self.parse_error(curr_line) return Expr("INT") elif self.check_expressions(["ZNAK"]): expr = self.assert_leaf("ZNAK") if not len(expr) == 3 or ord(expr[1]) < 0 or ord(expr[1]) > 255: return self.parse_error(curr_line) return Expr("CHAR") elif self.check_expressions(["NIZ_ZNAKOVA"]): expr = self.assert_leaf("NIZ_ZNAKOVA") if not is_valid_char_array(expr): return self.parse_error(curr_line) return Expr("CHAR", is_array = True) elif self.check_expressions(["L_ZAGRADA", "<izraz>", "D_ZAGRADA"]): self.assert_leaf("L_ZAGRADA") expr = self.izraz() self.assert_leaf("D_ZAGRADA") return expr else: return self.parse_error(curr_line)
def primarni_izraz(self): curr_line = self.lines._iter pprint("# primarni_izraz") pprint(self.lines.get_line()) if self.check_expressions(["IDN"]): idn = self.assert_leaf("IDN") global ide_fja if ide_fja: #zasad zanemarujemo varijable.. outputCode.addCommandToFunction(currFunction, 'CALL F_{}'.format(str(idn))) if self.table.contains(idn): idnValue = self.table.get_var(idn) currRegister = outputCode.registers[idn] nameReg = 'R' + str(currRegister) if not r5: outputCode.addCommandToFunction(currFunction, 'MOVE {}, R6'.format(nameReg)) # zapravo, mozemo ovo ostavit al treba nam i stog, za zbrajanje itd. outputCode.addCommandToFunction(currFunction, 'PUSH R6') # treba if al neka if r5: outputCode.addCommandToFunction(currFunction, 'PUSH R5') return idnValue elif self.table.is_JUST_declared(idn): #print('Prepozno je da sad fja ide') return self.table.get_function(idn) else: return self.parse_error(curr_line) elif self.check_expressions(["BROJ"]): global currLabel expr = self.assert_leaf("BROJ") num = int(expr) currLabel = outputCode.generateLabel( "DW %D {}".format( num*currSign ) ) # sazad tu pisemo dw, stas if int(expr) < -2**31 or int(expr) >= 2**31: return self.parse_error(curr_line) return Expr("INT") elif self.check_expressions(["ZNAK"]): expr = self.assert_leaf("ZNAK") if not len(expr) == 3 or ord(expr[1]) < 0 or ord(expr[1]) > 255: return self.parse_error(curr_line) return Expr("CHAR") elif self.check_expressions(["NIZ_ZNAKOVA"]): expr = self.assert_leaf("NIZ_ZNAKOVA") if not is_valid_char_array(expr): return self.parse_error(curr_line) return Expr("CHAR", is_array = True) elif self.check_expressions(["L_ZAGRADA", "<izraz>", "D_ZAGRADA"]): self.assert_leaf("L_ZAGRADA") expr = self.izraz() self.assert_leaf("D_ZAGRADA") return expr else: return self.parse_error(curr_line)