Objectif : Effectuer la saisie de mots décrits par une grammaire LL(1) à partir de plans d'action associés à la grammaire (saisie dirigée par la syntaxe).
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 page d'information sur
la solution de cet exercice.
La grammaire G des mots à saisir :
VT = {a, b}
VN = {A, S}
axiome: S
Règles :
1 : S ----> aAS 2 : S ----> b |
|
Règles :
3 : A ----> a 4 : A ----> bSA |
Init(A) = Init(S) = { a , b}
Remonter
Les
plans d'action associés au symbole "A" et à l'axiome "S"
:
Plan associé à A :
Activer(a) ; Activer(b) ; Saisie(SymLu) ; si action = a alors désactiver(a) sinon désactiver(b); Plan S; Plan A fsi désactiver(a) ; désactiver(b) ; |
Plan associé à S :
Activer(a) ; Activer(b) ; Saisie(SymLu) ; si action = a alors désactiver(a) ; Plan A ; Plan S sinon désactiver(b); fsi ; désactiver(a) ; désactiver(b) ; |
La fiche principale du projet :
Implantation
Delphi de chacun des plans :
procedure Plan_A;
begin with Form1 do begin Activer(Button-a); Activer(Button-b); AttenteSaisie; if SymLu='a' then Desactiver(Button_a) else begin Desactiver(Button_b); Plan_S; Plan_A end; Desactiver(Button_a); Desactiver(Button_b) end end; |
procedure Plan_S;
begin with Form1 do begin Activer(Button_a); Activer(Button_b); AttenteSaisie; if SymLu='a' then begin Desactiver(Button_a); Plan_A; Plan_S end else Desactiver(Button_a); Desactiver(Button_b) end end; |
procedure Activer(Elt:TButton);
begin
Elt.enabled:=true;
end;
procedure Desactiver(Elt:TButton);
begin
Elt.enabled:=false;
end;
Le code de la Unit fiche principale :
unit UFPlan1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button_a: TButton;
Button_b: TButton;
Edit_saisie: TEdit;
ButtonLancer: TButton;
procedure ButtonLancerClick(Sender: TObject);
procedure Button_aetbClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Déclarations privées
}
public
{ Déclarations publiques
}
end;
procedure Plan_A;
procedure Plan_S;
var
Form1: TForm1;
implementation
var SymLu:string;
ActionFaite:boolean;
{$R *.DFM}
procedure RAZTout;
begin
with Form1 do
begin
Button_a.enabled:=false;
Button_b.enabled:=false;
SymLu:='';
ActionFaite:=false;
Edit_saisie.text:=''
end
end;
procedure PlanSuivant;
begin
Form1.ButtonLancer.enabled:=true;
end;
procedure Activer(Elt:TButton);
begin
Elt.enabled:=true;
end;
procedure Desactiver(Elt:TButton);
begin
Elt.enabled:=false;
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};
{--------------- Les procédures des plans d'actions ----------------}
procedure Plan_A;
begin
// attente écriture
end;
procedure Plan_S;
begin
// attente écriture
end;
procedure TForm1.ButtonLancerClick(Sender: TObject);
begin
RAZTout;
ButtonLancer.enabled:=false;
Plan_S;
PlanSuivant;
end;
procedure TForm1.Button_aetbClick(Sender: TObject);
begin
ActionFaite:=true;
Symlu:=TButton(Sender).caption
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
RAZTout;
end;