  &REFER(VTRLOG,GRAMTRDEMO).

  &GRAMMAIRE.


  &ENTREE: TRADCONV(U).

	RAPPEL(@GRNIV1;1): 1 / 1:(%PROF(*)=2) => 1.

  --> %STOP.

  &GRAM: GRNIV1(I,,GRNIV1).

	RSELECTREL($GRINTER;7/$GRAMWHERE;9/$GRFROM;FROM): 0(*,1,2(3,4(5(6,7),8,9))) / 0: (KPH = PH);
			1: (K = GN)&(SOUSD $>= INT); 2: (K = GV);
			3: (FS = GOV)&(UL = 'tre'); 4: (K = GN)&(FS = ATTR);
			5: (K = GNPREP); 6: (FS = GOV)&(TYPLOC(DICT(*)) = CONST);
			7: (K = PHRASE); 8: (FS = GOV)&(SOUSR $>= DEM); 9: (KPH = PHREL)
	=> N0(TRAD1(X(SEL,FROM(FRMCH,ELEM,A(*9*),NL),WH(WHERE,FCT,9),AND(V1,7),FN)),0) /
							SEL:(FRM='select '||FRM(DICT(6))||'.'||FRM(DICT(6,2));LEMME='SELECT');
							FRMCH:(FRM=' from ';LEMME='FROM'); ELEM: (FRM=FRM(DICT(6));LEMME=FRM(DICT(6)));
							NL: (FRM='\n';LEMME='Nouvelle ligne');
							A: 9; WHERE:(FRM='where ';LEMME='WHERE');
							FCT: (<LEMME(DICT(6)) != '':
							FRM=FRM(DICT(6))||'.'||LEMME(DICT(6))||' = \''||FRM(6)||'\'\n';LEMME=LEMME(DICT(6))>);
							X: (FRM(prefixe_expression) = FRM(DICT(6,3));FRM(recherche_expression)=FRM(DICT(6)));
							V1: (FRM = 'and ';LEMME='AND');
							FN: (FRM=';\n'; LEMME=';'). 

	RELIMINWHERAND: 0(*,1,*,2(*),*,3(*,4)) / 1: (LEMME='WHERE'); 2: (FRM=''); 4: (FRM(*,0,3) = 'and')
		=> 0(1,3).

	RELIMFIN: 0(1(*,2,*)) / 1: (K = PHRASE); 2: (CAT = PONCT)
		=> 0.
  
  --> %STOP.

  &GRAM: GRFROM(I).

	RADJDEF: 0(1(2,3(4,5(6(7))))) / 0: (K = PHRASE); 1: (K = GV); 2: (FS = GOV)&(UL = 'tre');
					3: (K = GA); 4: (FS = GOV)&(VERIF(DICT(*)) = T);
					5: (KPH = PHINF); 6: (K = GV); 7: (FS = GOV)&(SEMA(DICT(*)) = SITUATION)
		=> V,X / V: (FRM = ', ';LEMME=','); X: (FRM=FRM(DICT(4));LEMME=FRM(DICT(4))).

	RACCEPTVB: 1(2(3)) / 1: (K = PHRASE); 2: (K = GV); 3: (FS = GOV)&(VERIF(DICT(*)) = T)
		=> V,Y / V: (FRM = ', ';LEMME=','); Y: (FRM=FRM(DICT(3));LEMME=FRM(*)).

	RELIMINCJCT: 0(1) / 0: (K = PHRASE); 1: (CAT = CONJCT)&(SOUSC = COORD)
		=> 0.

  --> %STOP.

  &GRAM: GRAMWHERE(I).

	RPRODCJCT$HLT(RPRODCJCT): *(0) / 0: (COORDIN = 0) => X(0) / X: (COORDIN = C).

	RCOMPLETEVAL: 0(1,*,2,*,3) / 0: (K = GN); 1: (CAT = ADJOINT); 2: (UL = '-'); 3: (CAT = N)
		=> 0(3) / 3:3(FRM=FRM(1)||FRM(2)||FRM(3)).

	WHRADJDEF: 0(1(2,3(4,5(6(7),8(9))))) / 0: (K = PHRASE); 1: (K = GV); 2: (FS = GOV)&(UL = 'tre');
					3: (K = GA); 4: (FS = GOV)&(VERIF(DICT(*)) = T);
					5: (KPH = PHINF); 6: (K = GV); 7: (FS = GOV)&(SEMA(DICT(*)) = SITUATION);
					8: (K = GNPREP)&(SEMA $>= LIEU); 9: (CAT = N)&(SOUSN=NPRO)
		=> V,X,V2,Y / V: (FRM = 'and ';LEMME='AND');
			X: (FRM=FRM(DICT(4))||'.'||FRM(prefixe_expression)||' = '||FRM(recherche_expression)||'.'||FRM(prefixe_expression)||'\n';
					LEMME=FRM(prefixe_expression));
			V2: (FRM='and ';LEMME='AND');
			Y: (FRM=FRM(DICT(4))||'.lieu = \''||FRM(9)||'\'\n';LEMME='CARACTERISTIQUE').

	WHRACCEPTVB: 1(2(3,4(5))) / 1: (K = PHRASE); 2: (K = GV); 3: (FS = GOV)&(VERIF(DICT(*)) = T); 4: (K = GN);
					5: (FS = GOV)|(CAT = INCONNU)
		=> V,Y,V2,Z / V: (FRM = 'and '); 
				Y: (FRM=FRM(DICT(3))||'.'||FRM(prefixe_expression)||' = '||FRM(recherche_expression)||'.'||FRM(prefixe_expression)||'\n';
						LEMME=FRM(prefixe_expression));
				V2: (FRM = 'and ';LEMME='AND');
				Z: (FRM=FRM(DICT(3))||'.'||FRM(DICT(3,2))||' = \''||FRM(5)||'\'\n';LEMME='CARACTERISTIQUE').

	WHRACCEPTVBCIR: 1(2(3),4(5)) / 1: (K = PHRASE); 2: (K = GV); 3: (FS = GOV)&(VERIF(DICT(*)) = T); 4: (K = GNPREP);
					5: (FS = GOV)|(CAT = INCONNU)
		=> V,Y,V2,Z / V: (FRM = 'and '); 
				Y: (FRM=FRM(DICT(3))||'.'||FRM(prefixe_expression)||' = '||FRM(recherche_expression)||'.'||FRM(prefixe_expression)||'\n';
						LEMME=FRM(prefixe_expression));
				V2: (FRM = 'and ';LEMME='AND');
				Z: (FRM=FRM(DICT(3))||'.'||FRM(DICT(3,2))||' = \''||FRM(5)||'\'\n';LEMME='CARACTERISTIQUE').


	WHRELIMINCJCT: 0(1) / 0: (K = PHRASE); 1: (CAT = CONJCT)&(SOUSC = COORD)
		=> 0.

	RELIMINAND: 0(*,1,*,2) / 1: (FRM = ''); 2: (FRM='and ')
		=> 0.

  --> %STOP.

  &GRAM: GRINTER(I).

	RSELECTMOINS: 1(*,2(3,4(5),6(*,7,8,9))) / 1: (K = PHRASE); 2: (K = GV); 3: (FS = GOV);
					4: (K = GADV); 5: (SOUSA$>= SUPERLATIF);
					6: (K = GN); 7: (CAT = DETERM)&(SOUSD = CARD);
					8: (CAT = N)&(FS = GOV); 9: (KPH = PHREL)
		=> X(P,IN,PO1,SELECTI(PO2,NSELECT(Y(3,6(4(5),7,8))),PF2),INTER,DSELECT(PO3,Z(N3,N6(N8,9)),PF3),PF1) /
			P: (FRM = FRM(recherche_expression)||'.'||FRM(prefixe_expression);LEMME=FRM(prefixe_expression));
			IN: (FRM = ' in\n';LEMME='IN'); INTER: (FRM='\nintersect\n'; LEMME='INTERSECT');
			N3:3; N6:6; N8:8;
			PO1: (FRM='(';LEMME='(');
			PO2: (FRM='(';LEMME='(');
			PO3: (FRM='(';LEMME='(');
			PF1: (FRM=')';LEMME=')');
			PF2: (FRM=')';LEMME=')');
			PF3: (FRM=')';LEMME=')').

	RCOMPTE: 0(1,2(3(4),5(6),7)) / 1: (FS = GOV)&(VERIF(DICT(*))=T); 2: (K = GN); 3: (K = GADV);
					4: (SOUSA=SUPERLATIF); 5: (K = GCARD); 6:(SOUSD = CARD);
					7: (FS = GOV)&(CAT = N)
		=> X(SEL,NPR,FRM,GRP,COUNT) / SEL: (FRM='select '; LEMME='SELECT');
						NPR: (FRM=FRM(prefixe_expression);LEMME=FRM(prefixe_expression));
						FRM: (FRM=' from '||FRM(DICT(1)); LEMME='FROM');
						GRP: (FRM='\ngroup by '||FRM(prefixe_expression)||' having ';LEMME='GROUP');
						COUNT: (FRM='count(*)';<UL(4)= 'le moins': FRM=FRM(*)||' >= '||FRM(DICT(6))>;
							LEMME='COUNT').

	RDEFLG: 0(1,2(3,4?(5))) / 1: (FS = GOV)&(VERIF(DICT(*))=T); 2: (K = GN); 3: (CAT = N); 4: (KPH = PHREL);
					5 : ((CAT = N)|(CAT = INCONNU))&(FS = GOV)
		=> X(SEL,NPR,FRM,WHERE) / SEL: (FRM='select ';LEMME='select');
					NPR : (FRM=FRM(prefixe_expression);LEMME=FRM(prefixe_expression));
					FRM: (FRM = ' from '||FRM(DICT(1));LEMME='FROM');
					WHERE: (FRM='\nwhere '||FRM(DICT(1))|| '.'||FRM(3)||' = \''||FRM(5)||'\'';LEMME='WHERE').

	RSELECTMOINSUNIQ: 1(*,2(3,4(5),6(*,7,8))) / 1: (K = PHRASE); 2: (K = GV); 3: (FS = GOV);
					4: (K = GADV); 5: (SOUSA$>= SUPERLATIF);
					6: (K = GN); 7: (CAT = DETERM)&(SOUSD = CARD);
					8: (CAT = N)&(FS = GOV)
		=> X(P,IN,PO1,SELECTI(NSELECT(Y(3,6(4(5),7,8)))),PF1) /
			P: (FRM = FRM(recherche_expression)||'.'||FRM(prefixe_expression);LEMME=FRM(prefixe_expression));
			IN: (FRM = ' in\n';LEMME='IN');
			PO1: (FRM='(';LEMME='(');
			PF1: (FRM=')';LEMME=')').


  --> %STOP.

  &FIN.
  	

