Expresión → AST → código de 3 direcciones
Analiza una expresión aritmética o booleana en un AST, emite código de tres direcciones con plegado de constantes opcional y muestra el programa de máquina de pila equivalente.
Acerca de esta herramienta
Un mini frontal de compilador para expresiones. Escribe algo como (a + b) * c, pulsa Compilar y lee la canalización: tokens → AST → código de tres direcciones → máquina de pila.
Gramática. Números, identificadores, unarios +/-/!, binarios + - * / %, comparaciones == != < > <= >= y booleanos && ||, con la precedencia habitual (|| la más baja, * / % la más alta). Los paréntesis anulan la precedencia. true/false valen 1 y 0.
El código de tres direcciones es la forma intermedia clásica: cada instrucción es t := a op b (o unaria). Los temporales son t1, t2, … nuevos. El plegado de constantes, si está activo, evalúa los subárboles de solo números antes de emitir — prueba (2 + 3) * x + 4 * 5 con el plegado activado y desactivado.
Máquina de pila es lo que ejecutaría una VM de bytecode o una calculadora postfija: LOAD/PUSH y luego operadores que desapilan operandos y apilan el resultado. El AST se recorre en postorden, así que el programa de pila es exactamente la Reverse Polish Notation de la expresión.
Por qué importa. Los compiladores reales (LLVM, GCC, JVM javac) pasan todos por alguna forma de AST y luego un IR lineal antes de la asignación de registros. Ver el árbol y el TAC juntos hace concretos la precedencia, la asociatividad y el nombrado de temporales.
Límites. Solo expresiones — sin sentencias, asignaciones, llamadas, arrays ni bajada de control de cortocircuito. La división por cero en el plegado no pliega ese nodo. La disposición del AST es una colocación infija simple, adecuada hasta unas decenas de nodos.
Pulsa un nodo o una instrucción para resaltar su correspondencia. Los tokens y contadores son detalles opcionales. Cambiar la expresión o el plegado borra la salida anterior. Los decimales usan punto; los números siguen binary64 de JavaScript, no enteros exactos. Las instrucciones booleanas evalúan ambos operandos y producen 0 o 1, sin cortocircuito C/Java. Los temporales evitan los nombres del árbol emitido. Los nodos mantienen tamaños legibles y los árboles grandes se desplazan localmente.
Intro conserva los saltos de línea; Ctrl/Meta+Intro compila. El texto, el plegado y el ejemplo se guardan localmente, incluidas las entradas inválidas. El analizador admite 2.000 caracteres y 128 tokens; la entrada no se recorta silenciosamente. El cero negativo se conserva como -0 en el árbol plegado y los literales numéricos generados.