Parsing
Progression
#Parsing (analyse syntaxique)
À quoi ça sert ?
À quoi ça sert: vérifier qu’une séquence de tokens suit une grammaire et construire une structure hiérarchique (AST). Comment: parseurs descendants (récursifs) ou ascendants (LR), précédence/associativité et récupération d’erreurs avec messages utiles.
Objectifs d’apprentissage
- Écrire une grammaire sans ambiguïtés (EBNF), comprendre précédences/associativités.
- Reconnaître LL vs LR; choisir un parseur récursif descendant simple quand adapté.
- Distinguer AST vs CST et conserver les positions source.
#Descente récursive minimale
#Exercice : Extension du parseur pour les affectations
Étendez le parseur pour gérer des affectations de variables et des instructions simples.
#Instructions
- Modifiez la grammaire pour inclure :
- Des instructions d'affectation :
ID = expr
- Des programmes comme séquence d'instructions
- Des instructions d'affectation :
- Ajoutez des règles pour parser les identifiants et les affectations.
- Le parseur doit retourner un AST représentant un programme avec des instructions.
#Exemple de code
pythonpython
1import re2 3# Expression régulière étendue pour les identifiants4TOKS = re.compile(r'\s*(?:(\d+)|([a-zA-Z][a-zA-Z0-9]*)|(.))')5 6def tokenize(s):7 for num, ident, other in TOKS.findall(s):8 if num:9 yield ('NUM', int(num))10 elif ident:11 yield ('ID', ident)12 elif other in '+-*/()=;':13 yield (other, other)14 elif other.strip():
Chargement de l’éditeur...
#Pièges
Dangling else
Ambiguïté classique: associer else
au bon if
. Résoudre par règles de précédence/associativité ou réécrire la grammaire.
#Mini‑quiz
Lequel décrit un arbre minimal pour la compilation ?