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 }
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 ; |
La fiche principale du projet :
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; |
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;
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;