コード例 #1
0
    def AnalyseCode(self):

        self.ui.textResultados.setPlainText('')
        code = self.ui.textCodigoCOOL.toPlainText()
        Utils.Print(CODIGO, LENGTH_CONSOLE)
        print(code)

        Utils.Print(LEXER, LENGTH_CONSOLE)
        self.ui.textResultados.setPlainText(
            f'{self.ui.textResultados.toPlainText()}{Utils.GetString(LEXER, 64)}\n'
        )
        token_list = Tokenizer(code)
        # PrintTokens(token_list)
        tokens = '\n'.join(repr(token) for token in token_list)
        print(tokens)
        self.ui.textResultados.setPlainText(
            f'{self.ui.textResultados.toPlainText()}{tokens}\n')

        Utils.Print(PARSER, LENGTH_CONSOLE)
        self.ui.textResultados.setPlainText(
            f'{self.ui.textResultados.toPlainText()}{Utils.GetString(PARSER, 64)}\n'
        )
        parse, operations = CoolParser(token_list)
        if not operations:
            self.ui.textResultados.setPlainText(
                f'{self.ui.textResultados.toPlainText()}{UNEXCEPTED_TOKEN % (parse.lex, parse.line, parse.column)}\n'
            )
            print(UNEXCEPTED_TOKEN % (parse.lex, parse.line, parse.column))
            self.ui.tabWidgetCodigo.setTabEnabled(1, True)
            self.ui.tabWidgetCodigo.setCurrentIndex(1)
            return
        productions = '\n'.join(repr(x) for x in parse)
        print(productions)
        self.ui.textResultados.setPlainText(
            f'{self.ui.textResultados.toPlainText()}{productions}\n')

        Utils.Print(AST, LENGTH_CONSOLE)
        self.ui.textResultados.setPlainText(
            f'{self.ui.textResultados.toPlainText()}{Utils.GetString(AST, 64)}\n'
        )
        ast = Utils.EvaluateReverseParse(parse, operations, token_list)
        formatter = FormatVisitor()
        tree = formatter.visit(ast)
        print(tree)
        self.ui.textResultados.setPlainText(
            f'{self.ui.textResultados.toPlainText()}{tree}\n')

        Utils.Print(COLECCIONANDO_TIPOS, LENGTH_CONSOLE)
        self.ui.textResultados.setPlainText(
            f'{self.ui.textResultados.toPlainText()}{Utils.GetString(COLECCIONANDO_TIPOS, 68)}\n'
        )
        errors = []
        collector = TypeCollector(errors)
        collector.visit(ast)
        context = collector.context
        print('ERRORES :', errors)
        print('CONTEXTO :')
        print(context)
        self.ui.textResultados.setPlainText(
            f'{self.ui.textResultados.toPlainText()}ERRORES : [\n')
        for error in errors:
            self.ui.textResultados.setPlainText(
                f'{self.ui.textResultados.toPlainText()}    {error}\n')
        self.ui.textResultados.setPlainText(
            f'{self.ui.textResultados.toPlainText()}]\n')
        self.ui.textResultados.setPlainText(
            f'{self.ui.textResultados.toPlainText()}CONTEXTO :\n')
        self.ui.textResultados.setPlainText(
            f'{self.ui.textResultados.toPlainText()}{context}\n')

        Utils.Print(CONSTRUYENDO_TIPOS, LENGTH_CONSOLE)
        self.ui.textResultados.setPlainText(
            f'{self.ui.textResultados.toPlainText()}{Utils.GetString(CONSTRUYENDO_TIPOS, 67)}\n'
        )
        builder = TypeBuilder(context, errors)
        builder.visit(ast)
        print('ERRORES : [')
        for error in errors:
            print(SPACE * 4, error)
        print(']')
        print('CONTEXTO :')
        print(context)
        self.ui.textResultados.setPlainText(
            f'{self.ui.textResultados.toPlainText()}ERRORES : [\n')
        for error in errors:
            self.ui.textResultados.setPlainText(
                f'{self.ui.textResultados.toPlainText()}    {error}\n')
        self.ui.textResultados.setPlainText(
            f'{self.ui.textResultados.toPlainText()}]\n')
        self.ui.textResultados.setPlainText(
            f'{self.ui.textResultados.toPlainText()}CONTEXTO :\n')
        self.ui.textResultados.setPlainText(
            f'{self.ui.textResultados.toPlainText()}{context}\n')

        Utils.Print(CHEQUEANDO_TIPOS, LENGTH_CONSOLE)
        self.ui.textResultados.setPlainText(
            f'{self.ui.textResultados.toPlainText()}{Utils.GetString(CHEQUEANDO_TIPOS, 67)}\n'
        )
        checker = TypeChecker(context, errors)
        scope = checker.visit(ast)
        print('ERRORES : [')
        for error in errors:
            print(SPACE * 4, error)
        print(']')
        print('CONTEXTO :')
        print(context)
        self.ui.textResultados.setPlainText(
            f'{self.ui.textResultados.toPlainText()}ERRORES : [\n')
        for error in errors:
            self.ui.textResultados.setPlainText(
                f'{self.ui.textResultados.toPlainText()}    {error}\n')
        self.ui.textResultados.setPlainText(
            f'{self.ui.textResultados.toPlainText()}]\n')
        self.ui.textResultados.setPlainText(
            f'{self.ui.textResultados.toPlainText()}CONTEXTO :\n')
        self.ui.textResultados.setPlainText(
            f'{self.ui.textResultados.toPlainText()}{context}\n')

        Utils.Print(INFERENCIA_DE_TIPOS, LENGTH_CONSOLE)
        self.ui.textResultados.setPlainText(
            f'{self.ui.textResultados.toPlainText()}{Utils.GetString(INFERENCIA_DE_TIPOS, 69)}\n'
        )
        inferences = []
        inferer = TypeInferer(context, errors, inferences)
        while inferer.visit(ast, scope):
            pass
        print('INFERENCIAS : [')
        for inference in inferences:
            print(SPACE * 4, inference)
        print(']')
        print('CONTEXTO :')
        print(context)
        print(f'SCOPE : {scope}')
        self.ui.textResultados.setPlainText(
            f'{self.ui.textResultados.toPlainText()}INFERENCIA : [\n')
        for inference in inferences:
            self.ui.textResultados.setPlainText(
                f'{self.ui.textResultados.toPlainText()}    {inference}\n')
        self.ui.textResultados.setPlainText(
            f'{self.ui.textResultados.toPlainText()}]\n')
        self.ui.textResultados.setPlainText(
            f'{self.ui.textResultados.toPlainText()}CONTEXTO :\n')
        self.ui.textResultados.setPlainText(
            f'{self.ui.textResultados.toPlainText()}{context}')

        self.ui.tabWidgetCodigo.setTabEnabled(1, True)
        self.ui.tabWidgetCodigo.setCurrentIndex(1)