Aller au contenu
Tous les projets

Projet personnel · 2021 – 2023

flush un interpréteur en Rust

J’ai écrit flush pour comprendre comment un langage s’exécute vraiment. Le code source passe par un lexer, puis par un parser récursif descendant qui construit un arbre syntaxique abstrait (AST). Un évaluateur parcourt ensuite cet arbre en gérant les variables et leur portée. Le langage a des fonctions, des boucles, des listes et des dictionnaires, et peut charger d’autres fichiers. Les erreurs indiquent le fichier et la ligne du problème.

développeur : moi
1
étages : lexer, parser, évaluateur
3
dépendances seulement
2
  • Rust
  • Git
factorial.flush
def fac(n) {
    if (n <= 1) {
        return 1
    }

    return n * fac(n - 1)
}

def main() {
    printLn(fac(5))
}
$ flush factorial.flush
120

Contexte

Projet personnel, lancé en 2021 pour apprendre Rust par la pratique. Il m’a fallu me plonger dans la théorie des langages et l’analyse par descente récursive.

Ce que j’ai fait

  1. Syntaxe du langage : fonctions, conditions, boucles while et for
  2. Parser récursif descendant, qui transforme les tokens en AST
  3. Évaluateur, avec une pile de portées pour les variables
  4. Listes, dictionnaires et chargement d’autres fichiers
  5. Fonctions intégrées (maths, entrées-sorties, comparaisons) et erreurs localisées à la ligne
Difficultés
  • Gérer la récursion et la durée de vie des nœuds de l’AST en Rust, sans ramasse-miettes
  • Signaler les erreurs clairement sans faire planter l’interpréteur
Ce que j’en retiens
  • Rust et le borrow checker
  • Analyse lexicale et syntaxique
  • Construction et parcours d’un AST