OCaml (option informatique) · Chapitre 21 · Exercice de TD
Lexer complet
Analyse syntaxique et interprétation · niveau 2
Énoncé
Écrire lexer gérant les nombres à plusieurs chiffres et les espaces.
Corrigé
let lexer s =
let n = String.length s in
let lex = ref [] and i = ref 0 in
while !i < n do
let c = s.[!i] in
if c = ' ' then i := !i + 1
else if c = '+' then begin lex := Plus :: !lex; i := !i + 1 end
else if c = '-' then begin lex := Moins :: !lex; i := !i + 1 end
else if c = '*' then begin lex := Fois :: !lex; i := !i + 1 end
else if c = '(' then begin lex := ParenG :: !lex; i := !i + 1 end
else if c = ')' then begin lex := ParenD :: !lex; i := !i + 1 end
else if c >= '0' && c <= '9' then begin
let v = ref 0 in
while !i < n && s.[!i] >= '0' && s.[!i] <= '9' do
v := !v * 10 + (int_of_char s.[!i] - int_of_char '0');
i := !i + 1
done;
lex := Nombre !v :: !lex
end
else failwith "caractere inattendu"
done;
renverse !lex
La boucle interne accumule un nombre tant qu'on lit des chiffres (v := !v * 10 + chiffre). On accumule les lexèmes à l'envers, d'où le renverse final.
Exercices semblables
- Analyser un facteur corrigé
- Priorité du produit corrigé
- L'analyseur complet corrigé
- L'interpréteur corrigé
- Ajouter la division corrigé