Este es un analizador léxico escrito en Go como proyecto final de la asignatura Teoría de Lenguajes Formales. Este proyecto está diseñado específicamente para analizar código fuente del lenguaje de programación Rust, descomponiéndolo en tokens léxicos y categorizándolos según su tipo.
El objetivo principal es procesar código fuente de Rust y descomponerlo en tokens léxicos, identificando cada elemento según su categoría gramatical. Esto sirve como base para futuros análisis sintácticos y semánticos del código.
- Lenguaje: Go (Golang)
- Dependencias:
github.com/gorilla/websocket- Para la comunicación en tiempo real detectando lo que el usuario ingresa para analizar
- Go 1.23 o superior instalado
- Navegador web moderno
go mod tidygo run main.go- Abrir el navegador en
http://localhost:8081
analizador_lexico_go/
├── main.go # Punto de entrada y servidor web
├── types/ # Definiciones de tipos y tokenizador
│ ├── token/ # Estructuras de tokens
│ └── tokenizer.go # Lógica principal del analizador
├── afd/ # Autómatas Finitos Deterministas
├── constants/ # Constantes y definiciones
└── views/ # Interfaz de usuario
└─── index.html # Página web principal`El proceso de análisis léxico se realiza de la siguiente manera:
- Entrada: El texto se convierte en un array de runes (caracteres Unicode)
- Procesamiento:
- Se ignora espacios en blanco, tabulaciones y saltos de línea
- Se analiza cada carácter secuencialmente
- Se utilizan AFDs específicos para cada tipo de token
- Salida: Lista de tokens categorizados
El proyecto implementa los siguientes AFDs:
- Detecta números naturales y reales
- Maneja punto decimal y notación científica
- Ejemplos:
42,3.14,1e-10
- Aritméticos:
+,-,*,/,% - Comparación:
==,!=,>,<,>=,<= - Lógicos:
&&,||,! - Asignación:
=,+=,-=,*=,/=,%=
- Comienza con letra o guion bajo
- Puede contener letras, números y guiones bajos
- No puede ser una palabra reservada
- Ejemplos:
variable,_private,user123
-
Comentarios de Línea (
line_comentary.go):- Comienza con
// - Continúa hasta el final de la línea
- Ejemplo:
// Este es un comentario
- Comienza con
-
Comentarios de Bloque (
blockComment.go):- Comienza con
/* - Termina con
*/ - Puede contener múltiples líneas
- Ejemplo:
/* Este es un comentario de bloque */
- Comienza con
-
Paréntesis (
parenthesis.go):- Detecta
(y) - Usados para agrupación y llamadas de función
- Detecta
-
Llaves (
brace.go):- Detecta
{y} - Usadas para bloques de código y estructuras de datos
- Detecta
-
Punto y Coma (
semicolon.go):- Detecta
; - Terminador de sentencias en Rust
- Detecta
-
Coma (
comma.go):- Detecta
, - Separador de elementos en listas y argumentos
- Detecta
- Detecta cadenas de caracteres
- Comienza y termina con comillas dobles
" - Puede contener caracteres escapados
- Ejemplo:
"Hola, mundo!"
- Detecta tipos de datos básicos de Rust
- Incluye:
- Enteros:
i32,u64,isize,usize - Flotantes:
f32,f64 - Booleanos:
bool - Caracteres:
char - Cadenas:
str
- Enteros:
- Detecta declaraciones de variables con tipo
- Patrón:
let identificador: tipo - Ejemplos:
let x: i32 = 5;let nombre: String = "Rust";
- Detecta declaraciones de tipos de retorno en funciones
- Patrón:
-> tipo - Ejemplos:
fn suma() -> i32fn procesar() -> Result<T, E>
- Detecta acceso a miembros estáticos
- Patrón:
:: - Ejemplos:
String::new()Vec::<i32>::new()
- Detecta declaraciones y uso de tipos genéricos
- Patrón:
<T>,<T: Trait>,<T, U> - Ejemplos:
struct Punto<T>fn procesar<T: Display>()Vec<i32>
- Detecta operadores de referencia y préstamo
- Patrón:
&,&mut - Ejemplos:
&variable&mut contador
Implementadas en constants/constants.go, incluye:
- Control de flujo:
if,else,while,for,loop,match - Declaraciones:
let,const,fn,struct,enum - Modificadores:
pub,mut,static - Tipos:
type,trait,impl - Y otras palabras clave específicas de Rust
Cada AFD implementa la siguiente interfaz:
func Detect[TokenType](chars []rune, startIndex int) (bool, int, token.Token)Donde:
bool: Indica si se encontró un token válidoint: Nueva posición en el textotoken.Token: Token encontrado con su categoría
Los AFDs se evalúan en el siguiente orden para evitar ambigüedades:
- Asignación de tipo
- Tipos de retorno
- Acceso estático
- Genéricos
- Paso por referencia
- Cadenas de texto
- Comentarios (línea y bloque)
- Paréntesis y llaves
- Punto y coma y coma
- Operadores
- Números
- Tipos primitivos
- Identificadores