コード例 #1
0
ファイル: FinalCodeGenerator.py プロジェクト: PPJ-Grupa/PPJ
  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)
コード例 #2
0
  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)
コード例 #3
0
  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)