From 4b562e5608bde5b2a25be62cd2013683b1216bb1 Mon Sep 17 00:00:00 2001 From: Iván Ávalos Date: Wed, 16 Nov 2022 20:45:03 -0600 Subject: Se mejora la impresión de errores MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- compilador/errors.py | 16 ++++++++++++++++ compilador/lexer.py | 9 +++++---- compilador/parser.py | 23 ++++++++++++----------- interfaz/main.py | 19 +++++++++++-------- 4 files changed, 44 insertions(+), 23 deletions(-) create mode 100644 compilador/errors.py diff --git a/compilador/errors.py b/compilador/errors.py new file mode 100644 index 0000000..f5b4203 --- /dev/null +++ b/compilador/errors.py @@ -0,0 +1,16 @@ +import sys + +class Error: + errors = { + 'L_CAR_LARGO': 'Más de un caracter en una literal de caracter', + 'L_CAR_VACIO': 'Literal de caracter vacía', + 'S_ESPERA_EXPR': 'Se esperaba una expresión', + 'S_ESPERA_IDENT': 'Se esperaba un identificador', + 'S_ESPERA_IDENT_O_LIT': 'Se esperaba un identificador o una literal', + 'S_ESPERA_OPER': 'Se esperaba un operador', + 'S_ESPERA_PC_O_IGUAL': 'Se esperaba `;` o `=`', + 'S_ESPERA_PC': 'Se esperaba `;`', + } + + def __init__(self, error, numlinea): + print("Error en línea %d: %s" % (numlinea, self.errors[error]), file=sys.stderr) diff --git a/compilador/lexer.py b/compilador/lexer.py index ec7d0a4..bc2b14a 100644 --- a/compilador/lexer.py +++ b/compilador/lexer.py @@ -2,6 +2,7 @@ from enum import Enum from tabla import LexToken, TablaLex, tokens from parser import Parser from shared import Control +from errors import Error op_compuestos = ['>=', '<=', '==', '!=', '&&', '||', '++', '--'] op_simples_a = ['=', '+', '-', '&', '|'] # pueden ir al final del op compuesto @@ -52,10 +53,10 @@ class Lexer: for l in self.data.splitlines(): for c in l + "\n": r = self.procesar(c) - if r == 2: return + if r == Control.ERROR: exit(1) while r != Control.SIGUIENTE: r = self.procesar(c) - if r == Control.ERROR: return + if r == Control.ERROR: exit(1) self.numlinea += 1 # Imprimir tabla de símbolos @@ -154,11 +155,11 @@ class Lexer: def procesar_caracter(self, c): if len(self.recol_caracter) > 1: - print ('Error: más de un caracter en una literal de caracter') + Error('L_CAR_LARGO', self.numlinea) return Control.ERROR if c == '\'': if len(self.recol_caracter) == 0: - print ('Error: literal de caracter vacía') + Error('L_CAR_VACIO', self.numlinea) return Control.ERROR self.insertar_tabla('CHAR_LIT', None, self.recol_caracter) self.selector = Selector.NINGUNO diff --git a/compilador/parser.py b/compilador/parser.py index 61ab21a..6c6d223 100644 --- a/compilador/parser.py +++ b/compilador/parser.py @@ -3,6 +3,7 @@ from tabla import LexToken, TablaLex, tokens from arbol import Arbol, Nodo from shared import Control from pprint import pprint +from errors import Error valores = ['IDENT', 'BOOLEAN_LIT', 'CHAR_LIT', 'INT_LIT', 'STRING_LIT'] @@ -34,10 +35,10 @@ class Parser: def inicio (self): for t in self.tabla.tabla: r = self.procesar(t) - if r == 2: return + if r == Control.ERROR: exit(1) while r != Control.SIGUIENTE: r = self.procesar(t) - if r == Control.ERROR: return + if r == Control.ERROR: exit(1) print(str(self.arbol)) @@ -110,7 +111,7 @@ class Parser: # tipo if len(recol) == 1: if t.tipo != 'IDENT': - print('Error: se esperaba identificador') + Error('S_ESPERA_IDENT', t.numlinea) return Control.ERROR recol.append(t) return Control.SIGUIENTE @@ -128,7 +129,7 @@ class Parser: elif t.tipo == '=': recol.append(t) else: - print('Error: se esperaba `;` o `=`') + Error('S_ESPERA_PC_O_IGUAL', t.numlinea) return Control.ERROR return Control.SIGUIENTE @@ -138,7 +139,7 @@ class Parser: self.pila_selector.append([Selector.EXPRESION, [t]]) recol.append(t) else: - print('Error: se esperaba una expresión') + Error('S_ESPERA_EXPR', t.numlinea) return Control.ERROR return Control.SIGUIENTE @@ -155,7 +156,7 @@ class Parser: self.pila_selector.pop() self.pila_selector.append([Selector.NINGUNO, []]) else: - print('Error: se esperaba `;`') + Error('S_ESPERA_PC', t.numlinea) return Control.ERROR return Control.SIGUIENTE @@ -169,7 +170,7 @@ class Parser: self.pila_selector.append([Selector.EXPRESION, [t]]) recol.append(t) else: - print('Error: se esperaba una expresión') + Error('S_ESPERA_EXPR', t.numlinea) return Control.ERROR return Control.SIGUIENTE @@ -184,7 +185,7 @@ class Parser: self.pila_selector.pop() self.pila_selector.append([Selector.NINGUNO, []]) else: - print('Error: se esperaba `;`') + Error('S_ESPERA_EXPR', t.numlinea) return Control.ERROR return Control.SIGUIENTE @@ -197,7 +198,7 @@ class Parser: if tipo_ultimo in valores: recol.append(recol[-1]) else: - print('Error: se esperaba un identificador o una literal') + Error('S_ESPERA_IDENT_O_LIT', t.numlinea) return Control.ERROR if tipo_ultimo in valores and t.tipo in operadores: @@ -205,10 +206,10 @@ class Parser: elif tipo_ultimo in operadores and t.tipo in valores: recol.append(t) elif tipo_ultimo in valores and t.tipo in valores: - print('Error: se esperaba un operador') + Error('S_ESPERA_OPER', t.numlinea) return Control.ERROR elif tipo_ultimo in operadores and t.tipo in operadores: - print('Error: se esperaba un identificador o una literal') + Error('S_ESPERA_IDENT_O_LIT', t.numlinea) return Control.ERROR else: self.expresion = recol[1:] diff --git a/interfaz/main.py b/interfaz/main.py index 9867e9e..24f96d1 100644 --- a/interfaz/main.py +++ b/interfaz/main.py @@ -94,7 +94,6 @@ class MainWindow(Gtk.ApplicationWindow): notebook.append_page(scrolled, Gtk.Label.new('Símbolos')) def abrir_archivo(self, button): - print('abrir_archivo()') self.open_dialog = Gtk.FileChooserNative.new( title='Abrir archivo', parent=self, @@ -122,25 +121,29 @@ class MainWindow(Gtk.ApplicationWindow): def correr(self, button): self.guardar_archivo(None) + self.limpiar_tabla() if self.input_file: result = subprocess.run([ 'python', compilador_dir, '-i', self.input_file, '-o', self.output_file, '-t' - ], stdout=subprocess.PIPE) + ], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) output = result.stdout.decode('utf-8') self.msgbuf.set_text(output) - # Tabla de símbolos - with open(self.input_file + '.tab', 'r') as f: - data = f.read() - self.llenar_tabla(data) + if result.returncode == 0: + # Tabla de símbolos + with open(self.input_file + '.tab', 'r') as f: + data = f.read() + self.llenar_tabla(data) - def llenar_tabla(self, data): - tabla = json.loads(data) + def limpiar_tabla(self): for i in range(4): self.tablagrid.remove_column(0) + + def llenar_tabla(self, data): + tabla = json.loads(data) label_linea = Gtk.Label.new(None) label_linea.set_markup('Línea') label_nombre = Gtk.Label.new(None) -- cgit v1.2.3