예제 #1
0
    def execute_pop(self, exec_ctx):
        list_ = exec_ctx.symbol_table.get("list")
        index = exec_ctx.symbol_table.get("index")

        if not isinstance(list_, Pharser.List):
            return Pharser.RTResult().failure(
                Lexer.RTError(
                    self.pos_start, self.pos_end,
                    "Argumen pertama harus sebuah list \n(First argument must be list)",
                    exec_ctx))

        if not isinstance(index, Pharser.Number):
            return Pharser.RTResult().failure(
                Lexer.RTError(
                    self.pos_start, self.pos_end,
                    "Argumen kedua harus angka \n(Second argument must be number)",
                    exec_ctx))

        try:
            element = list_.elements.pop(index.value)
        except:
            return Pharser.RTResult().failure(
                Lexer.RTError(
                    self.pos_start, self.pos_end,
                    ' Sajak elemen pada indeks ini tidak dapat dihapus dari daftar ingatan, karena indeks di luar batas rindu \n(Element at this index could not be removed from list because index is out of bounds)',
                    exec_ctx))
        return Pharser.RTResult().success(element)
예제 #2
0
파일: Pharser.py 프로젝트: TeguhP7/CS
    def check_args(self, arg_names, args):
        res = RTResult()

        if len(args) > len(arg_names):
            return res.failure(
                Lexer.RTError(
                    self.pos_start, self.pos_end,
                    f"{len(args) - len(arg_names)} too many args passed into {self}",
                    self.context))

        if len(args) < len(arg_names):
            return res.failure(
                Lexer.RTError(
                    self.pos_start, self.pos_end,
                    f"{len(arg_names) - len(args)} too few args passed into {self}",
                    self.context))

        return res.success(None)
예제 #3
0
    def execute_extend(self, exec_ctx):
        listA = exec_ctx.symbol_table.get("listA")
        listB = exec_ctx.symbol_table.get("listB")

        if not isinstance(listA, Pharser.List):
            return Pharser.RTResult().failure(
                Lexer.RTError(
                    self.pos_start, self.pos_end,
                    "Argumen pertama harus sebuah list \n(First argument must be list)",
                    exec_ctx))

        if not isinstance(listB, Pharser.List):
            return Pharser.RTResult().failure(
                Lexer.RTError(
                    self.pos_start, self.pos_end,
                    "Argumen kedua harus sebuah list \n(First argument must be list)",
                    exec_ctx))

        listA.elements.extend(listB.elements)
        return Pharser.RTResult().success(Pharser.Number.null)
예제 #4
0
파일: Pharser.py 프로젝트: TeguhP7/CS
 def dived_by(self, other):
     if isinstance(other, Number):
         try:
             return self.elements[other.value], None
         except:
             return None, Lexer.RTError(
                 other.pos_start, other.pos_end,
                 ' Sajak elemen pada indeks ini tidak dapat diambil dari daftar masa lalu, karena indeks di luar batas kenangan \n(Element at this index could not be retrieved from list because index is out of bounds)',
                 self.context)
     else:
         return None, Value.illegal_operation(self, other)
예제 #5
0
파일: Pharser.py 프로젝트: TeguhP7/CS
    def dived_by(self, other):
        if isinstance(other, Number):
            if other.value == 0:
                return None, Lexer.RTError(
                    other.pos_start, other.pos_end,
                    ' Engkau tak dapat didefinisikan \n(Wahai pujangga jangan engkau bagi dengan angka 0)',
                    self.context)

            return Number(self.value / other.value).set_context(
                self.context), None
        else:
            return None, Value.illegal_operation(self, other)
예제 #6
0
    def execute_append(self, exec_ctx):
        list_ = exec_ctx.symbol_table.get("list")
        value = exec_ctx.symbol_table.get("value")

        if not isinstance(list_, Pharser.List):
            return Pharser.RTResult().failure(
                Lexer.RTError(
                    self.pos_start, self.pos_end,
                    "Argumen pertama harus sebuah list \n(First argument must be list)",
                    exec_ctx))

        list_.elements.append(value)
        return Pharser.RTResult().success(Pharser.Number.null)
예제 #7
0
파일: Pharser.py 프로젝트: TeguhP7/CS
 def subbed_by(self, other):
     if isinstance(other, Number):
         new_list = self.copy()
         try:
             new_list.elements.pop(other.value)
             return new_list, None
         except:
             return None, Lexer.RTError(
                 other.pos_start, other.pos_end,
                 ' Sajak elemen pada indeks ini tidak dapat dihapus dari daftar ingatan, karena indeks di luar batas rindu \n(Element at this index could not be removed from list because index is out of bounds)',
                 self.context)
     else:
         return None, Value.illegal_operation(self, other)
예제 #8
0
    def visit_VarAccessNode(self, node, context):
        res = Pharser.RTResult()
        var_name = node.var_name_tok.value
        value = context.symbol_table.get(var_name)

        if not value:
            return res.failure(
                Lexer.RTError(
                    node.pos_start, node.pos_end,
                    f"Sajak '{var_name}' tak terdefinisi \n'{var_name}' is not defined",
                    context))

        value = value.copy().set_pos(node.pos_start,
                                     node.pos_end).set_context(context)
        return res.success(value)
예제 #9
0
파일: Pharser.py 프로젝트: TeguhP7/CS
 def illegal_operation(self, other=None):
     if not other: other = self
     return Lexer.RTError(self.pos_start, other.pos_end,
                          ' Engkau tak diperkenankan (Operasi illegal)',
                          self.context)