示例#1
0
  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)
示例#2
0
  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)