caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* Stream patterne matching
       [not found] <9303171031.AA15612@pauillac.inria.fr>
@ 1993-03-17 11:31 ` cr
  1993-03-17 13:47   ` Michel Mauny
  0 siblings, 1 reply; 4+ messages in thread
From: cr @ 1993-03-17 11:31 UTC (permalink / raw)
  To: Michel.Mauny; +Cc: caml-list


Ok, Si j'ai bien compris le fait d'abstraire une re`gle fait perdre des
factorisations. Ce qui est illustre' par l'exemple suivant :

#let E = function
#  [< '0; '1 >] -> true
# |[< '0; '2 >] -> false;;

est factorisable. Mais

#let pp = function p -> function
#  [< '0; '1 >] -> true
# |[< p _ ; '2 >] -> false;;

ne l'est pas. Pourtant (pp (function [<'0 >] -> ())) est e'quivalent a` E.

Es-je bien compris ?

Pourtant, j'ai un doute. si l'on essaye E, on s'aperc,oit qu'il y a un cas
inutilise dans le patterne matching. Une factorisation est donc ne'cessaire. Il
faut la faire a la main ! Tandis que dans pp, le compilo ne bronche pas. caml
fait donc de'ja une diffe'rence entre les deux.

Ne pourrais t'on pas au moins faire la factorisation quand le compilo signale
un cas inutilise' dans le matching ? Avec e'ventuellement un warning pour
l'utilisateur ?

Mais l'essentiel n'est-il pas que si (pp p) est factorisable alors E(p') l'est
aussi ? (cela esr vrai, je pense ?)

Y a-t'il des exemples plus complexes ?

Christophe

PS: Je crois que je commence a jouer l'avocat du diable. En effet en regardant
a` nouveau les analyseur que j'ai pu ecrire, je me dis que je ne sais plus trop
si je veux la factorisation. 

En effet, j'e'tait un peu e'nerve a chaque foi que je m'apercevais qu'une
factorisation etait ne'cessaire, et que je devais donc taper une dizaine de
lignes supplementaires.

Mais au total, le programme est en gros deux fois plus gros qu'avec camlyacc
(sauf qu'avec camlyacc, je n'aurais pas pus l'ecrire !). Ce n'est pas si
terrible. 

Et, le fait de factoriser soi-meme permet d'avoir un programme dont le
comportement est limpide.

Je ne sais donc plus se que je veux !!!!!

PS-bis: Je suis sure que certain d'entre vous ont des syste`mes automatiques
pour gerer les accents. Moi j'utilise emacs pour lire mon courier, quelqu'un
peut-il me suggerer quelque-chose. 





^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Stream patterne matching
  1993-03-17 11:31 ` Stream patterne matching cr
@ 1993-03-17 13:47   ` Michel Mauny
  1993-03-17 18:06     ` murthy
  1993-03-17 20:26     ` Stream pattern matching Xavier Leroy
  0 siblings, 2 replies; 4+ messages in thread
From: Michel Mauny @ 1993-03-17 13:47 UTC (permalink / raw)
  To: cr; +Cc: Michel.Mauny, caml-list

> Ok, Si j'ai bien compris le fait d'abstraire une re`gle fait perdre des
> factorisations. Ce qui est illustre' par l'exemple suivant :
> 
> #let E = function
> #  [< '0; '1 >] -> true
> # |[< '0; '2 >] -> false;;
> 
> est factorisable. Mais
> 
> #let pp = function p -> function
> #  [< '0; '1 >] -> true
> # |[< p _ ; '2 >] -> false;;
> 
> ne l'est pas. Pourtant (pp (function [<'0 >] -> ())) est e'quivalent a` E.
> 
> Es-je bien compris ?

Oui, tout a` fait.

> Pourtant, j'ai un doute. si l'on essaye E, on s'aperc,oit qu'il y a un cas
> inutilise dans le patterne matching. Une factorisation est donc ne'cessaire. Il
> faut la faire a la main ! Tandis que dans pp, le compilo ne bronche pas. caml
> fait donc de'ja une diffe'rence entre les deux.

Le compilo fait une diffe'rence et il peut envoyer un warning dans le
premier cas, alors que dans le second, il ne sait rien du tout.

> Ne pourrais t'on pas au moins faire la factorisation quand le compilo signale
> un cas inutilise' dans le matching ? Avec e'ventuellement un warning pour
> l'utilisateur ?

Il y a une diffe'rence importante entre envoyer un warning disant a`
l'utilisateur:

        Attention: votre programme ne fait peut-e^tre pas ce que vous
        attendez de lui!

et un autre disant:

        Attention: j'ai CHANGE' votre programme de sorte qu'il fasse
        ce que (je suppose) que vous attendez de lui!

J'exage`re un peu (de'sole'), mais l'important est que le comportement
des analyseurs actuels est uniforme, pas de cas particuliers, et cela
en facilite l'explication. Encore une fois, sur une notion plus
"declarative" de grammaires, je crois qu'on pourra faire beaucoup plus
de choses (analyses et optimisations) inte'ressantes.

> Mais l'essentiel n'est-il pas que si (pp p) est factorisable alors E(p') l'est
> aussi ? (cela esr vrai, je pense ?)

Oui, je crois que c'est vrai, mais c'est une e'quivalence qu'on
voudrait, car l'exemple d'abstraction de sous-expression que je
donnais dans mon message pre'ce'dent est re'versible en ``inlining''.
Ces manipulations (a` la main) de programmes sont tre`s courantes, et
il serait dommage qu'elles soient trop complexes a` cause de
subtilite's ope'rationnelles.

> Y a-t'il des exemples plus complexes ?

On doit tomber sur de ve'ritables casse-te^tes lorsqu'il s'agit de
traduire une grammaire BNF existante (Yacc ou whatever) en analyseurs
de Caml-Light, mais je n'ai personnellement que peu d'expe'rience en
la matie`re.

Michel




^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Stream patterne matching
  1993-03-17 13:47   ` Michel Mauny
@ 1993-03-17 18:06     ` murthy
  1993-03-17 20:26     ` Stream pattern matching Xavier Leroy
  1 sibling, 0 replies; 4+ messages in thread
From: murthy @ 1993-03-17 18:06 UTC (permalink / raw)
  To: caml-list


CR==Christophe
MM==Michel Mauny

CR> Y a-t'il des exemples plus complexes ?

	MM> On doit tomber sur de ve'ritables casse-te^tes lorsqu'il
	MM> s'agit de traduire une grammaire BNF existante (Yacc ou
	MM> whatever) en analyseurs de Caml-Light, mais je n'ai
	MM> personnellement que peu d'expe'rience en la matie`re.

J'ai fait pas mal des parsers pour l'analyse syntaxique, au niveau de
lexing et aussi ua niveau de parsing.  C'est un peu dificil, mais pas
vraiement.  Il s'agit simplemet d'ecrire un "analyseur", comme Michel
disait, et pas un "grammaire".  C'est-a-dire, dites a l'ordinateur
exactement ce que tu veux qu'elle fasse.  C'est tout.

C'est vrai que la factorisation serait utile.  Mais, comme Michel
disait, seulement en certains cas.  Ces cas-la, sont les cas quand on
veut utiliser cette systeme des "analyseurs", etc, comme un systeme
des "grammaires".

Boeuf.  En Anglais.  Having factorization done automatically is only
useful when you are using parsers/printers as a grammar facility.  It
is NOT such a facility.  In lots of other cases, having factorization
around could be a very bad thing.  Because it would change the
behaviour of your program.

An analogy which is quite familiar could be an ML compiler which used
beta-reduction for code inlining, rather than beta-value reduction.
If you aren't careful, you can end up "improving" programs which do
not terminate, into programs which _do_ terminate.  Its easy to do.
And this is bad because when I start debugging a non-terminating
program, I cut out pieces of the code, and start running them in a
context which is different from that of the original program.

So if the compiler all of a sudden can do new optimizations, say,
because I feed in more specific arguments to a function, and this
causes the compiler to "make the function terminate", then I can't
even do debugging.

The same thing is going on here.  Factorization could make buggy
parsers become un-buggy, when I replace an abstract parser by
something more concrete.

And this would make debugging of analyzers impossible.  Completely
impossible.

And frankly, if that happened, I'd stop using them.

Besides, if you want a "grammar" facility, then just write one.  It
isn't that hard.

--chet--




^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Stream pattern matching
  1993-03-17 13:47   ` Michel Mauny
  1993-03-17 18:06     ` murthy
@ 1993-03-17 20:26     ` Xavier Leroy
  1 sibling, 0 replies; 4+ messages in thread
From: Xavier Leroy @ 1993-03-17 20:26 UTC (permalink / raw)
  To: Michel.Mauny; +Cc: cr, caml-list

En plus de corriger l'orthographe de la ligne "Subject", je voudrais
juste faire remarquer que la factorisation gauche automatique des
analyseurs n'est non seulement pas vraiment souhaitable, mais encore
infaisable dans toute sa generalite a cause des effets de bords:

        let f = function [< p x; 'Terminal "foo" >] -> ...
                       | [< p x; 'Terminal "bar" >] -> ...

n'est pas factorisable, car rien ne vous dit que "p" va se comporter
de la meme maniere lorsqu'il est appele deux fois sur le meme flux.
Telle est la puissance et la gloire des langages algorithmiques, mes
freres. La factorisation gauche automatique ne serait possible que
pour des motifs commencant par des terminaux, ce qui n'est pas tres
interessant.

- Xavier





^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~1993-03-18  9:18 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <9303171031.AA15612@pauillac.inria.fr>
1993-03-17 11:31 ` Stream patterne matching cr
1993-03-17 13:47   ` Michel Mauny
1993-03-17 18:06     ` murthy
1993-03-17 20:26     ` Stream pattern matching Xavier Leroy

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).