Unidad I · Actividad práctica

Actividad práctica — Análisis léxico, sintáctico y semántico

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

  1. Tabla de tokens de la Parte 1
  2. Árbol sintáctico dibujado de la Parte 2
  3. Tabla de clasificación de errores de la Parte 3 con justificación
  4. 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?