Exemplo n.º 1
0
def grafo(instructions, textEdit):

    global contador
    node = g.node(contador, contador, 'S')
    ge = g.genera()
    ge.add(node)
    node = g.node(contador, contador + 1, 'A')
    ge.add(node)
    contador += 1
    instrucciones(instructions, ge, contador, textEdit)
Exemplo n.º 2
0
def drawExpresiones(instruction, ge, padre, ts, textEdit):
    global contador
    #print(f'ahshas: {str(instruction)}')
    if isinstance(instruction, BinaryExpression):
        num1 = valueExpression(instruction.op1, ts, textEdit)
        num2 = valueExpression(instruction.op2, ts, textEdit)
        try:
            if instruction.operator == Aritmetics.MAS:
                node = g.node(padre, contador + 1, str(num1))
                ge.add(node)
                node = g.node(padre, contador + 2, '+')
                ge.add(node)
                node = g.node(padre, contador + 3, str(num2))
                ge.add(node)
                contador += 3
            elif instruction.operator == Aritmetics.MENOS:
                node = g.node(padre, contador + 1, str(num1))
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, '-')
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, str(num2))
                ge.add(node)
                contador += 1
            elif instruction.operator == Aritmetics.POR:
                node = g.node(padre, contador + 1, str(num1))
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, '*')
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, str(num2))
                ge.add(node)
                contador += 1
            elif instruction.operator == Aritmetics.DIV:
                node = g.node(padre, contador + 1, str(num1))
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, '/')
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, str(num2))
                ge.add(node)
                contador += 1
            elif instruction.operator == Aritmetics.MODULO:
                node = g.node(padre, contador + 1, str(num1))
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, '%')
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, str(num2))
                ge.add(node)
                contador += 1
        except:
            pass
    elif isinstance(instruction, LogicAndRelational):
        val1 = valueExpression(instruction.op1, ts, textEdit)
        val2 = valueExpression(instruction.op2, ts, textEdit)
        try:
            if instruction.operator == LogicsRelational.MAYORQUE:
                node = g.node(padre, contador + 1, str(val1))
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, '>')
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, str(val2))
                ge.add(node)
                contador += 1
            elif instruction.operator == LogicsRelational.MENORQUE:
                node = g.node(padre, contador + 1, str(val1))
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, '<')
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, str(val2))
                ge.add(node)
                contador += 1
            elif instruction.operator == LogicsRelational.MAYORIGUAL:
                node = g.node(padre, contador + 1, str(val1))
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, '>=')
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, str(val2))
                ge.add(node)
                contador += 1
            elif instruction.operator == LogicsRelational.MENORIGUAL:
                node = g.node(padre, contador + 1, str(val1))
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, '<=')
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, str(val2))
                ge.add(node)
                contador += 1
            elif instruction.operator == LogicsRelational.IGUALQUE:
                node = g.node(padre, contador + 1, str(val1))
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, '==')
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, str(val2))
                ge.add(node)
                contador += 1
            elif instruction.operator == LogicsRelational.AND:
                node = g.node(padre, contador + 1, str(val1))
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, '&&')
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, str(val2))
                ge.add(node)
                contador += 1
            elif instruction.operator == LogicsRelational.OR:
                node = g.node(padre, contador + 1, str(val1))
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, '||')
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, str(val2))
                ge.add(node)
                contador += 1
            elif instruction.operator == LogicsRelational.XOR:
                node = g.node(padre, contador + 1, str(val1))
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, '^')
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, str(val2))
                ge.add(node)
                contador += 1
            elif instruction.operator == LogicsRelational.DIFERENTE:
                node = g.node(padre, contador + 1, str(val1))
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, '!=')
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, str(val2))
                ge.add(node)
                contador += 1

        except:
            pass
    elif isinstance(instruction, Not):
        try:
            num1 = valueExpression(instruction.expression, ts, textEdit)
            node = g.node(padre, contador + 1, str(val1))
            ge.add(node)
            contador += 1
            node = g.node(padre, contador + 1, '!')
            ge.add(node)
            contador += 1
        except:
            pass
    elif isinstance(instruction, Abs):
        try:
            node = g.node(padre, contador + 1, 'abs')
            ge.add(node)
            contador += 1
            node = g.node(
                padre, contador + 1,
                str(valueExpression(instruction.expression, ts, textEdit)))
            ge.add(node)
            contador += 1
        except:
            pass
    elif isinstance(instruction, NegativeNumber):
        try:
            num1 = valueExpression(instruction.expression, ts, textEdit)
            node = g.node(padre, contador + 1, '-')
            ge.add(node)
            contador += 1
            node = g.node(padre, contador + 1, str(num1))
            ge.add(node)
            contador += 1
        except:
            pass
    elif isinstance(instruction, Identifier):
        node = g.node(padre, contador + 1, str(instruction.id))
        ge.add(node)
        contador += 1
    elif isinstance(instruction, Number):
        node = g.node(padre, contador + 1, str(instruction.val))
        ge.add(node)
        contador += 1
    elif isinstance(instruction, Cast_):
        num1 = valueExpression(instruction.expression, ts, textEdit)

        node = g.node(padre, contador + 1, str(instruction.type))
        ge.add(node)
        contador += 1
        node = g.node(padre, contador + 1, str(num1))
        ge.add(node)
        contador += 1
    elif isinstance(instruction, String_):
        node = g.node(padre, contador + 1, str(instruction.string))
        ge.add(node)
        contador += 1
    elif isinstance(instruction, ExpressionsDeclarationArray):
        #print(f'ahshas: {str(instruction.expressionDer)}')
        for i in instruction.expressionIzq:
            node = g.node(padre, contador + 1,
                          f'[{str(valueExpression(i, ts,textEdit))}]')
            ge.add(node)
            contador += 1
        node = g.node(padre, contador + 1, f'=')
        ge.add(node)
        contador += 1

        drawExpresiones(instruction.expressionDer, ge, padre, tsGlobal,
                        textEdit)
    elif instruction == 'array':
        node = g.node(padre, contador + 1, f'array ( )')
        ge.add(node)
        contador += 1
    elif isinstance(instruction, IdentifierArray):
        try:
            #print(str(instruction))
            node = g.node(padre, contador + 1, str(instruction.id))
            ge.add(node)
            contador += 1
            sym = ts.get(instruction.id).valor
            i = 0
            while i < len(instruction.expressions):
                node = g.node(
                    padre, contador + 1,
                    f'[{str(valueExpression(instruction.expressions[i], ts,textEdit))}]'
                )
                ge.add(node)
                contador += 1
                i += 1
        except:
            pass
    elif isinstance(instruction, ReadConsole):
        #lectura de consola

        node = g.node(padre, contador + 1, 'read ( ) ')
        ge.add(node)
        contador += 1
    elif isinstance(instruction, RelationalBit):
        val1 = valueExpression(instruction.op1, ts, textEdit)
        val2 = valueExpression(instruction.op2, ts, textEdit)
        try:
            if instruction.operator == BitToBit.ANDBIT:
                node = g.node(padre, contador + 1, str(val1))
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, '&')
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, str(val2))
                ge.add(node)
                contador += 1
            elif instruction.operator == BitToBit.ORBIT:
                node = g.node(padre, contador + 1, str(val1))
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, '|')
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, str(val2))
                ge.add(node)
                contador += 1
            elif instruction.operator == BitToBit.XORBIT:
                node = g.node(padre, contador + 1, str(val1))
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, '^')
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, str(val2))
                ge.add(node)
                contador += 1
            elif instruction.operator == BitToBit.SHIFTI:
                node = g.node(padre, contador + 1, str(val1))
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, '<<')
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, str(val2))
                ge.add(node)
                contador += 1
            elif instruction.operator == BitToBit.SHIFTD:
                node = g.node(padre, contador + 1, str(val1))
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, '>>')
                ge.add(node)
                contador += 1
                node = g.node(padre, contador + 1, str(val2))
                ge.add(node)
                contador += 1
        except:
            pass
    elif isinstance(instruction, NotBit):
        num1 = valueExpression(instruction.expression, ts, textEdit)
        node = g.node(padre, contador + 1, '~')
        ge.add(node)
        contador += 1
        node = g.node(padre, contador + 1, str(num1))
        ge.add(node)
        contador += 1
    elif isinstance(instruction, ReferenceBit):
        val = valueExpression(instruction.expression, ts, textEdit)
        node = g.node(padre, contador + 1, '&')
        ge.add(node)
        contador += 1
        node = g.node(padre, contador + 1, str(num1))
        ge.add(node)
        contador += 1
Exemplo n.º 3
0
def instrucciones(instructions, ge, padre, textEdit):
    global contador, tsGlobal, pasadas

    i = 0
    while i < len(instructions):
        #isinstance verificar tipos
        b = instructions[i]
        if isinstance(b, Print_):
            node = g.node(padre, contador + 1, 'INSTRUCIONES')
            ge.add(node)
            contador += 1
            node = g.node(contador, contador + 1, 'PRINT')
            ge.add(node)
            contador += 1
            node = g.node(contador, contador + 1, 'print')
            ge.add(node)
            node = g.node(contador, contador + 2, 'EXPRESIONES')
            ge.add(node)
            contador += 2
            drawExpresiones(b.cadena, ge, contador, tsGlobal, textEdit)
        elif isinstance(b, Declaration):
            node = g.node(padre, contador + 1, 'DECLARACIONES')
            ge.add(node)
            contador += 1
            node = g.node(contador, contador + 1, 'ID')
            ge.add(node)
            contador += 1
            node = g.node(contador, contador + 1, str(b.id))
            ge.add(node)
            contador += 1
            node = g.node(contador - 2, contador + 1, 'EXPRESION')
            ge.add(node)
            contador += 1
            drawExpresiones(b.val, ge, contador, tsGlobal, textEdit)
        elif isinstance(b, If):
            node = g.node(padre, contador + 1, 'INSTRUCIONES')
            ge.add(node)
            contador += 1
            node = g.node(contador, contador + 1, 'if')
            ge.add(node)
            node = g.node(contador, contador + 2, ' (  EXPRESION  )')
            ge.add(node)
            contador += 2
            drawExpresiones(b.expression, ge, contador, tsGlobal, textEdit)
            #mandar el node goto osea saltar entre las instrucciones
            '''result = valueExpression(b.expression, tsGlobal, textEdit)
            if result == 1:
                tmp = i
                i = goto(i+1, instructions, b.label)
                if i != 0:
                    pasadas = 0
                else:
                    i = tmp
            else:
                i = tmp'''
        elif isinstance(b, Goto):
            node = g.node(padre, contador + 1, 'INSTRUCIONES')
            ge.add(node)
            contador += 1
            node = g.node(contador, contador + 1, 'goto')
            ge.add(node)
            node = g.node(contador, contador + 2, str(b.label))
            ge.add(node)
            contador += 2
            #saltar entre las instrucciones
            '''result = valueExpression(b.expression, tsGlobal, textEdit)
            if result == 1:
                tmp = i
                i = goto(i + 1, instructions, b.label)
                if i != 0:
                    pasadas = 0
                else:
                    i = tmp
            else:
                i = tmp'''
        elif isinstance(b, Exit):
            node = g.node(padre, contador + 1, 'INSTRUCIONES')
            ge.add(node)
            contador += 1
            node = g.node(contador, contador + 1, 'exit ( )')
            ge.add(node)
            contador += 1
            break
        elif isinstance(b, Unset):
            node = g.node(padre, contador + 1, 'INSTRUCIONES')
            ge.add(node)
            contador += 1
            node = g.node(contador, contador + 1, 'unset ')
            ge.add(node)
            node = g.node(contador, contador + 2, str(b.id))
            ge.add(node)
            contador += 2

        i += 1