Lex vs Yacc : comparateur analyseur lexical vs générateur d'analyseur syntaxique
Outils de construction de compilateurs : Lex et Yacc expliqués
Lex et Yacc sont des outils Unix fondamentaux pour construire compilateurs et interprètes. Ils gèrent les phases séquentielles du traitement du langage.
Lex — Générateur d'analyseur lexical
- Entrée : Expressions régulières (motifs pour tokens)
- Sortie : Programme C (
lex.yy.c) = lexer/scanner - Fonction : Flux caractères → Flux tokens
- Tokens : Mots-clés, identifiants, littéraux, opérateurs, ponctuation
- Déterministe : Connaît toujours le token suivant (basé DFA)
- Plus simple : Plus facile à apprendre, écrire, déboguer
Yacc — Yet Another Compiler-Compiler (Générateur d'analyseur syntaxique)
- Entrée : Grammaire hors-contexte (règles type BNF)
- Sortie : Programme C (
y.tab.c) = parser - Fonction : Flux tokens → Arbre d'analyse / AST
- Analyse : LALR(1) — bottom-up, lookahead 1
- Non-déterministe : Peut backtrack/résoudre conflits (shift/reduce, reduce/reduce)
- Complexe : Conception grammaire, résolution conflits, règles priorité
Flux de travail
[Code source] → [Lex] → [Tokens] → [Yacc] → [Arbre analyse] → [Analyse sémantique] → [Génération code]
Différences clés
| Aspect | Lex | Yacc |
|---|---|---|
| Phase | Analyse lexicale (scanning) | Analyse syntaxique (parsing) |
| Formalisme | Expressions régulières | Grammaire hors-contexte |
| Sortie | Tokens (symboles terminaux) | Hiérarchie structurée (AST) |
| Complexité | Faible | Élevée |
| Déterminisme | Oui (DFA) | Non (LALR avec conflits) |
| Gestion erreurs | Caractère invalide | Récupération erreur syntaxe |
Successeurs modernes
- Flex (GNU Lex) + Bison (GNU Yacc) — standard sur Linux
- ANTLR — grammaire unifiée, LL(*), multi-cible (Java, Python, JS, C++)
- Tree-sitter — analyse incrémentale pour IDEs
Lex/Yacc restent la base pédagogique pour comprendre les pipelines de traitement de langage.
