Este repositorio contiene los trabajos prácticos desarrollados durante la cursada de Sintaxis y Semántica de los Lenguajes en la Universidad Tecnológica Nacional - Facultad Regional Buenos Aires (UTN-FRBA). La materia aborda los fundamentos teóricos y prácticos de la construcción de compiladores e intérpretes.
El objetivo principal de la materia es comprender los conceptos fundamentales de la teoría de compiladores y aplicarlos en el diseño e implementación de procesadores de lenguajes. A lo largo del curso se desarrollan las siguientes competencias:
- Análisis Léxico: Reconocimiento de tokens y patrones mediante autómatas finitos
- Análisis Sintáctico: Construcción de árboles de sintaxis utilizando gramáticas libres de contexto
- Análisis Semántico: Verificación de tipos, tablas de símbolos y validación semántica
- Generación de Código: Implementación de las fases de un compilador completo
Programa inicial en C que imprime "Hola Mundo". Introducción al lenguaje C y configuración del entorno de desarrollo.
Archivos principales:
Hola mundo.c- Código fuenteHola mundo.exe- Ejecutable compilado
Implementación de un autómata finito determinístico (AFD) en C para reconocer y clasificar constantes numéricas en diferentes bases.
Objetivo: Aplicar la teoría de autómatas finitos para el análisis léxico de números en distintos formatos.
Funcionalidad:
- Reconoce constantes DECIMAL (base 10):
127,255 - Reconoce constantes OCTAL (base 8):
0,010,0777 - Reconoce constantes HEXADECIMAL (base 16):
0xFF,0xABCD - Detecta y reporta números NO RECONOCIDOS con formato inválido
Archivos principales:
tp1.c- Implementación del autómata finitoinput.txt- Casos de prueba de entradasalida.txt- Resultados esperados
Ejemplo de uso:
Entrada: 0xFF,127,0159,0xaBb1,0Xx,0,010,09
Salida:
0xFF HEXADECIMAL
127 DECIMAL
0159 NO RECONOCIDA
0xaBb1 HEXADECIMAL
Desarrollo de un analizador léxico completo utilizando la herramienta Lex/Flex para reconocer todos los tokens del lenguaje C.
Objetivo: Utilizar herramientas de generación automática de analizadores léxicos y comprender el uso de expresiones regulares.
Funcionalidad:
- Reconoce palabras reservadas (if, else, while, for, int, char, etc.)
- Identifica identificadores (nombres de variables y funciones)
- Clasifica constantes numéricas (decimales, octales, hexadecimales)
- Detecta constantes reales (punto flotante)
- Reconoce constantes de caracteres y literales de cadena
- Procesa comentarios (de línea
//y de bloque/* */) - Identifica operadores y caracteres especiales
Archivos principales:
tp2.l- Especificación Lex con expresiones regularesfunciones.c- Funciones auxiliares para procesamientoinput.txt- Código C de pruebaoutput.txt- Tokens reconocidos
Tecnología: Lex/Flex + C
Implementación de un autómata de pila para validar expresiones aritméticas balanceadas.
Objetivo: Aplicar la teoría de autómatas de pila para reconocer lenguajes libres de contexto.
Funcionalidad:
- Valida expresiones aritméticas con paréntesis balanceados
- Reconoce operadores:
+,-,*,/ - Verifica la correcta estructura sintáctica de expresiones
- Utiliza una pila para validar el balance de paréntesis
Archivos principales:
tp3.c- Implementación del autómata de pilastack.h- Librería de pila (stack)
Ejemplo: Valida expresiones como (5 + 3) * 2, ((1 + 2) / 3)
Compilador completo para un subconjunto del lenguaje C utilizando Lex/Flex (análisis léxico) y Yacc/Bison (análisis sintáctico).
Objetivo: Integrar análisis léxico, sintáctico y semántico en un compilador funcional.
Funcionalidad:
- Análisis Léxico: Tokenización del código C
- Análisis Sintáctico: Verificación de la estructura gramatical mediante gramáticas BNF
- Análisis Semántico:
- Validación de tipos de datos
- Tabla de símbolos
- Detección de variables duplicadas
- Verificación de declaraciones antes de uso
- Control de estructuras (if, while, for, switch)
Características soportadas:
- Declaraciones de variables (
int,char,float,double) - Arrays y punteros
- Estructuras de control (if, else, switch, while, do-while, for)
- Funciones (declaración, definición, llamadas)
- Directivas del preprocesador (
#include,#define) - Expresiones aritméticas y lógicas
Archivos principales:
src/TP4.l- Especificación léxica (Lex/Flex)src/TP4.y- Gramática sintáctica y semántica (Yacc/Bison)src/funcionesC.c/funcionesC.h- Funciones auxiliares y tabla de símbolossrc/entrada.txt- Código C de pruebamakefile- Automatización de compilación
Tecnología: Lex/Flex + Yacc/Bison + C
Compilación:
cd TP4
make- Lenguaje: C
- Análisis Léxico: Lex/Flex
- Análisis Sintáctico: Yacc/Bison
- Compilador: GCC
- Control de versiones: Git/GitHub
- Autómatas Finitos Determinísticos (AFD) - TP1
- Expresiones Regulares - TP2
- Autómatas de Pila - TP3
- Gramáticas Libres de Contexto (GLC) - TP4
- Análisis Léxico-Sintáctico-Semántico - TP4
- Tabla de Símbolos - TP4
- Verificación de Tipos - TP4
Matias Grin
- GitHub: @Zeta2003x
- Universidad: UTN-FRBA
- Materia: K2051 - Sintaxis y Semántica de los Lenguajes
Este repositorio documenta la evolución del aprendizaje en la construcción de compiladores, desde el reconocimiento básico de tokens hasta la implementación de un analizador sintáctico y semántico completo. Cada trabajo práctico construye sobre los conceptos del anterior, culminando en un compilador funcional para un subconjunto del lenguaje C.
