Diagrama – Generación de diagramas Mermaid del AST
Archivo: src/diagrama.rs
CLI: forja diagrama
El comando forja diagrama (o forja grafico) genera un diagrama Mermaid a partir de un archivo .fa:
forja diagrama "ejemplo.fa" // genera ejemplo.mmd
forja diagrama "ejemplo.fa" -o "salida.mmd" // archivo específico
forja diagrama "ejemplo.fa" -o - // stdout .mmd generado se puede visualizar en cualquier herramienta compatible con Mermaid.js (GitHub Markdown, mermaid.live, editores con plugin Mermaid).Estructura: DiagramGenerator
La estructura principal es DiagramGenerator (599 líneas). Genera diagramas en sintaxis Mermaid graph TD recorriendo el AST recursivamente.
Métodos públicos
| Método | Descripción |
|---|---|
pub fn new() -> Self | Crea un nuevo generador de diagramas vacío |
pub fn generar(&mut self, p: &Programa) -> String | Recibe un AST (Programa) y retorna un string en formato Mermaid graph TD |
Cómo funciona
El generador recorre el árbol AST de forma recursiva y genera nodos Mermaid para cada tipo de declaración y expresión:
- Punto de entrada:
generar()crea un nodo "Inicio" y un nodo "Fin", y enlaza el bloque principal de declaraciones entre ellos. - Bloques secuenciales: Cada declaración produce nodos con flechas
-->entre sí. Las funciones y clases se agrupan ensubgraph. - Condicionales
si/sino: Crea un nodo rombo{ }con la condición, y dos ramas:-- Si -->y-- Sino -->que se unen al final. - Bucles
mientras: Nodo rombo + flecha de retroalimentación (be --> cond_node) + salida-- No -->. - Bucles
para: Tres nodos: Init (rectángulo), Condición (rombo), Incremento (rectángulo) con retroalimentación. - Bucles
repetir: Nodo rombo con-- Bucle -->y retroalimentación, más-- Fin -->. - Funciones: Se envuelven en
subgraph Fn_nombrecon su propio Inicio/Fin interno. - Clases: Se envuelven en
subgraph Class_nombre, y cada método en un sub-subgraph. - Bloque
cuando: Similar a un condicional, con nodo rombo y cuerpo.
Tipos de nodos Mermaid usados
| Forma | Sintaxis Mermaid | Uso en DiagramGenerator |
|---|---|---|
| Inicio / Fin | ([label]) | Nodos redondeados para start/end de función y programa |
| Acción | [label] | Variables, asignaciones, llamadas, retornos |
| Decisión | {label} | Condiciones de si, mientras, para, repetir |
Ejemplo de entrada y salida
Dado este programa Forja:
funcion saludar(nombre) {
escribir("Hola, " + nombre)
}
variable x = 10
si (x > 5) {
saludar("Mundo")
} El generador produce un diagrama Mermaid como este:
graph TD
N0([Inicio])
subgraph Fn_saludar ["funcion saludar(nombre)"]
N1([Inicio])
N2[escribir("Hola, " + nombre)]
N3([Fin])
N1 --> N2
N2 --> N3
end
N4[x = 10]
N0 --> N4
N5{si (x > 5)}
N4 --> N5
N6[saludar("Mundo")]
N5 -- Si --> N6
N7([Fin])
N6 --> N7
N5 -- Sino --> N7 .mmd se puede incrustar directamente en GitHub Markdown con ```mermaid, o en cualquier página web que soporte Mermaid.js.Declaraciones soportadas
El generador maneja todos estos tipos de declaraciones del AST:
| Declaración | Representación en el diagrama |
|---|---|
variable x = 5 | Nodo rectángulo: [var x = 5] |
constante x = 5 | Nodo rectángulo: [const x = 5] |
x = 10 (asignación) | Nodo rectángulo: [x = 10] |
funcion f(p) { ... } | subgraph Fn_f con Inicio → cuerpo → Fin |
clase C { ... } | subgraph Class_C con subgraph por método |
si (cond) { ... } sino { ... } | Nodo rombo + ramas Si/Sino + merge |
mientras (cond) { ... } | Nodo rombo + retroalimentación + salida No |
para (i=0; i<N; i++) { ... } | Init → Cond(rombo) → cuerpo → Inc → retroalimentación |
repetir (N) { ... } | Nodo rombo repetir N veces + retroalimentación |
cuando (var) { ... } | Nodo rombo cuando (var) + cuerpo |
retornar expr | Nodo rectángulo: [retornar expr] |
f(args) (llamada) | Nodo rectángulo: [f(args)] |
importar ruta o importar "ruta/absoluta" | Comentario: %% Importar ruta |
tipo X = A | B | Nodo rectángulo con la definición |
rasgo R { metodos } | subgraph Rasgo_R |
implementa R para C { ... } | subgraph Impl_R_C con métodos |
variable a, b = expr | Nodo rectángulo: [a, b = expr] |
Expresiones soportadas
El generador también renderiza expresiones dentro de los nodos: literales, identificadores, operaciones binarias/unarias, llamadas, acceso a miembros, instanciación (nuevo), referencias (& / &mut), arreglos, mapas, indexación, coincidir, hilo, canal(), seleccionar, try (?), asignación, Ok()/Error()/Algo(), y keywords de contratos (resultado, anterior).
Integración WASM
diagrama.rs está compilado a WebAssembly en el crate forja-wasm, permitiendo generar diagramas Mermaid directamente en el navegador desde el Playground.
.mmd). Para visualizarlo necesitás un renderizador Mermaid.js externo. El comando CLI guarda el archivo, no lo renderiza.