Delphi PlanGF2

 (CD-ROMDelphi.PlanAction)



: Les projets Delphi


Objectif : Effectuer la saisie de mots décrits par une grammaire LL(1) à partir de plans d'action associés à une grammaire GF2 du mini-français (saisie dirigée par la syntaxe, exercice identique à plan1).

Rappelons qu'un plan d'action est composé de trois entités : un ensemble d'objet d'une interface, les états de ces objets, et les actions effectuées sur ces objets. Dans le cas où nous effectuons une saisie dirigée par la syntaxe, ce sont les éléments du vocabulaire auxiliaire de la grammaire qui déterminent chacun un plan d'action

La grammaire des mots à saisir.

Les plans d'action associés à chacun des éléments du vocabulaire auxiliaire de la grammaire.

La fiche principale, le code associé dans la unit

Exécuter le programme
 
 

La grammaire G  des mots à saisir :

   VT ={ le, un, chat, chien, aime, poursuit, malicieusement, joyeusement, gentil, noir, blanc, beau }
   VN = { <phrase>, <GN>, <GV>, <Art>, <Nom>, <Adj>, <Adv>, <verbe>, <LeNom>, <Suite> }

   axiome: <phrase>

   Règles :
< phrase > ::= < GN > < GV >. 
< GN > ::= < Art > < LeNom >
< LeNom > ::= < Adj > < Nom > | < Nom > < Adj >
< GV > ::= < verbe > < Suite >
< Suite > ::= < GN >  | < Adv > < GN >
< Art > ::=  le | un
< Nom > ::= chien | chat
< verbe > ::= aime | poursuit
< Adj > ::= blanc | noir | gentil | beau 
< Adv > ::= malicieusement | joyeusement

Cette grammaire est de type LL(1), voici les ensembles Init de chaque symbole du vocabulaire auxiliaire :

               Init( < phrase > ) = { le, un }
               Init( < GN > ) = { le, un }
               Init( < GV > ) = { aime, poursuit }
               Init( < Suite > ) = { le, un malicieusement, joyeusement  }
               Init( < LeNom > ) = { blanc, noir, gentil, beau, chien, chat }
               Init( < Art > ) = { le, un }
               Init( < Nom > ) = {  chien, chat }
               Init( < verbe > ) = { aime, poursuit }
               Init( < Adj > ) = { blanc, noir, gentil, beau }
               Init( < Adv > ) = { malicieusement, joyeusement }
 

                                                                                            Remonter 
 

Les plans d'action associés au symbole <LeNom> et à l'axiome <Phrase> :
 

Plan associé à Phrase
      Activer( Init(Phrase) ) ; 
      Plan GN; 
      Plan GV; 
      Plan point; 
      Désactiver( Init(Phrase) ) 
Plan associé à LeNom
 Activer( Init(LeNom) ) ; 
 Saisie(SymLu) ; 
 Désactiver( Init(LeNom) ) ; 
 si action dans Init(LeNom) alors
        Plan Nom ; 
        Plan Adj 
 sinon
        Plan Adj; 
        Plan Nom 
 fsi

                                                                                            Remonter 

La fiche principale du  projet :

                                                                                            Remonter 
 

Implantation Delphi de chacun des deux plans :
 
procedure Plan_phrase; 
begin
  Plan_GN; 
  Plan_GV; 
  Plan_point; 
end;
procedure Plan_LeNom; 
begin
  InitLeNom(true); 
  AttenteSaisie; 
  InitLeNom(false); 
  ActionFaite:=true; // action déjà saisie
  if (SymLu='chat') or (SymLu='chien') then 
  begin 
    Plan_Nom; 
    Plan_Adj 
  end 
  else  // adjectif
  begin 
    Plan_Adj; 
    Plan_Nom 
  end; 
end

                                                                                                 Remonter 

procedure ActiverDesactiver(Elt:TButton;const etat:boolean);
begin
    Elt.enabled:=etat;
end;

procedure InitLeNom (active:boolean);
begin
   ActiverDesactiver(Form1.Buttonblanc,active);
   ActiverDesactiver(Form1.Buttonnoir,active);
   ActiverDesactiver(Form1.Buttonbeau,active);
   ActiverDesactiver(Form1.Buttongentil,active);
   ActiverDesactiver(Form1.Buttonchat,active);
   ActiverDesactiver(Form1.Buttonchien,active)
end;

procedure InitPhrase (active:boolean);
begin
   ActiverDesactiver(Form1.ButtonLe,active);
   ActiverDesactiver(Form1.ButtonUn,active)
end;

                                                                                           Remonter 

Le code de la Unit fiche principale :

unit UFplanGF2;

 interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

 type
  TForm1 = class(TForm)
    ButtonLe: TButton;
    ButtonUn: TButton;
    Buttonblanc: TButton;
    Buttonnoir: TButton;
    Buttonbeau: TButton;
    Buttongentil: TButton;
    Buttonaime: TButton;
    Buttonpoursuit: TButton;
    Buttonchat: TButton;
    Buttonmalicieus: TButton;
    Buttonjoyeus: TButton;
    ButtonLancer: TButton;
    Edit_saisie: TEdit;
    Buttonchien: TButton;
    Buttonpoint: TButton;
    procedure ButtonLancerClick(Sender: TObject);
    procedure ButtonsClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

 var
  Form1: TForm1;

implementation

var SymLu:string;
    ActionFaite:boolean;

 {$R *.DFM}

 procedure ActiverDesactiver(Elt:TButton;const etat:boolean);
begin
  Elt.enabled:=etat;
end;

 ////////////////////  LES INIT ///////////////////////////
procedure InitGN (active:boolean);
begin
   ActiverDesactiver(Form1.ButtonLe,active);
   ActiverDesactiver(Form1.ButtonUn,active)
end;

 procedure InitLeNom(active:boolean);
begin
   ActiverDesactiver(Form1.Buttonblanc,active);
   ActiverDesactiver(Form1.Buttonnoir,active);
   ActiverDesactiver(Form1.Buttonbeau,active);
   ActiverDesactiver(Form1.Buttongentil,active);
   ActiverDesactiver(Form1.Buttonchat,active);
   ActiverDesactiver(Form1.Buttonchien,active)
end;

 procedure InitGV(active:boolean);
begin
   ActiverDesactiver(Form1.Buttonaime,active);
   ActiverDesactiver(Form1.Buttonpoursuit,active)
end;

 procedure InitSuite(active:boolean);
begin
   ActiverDesactiver(Form1.ButtonLe,active);
   ActiverDesactiver(Form1.ButtonUn,active);
   ActiverDesactiver(Form1.Buttonjoyeus,active);
   ActiverDesactiver(Form1.Buttonmalicieus,active)
end;

 procedure InitArt(active:boolean);
begin
 InitGN(active)
end;

 procedure InitNom(active:boolean);
begin
  ActiverDesactiver(Form1.Buttonchat,active);
  ActiverDesactiver(Form1.Buttonchien,active)
end;

 procedure InitVerbe(active:boolean);
begin
   ActiverDesactiver(Form1.Buttonaime,active);
   ActiverDesactiver(Form1.Buttonpoursuit,active)
end;

 procedure InitAdj(active:boolean);
begin
   ActiverDesactiver(Form1.Buttonblanc,active);
   ActiverDesactiver(Form1.Buttonnoir,active);
   ActiverDesactiver(Form1.Buttonbeau,active);
   ActiverDesactiver(Form1.Buttongentil,active)
end;

 procedure InitAdv(active:boolean);
begin
   ActiverDesactiver(Form1.Buttonjoyeus,active);
   ActiverDesactiver(Form1.Buttonmalicieus,active)
end;
//////////////////// fin des INIT ////////////////////////
procedure RAZTout;
begin
 with Form1 do
 begin
  InitArt(false);
  InitNom(false);
  InitVerbe(false);
  InitAdj(false);
  InitAdv(false);
  Buttonpoint.Enabled:=false;
  SymLu:='';
  ActionFaite:=false;
  Edit_saisie.text:=''
 end
end;

 procedure AttenteSaisie;
  procedure Attendre;
  begin
    if not ActionFaite then
    begin
     repeat
       Application.ProcessMessages
     until  ActionFaite ;
     ActionFaite:=false
    end
  end{ Attendre};

   procedure saisie(ch:string);
  begin
   if ActionFaite=false then
    Form1.Edit_saisie.text:= Form1.Edit_saisie.text+' '+ch
   else ActionFaite:=false
  end{saisie};
begin
  Attendre;
  saisie(SymLu);
end{AttenteSaisie};

 procedure PlanSuivant;
begin
   Form1.ButtonLancer.enabled:=true;
end;

 {--------------- Les procédures des plans d'actions ----------------}
procedure Plan_Art;
begin
  InitArt(true);
  AttenteSaisie;
  InitArt(false);
end;

 procedure Plan_Nom;
begin
  InitNom(true);
  AttenteSaisie;
  InitNom(false);
end;

 procedure Plan_Verbe;
begin
  InitVerbe(true);
  AttenteSaisie;
  InitVerbe(false);
end;

 procedure Plan_Adj;
begin
  InitAdj(true);
  AttenteSaisie;
  InitAdj(false);
end;

 procedure Plan_Adv;
begin
  InitAdv(true);
  AttenteSaisie;
  InitAdv(false);
end;

 procedure Plan_LeNom;
begin
  InitLeNom(true);
  AttenteSaisie;
  InitLeNom(false);
  ActionFaite:=true; // action déjà saisie
  if (SymLu='chat') or (SymLu='chien') then
  begin
    Plan_Nom;
    Plan_Adj
  end
  else  // adjectif
  begin
    Plan_Adj;
    Plan_Nom
  end;
end;

 procedure Plan_GN;
begin
  Plan_Art;
  Plan_LeNom;
end;

 procedure Plan_Suite;
begin
  InitSuite(true);
  AttenteSaisie;
  InitSuite(false);
  ActionFaite:=true; // action déjà saisie
  if (SymLu='le') or (SymLu='un') then
  begin
    Plan_GN;
  end
  else  // adverbe
  begin
    Plan_Adv;
    Plan_GN
  end;
end;

 procedure Plan_GV;
begin
  Plan_Verbe;
  Plan_Suite;
end;

 procedure Plan_point;
begin
  Form1.Buttonpoint.Enabled:=true;
  AttenteSaisie;
  Form1.Buttonpoint.Enabled:=false;
end;

 procedure Plan_phrase;
begin
  Plan_GN;
  Plan_GV;
  Plan_point;
end;

 procedure TForm1.ButtonLancerClick(Sender: TObject);
begin
  RAZTout;
  ButtonLancer.enabled:=false;
  Plan_phrase;
  PlanSuivant;
end;

 procedure TForm1.ButtonsClick(Sender: TObject);
begin
 ActionFaite:=true;
 Symlu:=TButton(Sender).caption
end;

 procedure TForm1.FormCreate(Sender: TObject);
begin
 RAZTout;
end;

 end.                                                                     Remonter 



EXECUTION DU PROGRAMME :