🧮 Reconocedor de Expresiones Matemáticas
Un proyecto enfocado en el desarrollo de un analizador léxico para reconocer, procesar y manejar operaciones matemáticas complejas.
📘 Introducción
El analizador léxico representa la primera etapa de un compilador, encargado de identificar errores y procesar los datos para avanzar a las siguientes fases. Este proyecto desarrolla un sistema que reconoce sistemas numéricos y utiliza expresiones regulares óptimas para cumplir con sus objetivos.
🎯 Objetivos
- Reconocer valores numéricos de distintos sistemas de numeración.
- Realizar conversiones entre sistemas numéricos.
- Distinguir operadores aritméticos y signos de apertura/cierre.
- Reconocer funciones matemáticas.
- Implementar gramáticas para resolver operaciones básicas y avanzadas.
- Guardar valores ingresados para reutilizarlos como en lenguajes de programación.
🔍 Descripción del problema
El usuario puede ingresar números que pertenecen a diferentes sistemas numéricos. El programa reconoce dichos sistemas, traduce las bases numéricas y distingue operadores aritméticos, signos de agrupación y funciones matemáticas mediante expresiones regulares.
📋 Sistemas Numéricos
Sistema Numérico | Letra Reconocida | Secuencias Válidas | Ejemplos |
---|---|---|---|
Binario | b | B | [0-1] | b"1111" |
Ternario | t | T | [0-2] | T"12" |
Cuaternario | c | C | [0-3] | c"22" |
Quinario | q | Q | [0-4] | -q"11" |
Senario | x | X | [0-5] | x"100" |
Heptal | s | S | [0-6] | s"21" |
Octal | o | O | [0-7] | o"7" |
Nonario | n | N | [0-8] | N"81" |
Decimal | [0-9] | 100 | |
Hexadecimal | h | H | [0-9a-fA-F] | H"F" |
Romano | r | R | r"mmmCCXIV" |
Además, reconoce números decimales en cualquier sistema numérico, por
ejemplo: b"111.11"
.
📐 Extensión de los Números romanos
Letra | Valor | Impresión |
---|---|---|
(n|N) | 5,000 | ṽ |
(o|O) | 10,000 | Ẋ |
(p|P) | 50,000 | Ḻ |
(q|Q) | 100,000 | ĉ |
(r|R) | 500,000 | ↁ |
(s|S) | 1,000,000 | ṁ |
(t|T) | 5,000,000 | Ṽ |
(u|U) | 10,000,000 | Ẍ |
(w|W) | 50,000,000 | Ḹ |
(y|Y) | 100,000,000 | ḉ |
500,000,000 | ↇ | |
1,000,000,000 | Ṁ |
Nota: Solo representa números romanos enteros; la parte decimal se omite.
📚 C & Go
Para extender funciones matemáticas, el programa utiliza Go para exportar
definiciones inexistentes en C, como la raíz cúbica. Esto se logra
compilando el archivo math_2.go
en una librería estática.
go build -buildmode=c-archive math_2.go
Esto genera archivos math_2.h
y math_2.a
que se integran
en el proyecto C durante la compilación.
🔧 Ejecución del programa
Compila y ejecuta el programa utilizando los siguientes comandos en la terminal de Ubuntu:
yacc -d -v proyecto.ylex reconocedor.lgcc y.tab.c funciones.c lex.yy.c gofuncs/math_2.a -pthread -lfl -lm -o math_app./math_app
O simplemente usa make
para automatizar el proceso.
📊 Ejemplos de ejecución
Para preparar operaciones, utiliza la entrada y salida en archivos:
./math_app < entrada.txt > salida.txt

