# R2Rust 🚀
R2Rust es un intérprete escrito en **Rust** inspirado en el lenguaje de programación R. Este proyecto reimplementa funcionalidades básicas de R con el objetivo de ser ligero, eficiente y modular.
---
## **Características**
- **Tokenización (Lexer):** Convierte texto de entrada en tokens estructurados.
- **Análisis Sintáctico (Parser):** Convierte tokens en un AST (Abstract Syntax Tree).
- **Evaluación (Evaluator):** Procesa expresiones matemáticas y asignaciones.
- **Entorno (Environment):** Gestiona variables y su estado durante la ejecución.
- **REPL (Read-Eval-Print Loop):** Interfaz interactiva para evaluar expresiones en tiempo real.
---
## **Instalación**
### **Prerrequisitos**
- **Rust**: Necesitas tener instalado Rust en tu máquina. Puedes instalarlo siguiendo [esta guía](https://www.rust-lang.org/tools/install).
### **Clonar el Repositorio**
Clona este proyecto desde GitHub:
```bash
git clone https://github.com/R2Rust/core.git
cd core
```
### **Compilar el Proyecto**
Compila el proyecto utilizando `cargo`:
```bash
cargo build
```
---
## **Uso**
### **Ejecutar el REPL**
Para iniciar el REPL interactivo:
```bash
cargo run
```
Ejemplo de sesión interactiva:
```plaintext
Welcome to R2Rust! 🚀
Type 'exit' to quit or 'help' for instructions.
rustr> x <- 10 + 20
Result: 30
rustr> y <- x + 5
Result: 35
rustr> exit
Goodbye!
```
---
## **Estructura del Proyecto**
```
R2Rust/
├── src/
│ ├── ast.rs # Definición del Abstract Syntax Tree (AST)
│ ├── environment.rs # Manejo de variables y estado
│ ├── evaluator.rs # Evaluación de expresiones
│ ├── lexer.rs # Tokenización de entrada
│ ├── parser.rs # Análisis sintáctico
│ ├── repl.rs # Read-Eval-Print Loop
│ ├── lib.rs # Biblioteca central del proyecto
│ └── main.rs # Punto de entrada principal
├── tests/ # Pruebas para los módulos
│ ├── lexer_tests.rs
│ ├── parser_tests.rs
│ ├── evaluator_tests.rs
│ └── repl_tests.rs
├── Cargo.toml # Configuración del proyecto y dependencias
├── Cargo.lock # Bloqueo de versiones de dependencias
└── README.md # Documentación del proyecto
```
---
## **Contribuir**
¡Las contribuciones son bienvenidas! Si quieres colaborar:
1. Haz un fork del proyecto.
2. Crea una rama para tu funcionalidad:
```bash
git checkout -b feature/nueva-funcionalidad
```
3. Realiza tus cambios y haz un commit:
```bash
git commit -m "Añadir nueva funcionalidad"
```
4. Sube tu rama al repositorio remoto:
```bash
git push origin feature/nueva-funcionalidad
```
5. Abre un Pull Request en GitHub.
---
## **Pruebas**
Ejecuta todas las pruebas para asegurarte de que todo funcione correctamente:
```bash
cargo test
```
---
## **Licencia**
Este proyecto está licenciado bajo la **GNU General Public License v3.0**. Consulta el archivo `LICENSE` para más información.
---