

/* ANALYSE DES EXPRESSIONS ARITHMETIQUES CLASSIQUES */

/* avec construction des arbres de derivation */

/*======================================================================*/

/* Primo : en Completement Parenthesee  et en  Prefixee */
/* Grammaires analysables de maniere descendante !!! */
/* Pour la postfixee et la notation a precedences, c'est plus dur. */

/* Appel par exp("chose", []). On traite donc une liste de codes ASCII ... */
/* ascii('(') = 40 ')' = 41 '+' = 43  'x' = 120 */

/* Pour les deux :  Op -> +|* , Var -> x|y|z */

opr([42 | S], S, *). 
opr([43 | S], S, +). 

variable([120 | S], S, x).
variable([121 | S], S, y).
variable([122 | S], S, z).

/* Prefixee : E -> Op E E, E -> Var */

expref(X, Y, pref1(Op, Ad1, Ad2)) :- opr(X, X1, Op), 
			expref(X1, X2, Ad1), expref(X2, Y, Ad2).
expref(X, Y, pref2(V)) :- variable(X, Y, V).

/* Completement parenthese : E -> (E Op E) , E -> Var */

parouv([40 | S], S).
parfer([41 | S], S).

expcp(X, Y, cp1(Ad1, Op, Ad2)) :- parouv(X, X1), 
	     expcp(X1, X2, Ad1), opr(X2, X3, Op), expcp(X3, X4, Ad2), 
	     parfer(X4, Y).
expcp(X, Y, cp2(V)) :- variable(X, Y, V).


/* EXERCICE : analyser sur ce modele la notation  incompletement parenthesee
   a deux operateurs + et *, AVEC ASSOCIATION A DROITE
   E -> T + E, E -> T, T -> F * T, F -> ( E ), F -> Var */


/*========================================================================*/

/* Secundo : Traitement d'une grammaire recursive a gauche : la postfixee */

/* E -> E E Op, E -> Var  recursive a gauche se transforme en
   E -> Var S, E -> Var, S -> E Op S, S -> E Op */

expost(X, Y, post1(V, Ad)) :- variable(X, X1, V), suite(X1, Y, Ad).
expost(X, Y, post2(V)) :- variable(X, Y, V).

suite(X, Y, post3(Ad1, Op, Ad2)) :- expost(X, X1, Ad1), opr(X1, X2, Op),
		 suite(X2, Y, Ad2).
suite(X, Y, post4(Ad, Op)) :- expost(X, X1, Ad), opr(X1, Y, Op).
	

/* Dans le meme esprit, la notation a precedences classique, 
	AVEC ASSOCIATION A GAUCHE */

/* E -> E Op T, E -> T,  T -> ( E ), T -> Var  
   recursive a gauche se transforme en
   E -> T S, E -> T, S -> Op T S, S -> Op T, T -> ( E ), T -> Var */

expclas(X, Y, clas1(Ad1, Ad2)) :- terme(X, X1, Ad1), sclas(X1, Y, Ad2).
expclas(X, Y, clas2(Ad)) :- terme(X, Y, Ad).

sclas(X, Y, clas3(Op, Ad1, Ad2)) :- opr(X, X1, Op), terme(X1, X2, Ad1), 
		sclas(X2, Y, Ad2).
sclas(X, Y, clas4(Op, Ad)) :- opr(X, X1, Op), terme(X1, Y, Ad).

terme(X, Y, clas5(Ad)) :- parouv(X, X1), expclas(X1, X2, Ad), parfer(X2, Y).
terme(X, Y, clas6(V)) :- variable(X, Y, V).

