aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIván Ávalos <avalos@disroot.org>2022-11-16 20:45:03 -0600
committerIván Ávalos <avalos@disroot.org>2022-11-16 20:45:03 -0600
commit4b562e5608bde5b2a25be62cd2013683b1216bb1 (patch)
treece9ee30f936faed3c3b9091581df5a1953e4fa22
parentd810c8779b6417dcf418d9837bb5b04376eaa7f9 (diff)
downloadjavanol-4b562e5608bde5b2a25be62cd2013683b1216bb1.tar.gz
javanol-4b562e5608bde5b2a25be62cd2013683b1216bb1.tar.bz2
javanol-4b562e5608bde5b2a25be62cd2013683b1216bb1.zip
Se mejora la impresión de errores
-rw-r--r--compilador/errors.py16
-rw-r--r--compilador/lexer.py9
-rw-r--r--compilador/parser.py23
-rw-r--r--interfaz/main.py19
4 files changed, 44 insertions, 23 deletions
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('<b>Línea</b>')
label_nombre = Gtk.Label.new(None)