def take_item(self, other): res = RTResult() if isinstance(other, Number): try: return res.success(self.elements[other.value]) except: return res.failure( RTError(other.pos_start, other.pos_end, detailsMessages["outOfIndex"], self.context)) else: return res.failure(Value.illegal_operation(self, other))
def check_args(self, arg_names, args): res = RTResult() final_arg_names = [] for arg_name in arg_names: if not arg_name[-1] == "?": final_arg_names.append(arg_name) if len(args) > len(arg_names): return res.failure( RTError( self.pos_start, self.pos_end, f"Che me pasaste como {len(args) - len(arg_names)} argumentos, son menos en {self} viste", self.context)) if len(args) < len(final_arg_names): return res.failure( RTError( self.pos_start, self.pos_end, f"Che me pasaste como {len(final_arg_names) - len(args)} argumentos, son más en {self} viste", self.context)) return res.success(None)
def visit_VarAssignNode(self, node, context): res = RTResult() var_name = node.var_name_tok value = res.register(self.visit(node.value_node, context)) # if res.error: return res if res.should_return(): return res for var in var_name: if var.value.lower() == "dolar": return res.failure(LanguageThingError( var.pos_start, var.pos_end, detailsMessages["dolarVarAssign"] )) context.symbol_table.set(var.value,value) return res.success(value)
def visit_VarAccessNode(self,node,context): res = RTResult() var_name = node.var_name_tok.value value = context.symbol_table.get(var_name) if not value: return res.failure(RTError( node.pos_start, node.pos_end, detailsMessages["unknownVariable"] + var_name + "'", context )) value = value.copy().set_context(context).set_pos(node.pos_start, node.pos_end) return res.success(value)
def visit_BinOpNode(self, node, context): res = RTResult() left = res.register(self.visit(node.left_node, context)) # if res.error: return res if res.should_return(): return res right = res.register(self.visit(node.right_node, context)) # if res.error: return res if res.should_return(): return res if node.op_tok.type == TT_PLUS: result, error = left.added_to(right) elif node.op_tok.type == TT_MINUS: result, error = left.subbed_by(right) elif node.op_tok.type == TT_MUL: result, error = left.multed_by(right) elif node.op_tok.type == TT_MOD: result, error = left.modded_by(right) elif node.op_tok.type == TT_DIV: result, error = left.dived_by(right) elif node.op_tok.type == TT_POW: result, error = left.powed_by(right) elif node.op_tok.type == TT_EE: result, error = left.get_comparison_ee(right) elif node.op_tok.type == TT_NE: result, error = left.get_comparison_ne(right) elif node.op_tok.type == TT_LT: result, error = left.get_comparison_lt(right) elif node.op_tok.type == TT_GT: result, error = left.get_comparison_gt(right) elif node.op_tok.type == TT_LTE: result, error = left.get_comparison_lte(right) elif node.op_tok.type == TT_GTE: result, error = left.get_comparison_gte(right) elif node.op_tok.type == TT_MM: result, error = left.get_comparison_mm(right) elif node.op_tok.matches(TT_KEYWORD, "y"): result, error = left.anded_by(right) elif node.op_tok.matches(TT_KEYWORD, "o"): result, error = left.ored_by(right) if error: return res.failure(error) else: return res.success(result.set_pos(node.pos_start,node.pos_end))
def visit_UnaryOpNode(self, node, context): res = RTResult() number = res.register(self.visit(node.node, context)) # if res.error: return res if res.should_return(): return res error = None if node.op_tok.type == TT_MINUS: number, error = number.multed_by(Number(-1)) if node.op_tok.matches(TT_KEYWORD, "no"): number, error = number.notted() if error: return res.failure(error) else: return res.success(number.set_pos(node.pos_start,node.pos_end))