Expression → AST → code 3 adresses
Analysez une expression arithmétique ou booléenne en AST, émettez du code à trois adresses avec pliage de constantes optionnel, et montrez le programme machine à pile équivalent.
À propos de cet outil
Un mini frontal de compilateur pour les expressions. Tapez par exemple (a + b) * c, appuyez sur Compiler, et lisez le pipeline : jetons → AST → code à trois adresses → machine à pile.
Grammaire. Nombres, identifiants, unaires +/-/!, binaires + - * / %, comparaisons == != < > <= >=, et booléens && ||, avec la précédence habituelle (|| la plus basse, * / % la plus haute). Les parenthèses forcent la précédence. true/false valent 1 et 0.
Le code à trois adresses est la forme intermédiaire classique : chaque instruction est t := a op b (ou unaire). Les temporaires sont des t1, t2, … frais. Le repli de constantes, s'il est activé, évalue les sous-arbres purement numériques avant l'émission — essayez (2 + 3) * x + 4 * 5 avec et sans repli.
Machine à pile est ce qu'exécuterait une VM bytecode ou une calculatrice postfixe : LOAD/PUSH puis des opérateurs qui dépilent les opérandes et empilent le résultat. L'AST est parcouru en post-ordre, donc le programme de pile est exactement la Reverse Polish Notation de l'expression.
Pourquoi c'est utile. Les vrais compilateurs (LLVM, GCC, JVM javac) passent tous par une forme d'AST puis un IR linéaire avant l'allocation de registres. Voir l'arbre et le TAC côte à côte rend concrets la précédence, l'associativité et le nommage des temporaires.
Limites. Expressions seulement — pas d'instructions, d'affectations, d'appels, de tableaux ni d'abaissement du court-circuit. Une division par zéro dans le repli n'effectue pas de repli pour ce nœud. La disposition de l'AST est un placement infixe simple, adapté jusqu'à quelques dizaines de nœuds.
Cliquez sur un nœud ou une instruction pour surligner leur correspondance. Les jetons et compteurs sont des détails facultatifs. Modifier l’expression ou le repli efface la sortie précédente. Les décimales utilisent un point ; les nombres suivent le binary64 de JavaScript, pas des entiers exacts. Les instructions booléennes évaluent les deux opérandes et donnent 0 ou 1, sans court-circuit C/Java. Les temporaires évitent les noms présents dans l’arbre émis. Les nœuds restent lisibles et les grands arbres défilent localement.
Entrée conserve les sauts de ligne ; Ctrl/Meta+Entrée compile. Le texte brut, le repliement et le choix d’exemple sont enregistrés localement, y compris les saisies invalides. Le parseur accepte 2 000 caractères et 128 jetons ; la saisie n’est pas tronquée silencieusement. Le zéro négatif reste représenté par -0 dans l’arbre replié et les littéraux numériques générés.