Informatik

Qualifikationsphase 2

Erkennende Automaten mit Syntaxanalyse

Für die Programmiersprache Delphi (Lazarus) gibt es Regeln, nach denen Programme formuliert werden müssen. Für drei Beispiele sollen die Syntaxdiagramme wiedergegeben werden. Aus diesen Diagrammen werden dann die erkennenden Automaten entwickelt. Im Anschluss daran finden sich dann die entsprechenden Delphi (Lazarus)-Programme.

Konstantenvereinbarung unter Delphi (Lazarus)

const Kreiskonstante = 3.14; Durchmesser = 34;

Konstantenvereinbarung

dg

Bezeichner

Bezeichner werden für Konstanten, Variablen, Felder, Typen, Eigenschaften, Prozeduren, Funktionen, Programme, Units, Bibliotheken und Packages verwendet. Obwohl ein Bezeichner beliebig lang sein kann, sind nur die ersten 255 Zeichen signifikant. Ein Bezeichner muss mit einem alphabetischen Zeichen oder einem Unterstrich (_) beginnen und darf keine Leerzeichen enthalten. Auf das erste Zeichen können alphanumerische Zeichen, Ziffern und Unterstriche folgen. Reservierte Wörter dürfen nicht als Bezeichner verwendet werden. Im folgenden Beispiel sind nur die Buchstaben a und b zulässig.

gdfg

Wert

gdfg

String

Ein String in Anführungszeichen setzt sich aus einer Folge von maximal 255 Zeichen des erweiterten ASCII-Zeichensatzes zusammen, muss in einer Zeile stehen und in halbe Anführungszeichen eingeschlossen sein. Ein String in Anführungszeichen, der zwischen den halben Anführungszeichen kein Zeichen enthält, ist ein Null-String. Im folgenden Beispiel ist nur 'x' zugelassen.

gdfg

Zahl

Integer-Konstanten lassen sich in dezimaler Notation als Folge von Ziffern ohne Kommas oder Leerzeichen darstellen. Im Beispiel ist nur die Ziffer 1 erlaubt.

gdfg

Automat

gfdg

Quellcode Lazarus:

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
StdCtrls;

type

{ TForm1 }

tZustand = (s0,s1,s2,s3,s4,s5,s6,s7,s8,sf,se);

TForm1 = class(TForm)
BtReset: TButton;
BtEinzel: TButton;
BtDauer: TButton;
EdEingabe: TEdit;
EdAusgabe: TEdit;
Label1: TLabel;
Label2: TLabel;
procedure BtResetClick(Sender: TObject);
procedure BtEinzelClick(Sender: TObject);
procedure BtDauerClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ private declarations }
zustand: tZustand;
pos: integer;
function u(s: tZustand; e: char): tZustand;
public
{ public declarations }
end;

var
Form1: TForm1;

implementation

procedure TForm1.BtResetClick(Sender: TObject);
begin
pos := 0 ;
zustand := s0;
EdAusgabe.Text := '';
end;

procedure TForm1.BtEinzelClick(Sender: TObject);
var eingabe,ausgabe: string;
e: char;
begin
eingabe := EdEingabe.text;
ausgabe := EdAusgabe.text;
if (pos < length(eingabe)) then
begin
pos:=pos+1;
e:=eingabe[pos];
if e in ['c','a','b','=','1','''','x',';'] then
begin
zustand := u(zustand,e);
if zustand = se then ausgabe := 'in Ordnung' else
ausgabe:='Fehler';;
EdAusgabe.Text := ausgabe;
end
end

end;

procedure TForm1.BtDauerClick(Sender: TObject);
var i:integer;
begin
for i:=1 to length(EdEingabe.text) do BtEinzelClick(sender);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
pos:=0;
zustand:=S0;
end;

function TForm1.u(s: tZustand; e: char): tZustand;
begin
case s of
S0: case e of
'c' : result := S1;
'a' : result := Sf;
'b' : result := Sf;
'=' : result := Sf;
'1' : result := Sf;
'''' : result := Sf;
'x' : result := Sf;
';' : result := Sf;
end;

S1: case e of
'c' : result := Sf;
'a' : result := S2;
'b' : result := S2;
'=' : result := Sf;
'1' : result := Sf;
'''' : result := Sf;
'x' : result := Sf;
';' : result := Sf;
end;
S2: case e of
'c' : result := Sf;
'a' : result := S2;
'b' : result := S2;
'=' : result := S3;
'1' : result := Sf;
'''' : result := Sf;
'x' : result := Sf;
';' : result := Sf;
end;
S3: case e of
'c' : result := Sf;
'a' : result := Sf;
'b' : result := Sf;
'=' : result := Sf;
'1' : result := S4;
'''' : result := S5;
'x' : result := Sf;
';' : result := Sf;
end;
S4: case e of
'c' : result := Sf;
'a' : result := Sf;
'b' : result := Sf;
'=' : result := Sf;
'1' : result := S4;
'''' : result := Sf;
'x' : result := Sf;
';' : result := Se;
end;
S5: case e of
'c' : result := Sf;
'a' : result := Sf;
'b' : result := Sf;
'=' : result := Sf;
'1' : result := Sf;
'''' : result := S7;
'x' : result := S6;
';' : result := Sf;
end;
S6: case e of
'c' : result := Sf;
'a' : result := Sf;
'b' : result := Sf;
'=' : result := Sf;
'1' : result := Sf;
'''' : result := S7;
'x' : result := S6;
';' : result := Sf;
end;
S7: case e of
'c' : result := Sf;
'a' : result := Sf;
'b' : result := Sf;
'=' : result := Sf;
'1' : result := Sf;
'''' : result := Sf;
'x' : result := Sf;
';' : result := Se;
end;
SE: case e of
'c' : result := Sf;
'a' : result := S2;
'b' : result := S2;
'=' : result := Sf;
'1' : result := Sf;
'''' : result := Sf;
'x' : result := Sf;
';' : result := Sf;
end
end;
end;

initialization
{$I unit1.lrs}

end.

Variablenvereinbarung unter Delphi (Lazarus)

var eingabe, ausgabe: String; a,b,c: Integer; Treffer: Boolean; pos:Integer = 0;

Variablenvereinbarung

ter

Bezeichner (Im Beispiel ist nur der Buchstabe a zulässig)

bcb

Typ (i:Integer, s:String, b:Boolean)

cbv

Wert (f:false, t:true)

cb

String (Im Beispiel ist nur x als Buchstabe zugelassen)

cb

Zahl (Im Beispiel ist nur die Ziffer 1 erlaubt)

jg

Methodenkopf (procedure) unter Delphi (Lazarus)

procedure Volumen(var inhalt:double; l,b,h:double);

Methodenkopf

gjj

Parameterliste

ncvn

Bezeichner

bcb

Typ

cbv

V.Berg • Bergisch Gladbach • ImpressumHaftungsausschluss