aboutsummaryrefslogtreecommitdiff
path: root/compilador
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 /compilador
parentd810c8779b6417dcf418d9837bb5b04376eaa7f9 (diff)
downloadjavanol-4b562e5608bde5b2a25be62cd2013683b1216bb1.tar.gz
javanol-4b562e5608bde5b2a25be62cd2013683b1216bb1.tar.bz2
javanol-4b562e5608bde5b2a25be62cd2013683b1216bb1.zip
Se mejora la impresión de errores
Diffstat (limited to 'compilador')
-rw-r--r--compilador/errors.py16
-rw-r--r--compilador/lexer.py9
-rw-r--r--compilador/parser.py23
3 files changed, 33 insertions, 15 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:]