Adloun

L'analyseur complet

Exercice · OCaml (option informatique), chapitre 21 — Analyse syntaxique et interprétation

Énoncé

Écrire parse_expr et ses fonctions associées (descente récursive), gérant +, -, * et les parenthèses.

Corrigé

let rec parse_expr lex =
  let (g, reste) = parse_terme lex in
  boucle_add g reste
and boucle_add g lex =
  match lex with
  | Plus :: reste  -> let (d, r) = parse_terme reste in boucle_add (Add (g, d)) r
  | Moins :: reste -> let (d, r) = parse_terme reste in boucle_add (Sub (g, d)) r
  | _ -> (g, lex)
and parse_terme lex =
  let (g, reste) = parse_facteur lex in
  boucle_mul g reste
and boucle_mul g lex =
  match lex with
  | Fois :: reste -> let (d, r) = parse_facteur reste in boucle_mul (Mul (g, d)) r
  | _ -> (g, lex)
and parse_facteur lex =
  match lex with
  | Nombre v :: reste -> (Const v, reste)
  | ParenG :: reste ->
      let (e, r) = parse_expr reste in
      (match r with ParenD :: r2 -> (e, r2) | _ -> failwith "parenthese attendue")
  | _ -> failwith "facteur attendu"

Cinq fonctions mutuellement récursives reflètent la grammaire. Les boucle_* réalisent les répétitions « » en associant à gauche.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.