Grammaires et pretty print

From: Emmanuel Engel (Emmanuel.Engel@lri.fr)
Date: Tue Dec 02 1997 - 13:45:37 MET


Date: Tue, 02 Dec 1997 13:45:37 +0100
From: Emmanuel Engel <Emmanuel.Engel@lri.fr>
To: caml-list@inria.fr
Subject: Grammaires et pretty print

J'ai une question sur les grammaires et le pretty-print. Chaque fois
que je doit debugger un programme, je suis toujours plus ou moin amene
a definir des pretty printer pour avoir une chance de faire afficher
au debugger ou aux "print" que j'insere partout dans le code les
informations (de facon lisible) qui me sont utiles pour suivre le
deroulement de l'execution du programme. Par ailleurs bien souvent
j'ai ecrit un parser (avec camlyacc) pour ces structures de donnees.

Il me semble qu'un outil qui sait engendre des parser devrait aussi
savoir faire du pretty-print. Je m'explique:

Un outil comme (caml)yacc (camlp4) prend en entree une grammaire, des
(meta) regles pour desambiguer cette grammaire et rend un parser qui
reconnait les expressions du langage engendre par la grammaire.
Pourquoi de tels outils ne rendent pas aussi un pretty-printer pour
les expressions engendrees par la grammaire ? Cela ne me semble plus
facile que le parsing:

Soit la grammaire non ambigue

E -> E_1 + E | E_1
E_1 -> E_2 * E_1 | E_2
E_2 -> cst | (E)

Engendrer le pretty-printer de maniere systematique avec un
parenthesage minimal n'est pas difficile, il suffit d'ecrire une serie
de fonction mutuellement recursives qui suivent exactement la
structure de la grammaire:

let rec print_E = function
  x1 + x2 ->
   print_E_1 x1;
   print_token +;
   print_E x2
 |x ->
   print_E_1 x

and print_E_1 = function
  x1 * x2 ->
   print_E_2 x1;
   print_token *;
   print_E_1 x2
 |x ->
   print_E_2

and print_E_2 = function
  cst ->
    print cst
 |x ->
    print_token (;
    print x;
    print_token )

De tels outils n'existent pas. Il doit y avoir une bonne raison, quel
est le point que j'ai loupe ??

-- 

- Emmanuel Engel



This archive was generated by hypermail 2b29 : Sun Jan 02 2000 - 11:58:13 MET