示例#1
0
文件: function.py 项目: qqbc1/ToyPL
    def execute_pop(self, exec_ctx):
        """
        删除列表中index下标对应的元素
        :param exec_ctx:
        :return:
        """
        list_ = exec_ctx.symbol_table.get('list')
        index = exec_ctx.symbol_table.get('index')

        if not isinstance(list_, List):
            return RTResult.failure(
                RTError(self.pos_start, self.pos_end,
                        "First argument must be list", exec_ctx))

        if not isinstance(index, Number):
            return RTResult.failure(
                RTError(self.pos_start, self.pos_end,
                        "Secord argument must be number", exec_ctx))

        try:
            element = list_.elements.pop(index.value)
        except:
            return RTResult.failure(
                RTError(
                    self.pos_start, self.pos_end,
                    'Element at this index could not be removed from list because index is out of bounds',
                    exec_ctx))

        return RTResult().success(element)
示例#2
0
文件: function.py 项目: qqbc1/ToyPL
    def check_args(self, arg_names, args):
        """
        检测函数参数
        :param arg_names: 函数参数名
        :param args: 函数参数值
        :return:
        """
        res = RTResult()

        # 调用函数时传入的参数多于函数定义中的参数
        if len(args) > len(arg_names):
            return res.failure(
                RTError(
                    self.pos_start, self.pos_end,
                    f"{len(args) - len(arg_names)} too many args passed into '{self.name}'",
                    self.context))

        # 调用函数时传入的参数多于函数定义中的参数
        if len(args) < len(arg_names):
            return res.failure(
                RTError(
                    self.pos_start, self.pos_end,
                    f"{len(args) - len(arg_names)} too few args passed into '{self.name}'",
                    self.context))

        return res.success(None)
示例#3
0
文件: function.py 项目: qqbc1/ToyPL
    def execute_len(self, exec_ctx):
        """获得list的长度"""
        list_ = exec_ctx.symbol_table.get('list')
        if not isinstance(list_, List):
            return RTResult().failure(
                RTError(self.pos_start, self.pos_end, "Argment must be list",
                        exec_ctx))

        return RTResult().success(Number(len(list_.elements)))
示例#4
0
文件: function.py 项目: qqbc1/ToyPL
    def execute_extend(self, exec_ctx):
        list_1 = exec_ctx.symbol_table.get("list_1")
        list_2 = exec_ctx.symbol_table.get("list_2")

        if not isinstance(list_1, List):
            return RTResult.failure(
                RTError(self.pos_start, self.pos_end,
                        "First argument must be list", exec_ctx))

        if not isinstance(list_2, List):
            return RTResult.failure(
                RTError(self.pos_start, self.pos_end,
                        "Secord argument must be list", exec_ctx))

        list_1.elements.extend(list_2.elements)
        return RTResult().success(list_1)
示例#5
0
文件: function.py 项目: qqbc1/ToyPL
 def execute_clear(self, exec_ctx):
     """清空终端输出"""
     if os.name == 'posix':  # MacOS
         os.system('clear')  # MacOS/Linxu 清理屏幕命令
     else:
         os.system('cls')  # Windows 清理屏幕命令
     return RTResult().success(Number.null)
示例#6
0
文件: function.py 项目: qqbc1/ToyPL
    def execute_append(self, exec_ctx):
        """
        向list中添加元素
        不是就地操作
        append([1,2,3], 4) => 返回结果:[1,2,3,4],但原本的列表[1,2,3]并没有改变
        """
        list_ = exec_ctx.symbol_table.get('list')
        value = exec_ctx.symbol_table.get('value')

        if not isinstance(list_, List):
            return RTResult.failure(
                RTError(
                    self.pos_start,
                    self.pos_end,
                    # append内置方法的第一个参数必须为list
                    "First argument must be list",
                    exec_ctx))

        list_.elements.append(value)
        return RTResult().success(list_)
示例#7
0
文件: function.py 项目: qqbc1/ToyPL
    def execute(self, args, _):
        """
        执行内建函数
        :param args: 函数参数
        :return:
        """
        res = RTResult()
        exec_ctx = self.generate_new_context()

        method_name = f'execute_{self.name}'
        method = getattr(self, method_name, self.no_visit_method)

        # 检测函数参数以及将参数填充到函数上下文的符号表中
        res.register(
            self.check_and_populate_args(method.arg_names, args, exec_ctx))
        if res.should_return(): return res

        # 调用内建函数
        return_value = res.register(method(exec_ctx))
        if res.should_return(): return res
        return res.success(return_value)
示例#8
0
文件: function.py 项目: qqbc1/ToyPL
    def execute(self, args, interpreter):
        """
        执行函数
        :param args: 执行函数时,传入的参数
        :return:
        """
        res = RTResult()
        # 为函数单独创建新的解释器
        # interpreter = Interpreter()
        exec_ctx = self.generate_new_context()
        res.register(
            self.check_and_populate_args(self.arg_names, args, exec_ctx))
        if res.should_return(): return res

        # 通过解释器执行函数体中的逻辑
        value = res.register(interpreter.visit(self.body_node, exec_ctx))
        # 如果函数应该返回且函数返回值(func_return_value)为None,则直接返回res
        if res.should_return() and res.func_return_value == None:
            return res
        # 如果应该自动返回
        ret_value = (value if self.should_auto_return else
                     None) or res.func_return_value or Number.null

        return res.success(ret_value)
示例#9
0
文件: function.py 项目: qqbc1/ToyPL
 def check_and_populate_args(self, arg_names, args, exec_ctx):
     res = RTResult()
     res.register(self.check_args(arg_names, args))
     if res.should_return(): return res
     self.populate_args(arg_names, args, exec_ctx)
     return res.success(None)
示例#10
0
文件: function.py 项目: qqbc1/ToyPL
 def execute_is_function(self, exec_ctx):
     """判断是否为func类型"""
     is_func = isinstance(exec_ctx.symbol_table.get('value'), BaseFunction)
     return RTResult().success(Number.true if is_func else Number.false)
示例#11
0
文件: function.py 项目: qqbc1/ToyPL
 def execute_is_list(self, exec_ctx):
     """判断是否为List类型"""
     is_list = isinstance(exec_ctx.symbol_table.get('value'), List)
     return RTResult().success(Number.true if is_list else Number.false)
示例#12
0
文件: function.py 项目: qqbc1/ToyPL
 def execute_is_string(self, exec_ctx):
     """判断是否为String类型"""
     is_string = isinstance(exec_ctx.symbol_table.get('value'), String)
     return RTResult().success(Number.true if is_string else Number.false)
示例#13
0
文件: function.py 项目: qqbc1/ToyPL
 def execute_is_number(self, exec_ctx):
     """判断是否为Number类型"""
     is_number = isinstance(exec_ctx.symbol_table.get('value'), Number)
     return RTResult().success(Number.true if is_number else Number.false)
示例#14
0
文件: function.py 项目: qqbc1/ToyPL
 def execute_input(self, exec_ctx):
     """输入内容"""
     text = input()
     return RTResult().success(String(text))
示例#15
0
文件: function.py 项目: qqbc1/ToyPL
 def execute_print(self, exec_ctx):
     """打印内容"""
     return RTResult().success(
         String(str(exec_ctx.symbol_table.get('value'))))