← Volver a todos los proyectos

🧮 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
sh

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.y
lex reconocedor.l
gcc y.tab.c funciones.c lex.yy.c gofuncs/math_2.a -pthread -lfl -lm -o math_app
./math_app
sh

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
sh
Entrada Salida