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)
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
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