Duración estimada: 45-60 minutos Modalidad: equipos de 3-4 estudiantes Vinculada a: 01-Unidad-I-Lenguajes-Sesion1
Objetivo de la actividad
Aplicar los conceptos de nivel léxico, sintáctico y semántico sobre fragmentos de código reales, distinguiendo el tipo de análisis responsable de detectar cada clase de error.
Parte 1 · Identificación de tokens (10 min)
Para el siguiente fragmento en Python, clasifiquen cada token en una tabla (identificador, palabra reservada, operador, literal, símbolo de puntuación):
def calcular_promedio(lista_notas):
total = sum(lista_notas)
return total / len(lista_notas)
Plantilla de respuesta:
| Token | Tipo |
|---|---|
def |
? |
calcular_promedio |
? |
( |
? |
| ... | ... |
Parte 2 · Construcción de un árbol sintáctico (10-15 min)
Dada la gramática BNF simplificada:
<expresion> ::= <termino> (("+" | "-") <termino>)*
<termino> ::= <factor> (("*" | "/") <factor>)*
<factor> ::= <numero> | "(" <expresion> ")"
Construyan a mano (papel o pizarrón) el árbol sintáctico de la expresión:
(3 + 4) * 2 - 1
Pregunta guía: ¿por qué la agrupación con paréntesis cambia la forma del árbol aunque los tokens sean casi los mismos que en 3 + 4 * 2 - 1?
Parte 3 · Clasificación de errores (15-20 min)
Para cada fragmento, indiquen si el error es léxico, sintáctico o semántico, y justifiquen en una línea:
Fragmento A (C):
int x = 5;
int y = 3;
int resultado = x @ y;
Fragmento B (Java):
int contador = 0
contador = contador + 1;
Fragmento C (Python):
edad = "veinte"
siguiente_año = edad + 1
Fragmento D (C):
if (x > 0) {
printf("positivo");
// falta el cierre de llave
Fragmento E (Python):
1nombre = "Ana"
Parte 4 · Mini-lexer en pseudocódigo (10-15 min)
Diseñen en pseudocódigo (o Python simplificado) un mini-analizador léxico para una calculadora que solo reconoce:
- Números enteros
- Los operadores
+,-,*,/ - Paréntesis
(y)
Entrada de ejemplo: "(12 + 4) * 3"
Salida esperada: una lista de tokens con su tipo, por ejemplo:
[("(", "PARENTESIS_IZQ"), ("12", "NUMERO"), ("+", "OPERADOR"),
("4", "NUMERO"), (")", "PARENTESIS_DER"), ("*", "OPERADOR"), ("3", "NUMERO")]
Pista de diseño: recorran la cadena carácter por carácter, acumulen dígitos consecutivos para formar un número completo, y emitan un token cada vez que encuentren un operador, paréntesis o espacio.
Entregable
Cada equipo entrega (en papel, Markdown o código):
- Tabla de tokens de la Parte 1
- Árbol sintáctico dibujado de la Parte 2
- Tabla de clasificación de errores de la Parte 3 con justificación
- Pseudocódigo o código del mini-lexer de la Parte 4
Discusión final en plenaria (5-10 min)
- ¿Qué parte les resultó más difícil de clasificar: léxico, sintaxis o semántica? ¿Por qué?
- ¿Hay casos donde la frontera entre un error sintáctico y uno semántico no es tan clara?