• Tidak ada hasil yang ditemukan

BAB IV PENUTUP

B. Saran

Dalam program parsing yang penulis buat ini, masih banyak mengalami kekurangan, karena penulis hanya membuat program parsing dengan satu aturan produksi saja. Maka penulis menyarankan kepada para pembaca agar dapat menyempurnakan program parsing ini dengan membuat program parsing yang dapat memasukkan beberapa aturan produksi, tidak hanya satu.

DAFTAR PUSTAKA

H.S., Suryadi dan Sumin, Agus. (1997) Pengantar Algoritma Dan Pemrograman Teknik Diagram Alur Dan Bahasa Basic Dasar. Jakarta: Gunadarma.

Hasbi,M. (2003). Struktur Data dan Algoritma Dalam pemrograman Turbo Pascal. Yogyakarta: Gava Media

Kelly,Dean. (1995). Automata and Formal Languages .Englewood Cliffs,NJ: Plentice-Hall.

Kelly,Dean. (1999). Otomata dan bahasa-Bahasa Formal. Jakarta: Prenhallindo.

Utdirartatmo,Firrar. (2001). Teori Bahasa dan Otomata. Yogyakarta: J&J Learning.

Utdirartatmo,Firrar. (2001). Teknik Kompilasi. Yogyakarta: J&J Learning. Sanjaya, Dwi. (2001). Bertualang dengan Struktur Data di Planet Pascal.

Yogyakarta: J&J Learning

Santoso,P. Insap. (2004). Struktur Data Menggunakan Turbo Pascal 6.0. Yogyakarta: Andi Offset.

LAMPIRAN Listing Program Program Parsing; type TPtrList = ^TList; TPtrNode = ^TNode; TList = record Node : TPtrNode; Next : TPtrList; end; TNode = record Token : string; Child : TPtrList; end; TProductionRule = record Expression : string; Result : string; end; var

{variabel untuk menyimpan data grammar }

intExprCount : Integer;

Expression : array[0..255] of char;

intRuleCount : Integer;

prRules : array[0..255] of ^TProductionRule;

procedure Initialize; {inisialisasi expresi dan aturan produksi yang ada }

var

i : Integer;

begin

intExprCount := 3;

Expression[0] := 'S';{anggap sentence sebagai sebuah}

Expression[1] := 'A';{expresi juga }

Expression[2] := 'B'; intRuleCount := 8; for i := 0 to intRuleCount - 1 do new(prRules[i]); prRules[0]^.Expression := 'S'; prRules[0]^.Result := 'Ba'; prRules[1]^.Expression := 'S'; 65

prRules[1]^.Result := 'Ab'; prRules[2]^.Expression := 'A'; prRules[2]^.Result := 'Sa'; prRules[3]^.Expression := 'A'; prRules[3]^.Result := 'AAb'; prRules[4]^.Expression := 'A'; prRules[4]^.Result := 'a'; prRules[5]^.Expression := 'B'; prRules[5]^.Result := 'Sb'; prRules[6]^.Expression := 'B'; prRules[6]^.Result := 'BBa'; prRules[7]^.Expression := 'B'; prRules[7]^.Result := 'b'; end; procedure CleanUp; {Prosedur untuk menghapus aturan produksi dari memori}

var i : Integer; begin for i := 0 to intRuleCount - 1 do Dispose(prRules[i]); end;

function IsExpression(Token : string) : boolean;

{Fungsi untuk mengecek ekspresi apakah string yang dimasukkan sebuah ekspresi apa bukan} var

i : Integer;

begin

IsExpression := false;

for i := 0 to intExprCount - 1 do

if Token = Expression[i] then begin

IsExpression := true; Break; end; end;

function GetMostLeftExpressionNode(Node:TPtrNode): TPtrNode;

{Fungsi untuk mendapatkan ekspresipling kiri}

var

Temp : TPtrList;

MostLeftNode : TPtrNode;

begin

MostLeftNode := nil;

if IsExpression(Node^.Token) then begin

if (Node^.Child = nil) then begin

MostLeftNode := Node;

end else begin

Temp := Node^.Child;

while (Temp <> nil) do begin

MostLeftNode := GetMostLeftExpressionNode(Temp^.Node);

if MostLeftNode <> nil then

Break; Temp := Temp^.Next; end; end; end; GetMostLeftExpressionNode := MostLeftNode; end;

procedure ExpandTree(var Root : TPtrNode; Child : string);

{Prosedur untuk membuat ekspansi pohon } var ChildTree : TPtrList; Temp : TPtrList; Node : TPtrNode; i : Integer; begin ChildTree := nil;

{gunakan downto biar tree yang terbentuk urut sesuai dengan sentence}

for i := Length(Child) downto 1 do begin

new(Node); Node^.token := Child[i]; Node^.child := nil; new(Temp); Temp^.Node := Node; Temp^.Next := ChildTree; ChildTree := Temp; end; Root^.Child := ChildTree; end;

procedure DeleteChild(var Node : TPtrNode); {Prosedur untuk menghapus anak dari sebuah node yang dikirimkan sebagai parameter}

var

Child,

begin

Child := Node^.Child;

while Child <> nil do begin

Temp := Child;

if Temp^.Node <> nil then begin

if Temp^.Node^.Child <> nil then

DeleteChild(Temp^.Node); Dispose(Temp^.Node); end; Child := Child^.Next; end; Node^.Child := nil; end;

procedure DeleteNode(var Node : TPtrNode);

{Prosedur untuk menghapus node dari simbol}

begin

if Node^.Child <> nil then

DeleteChild(Node);

Dispose(Node);

end;

function GetSentence(Root : TPtrNode) : string;

{Fungsi untukmengecek sentence}

var

Temp : TPtrList;

Buffer : string;

begin

if Root = nil then begin

GetSentence := '';

end else if Root^.Child = nil then begin

GetSentence := Root^.Token;

end else begin

Buffer := '';

Temp := Root^.child;

while (Temp <> nil) do begin

if (Temp^.Node^.Child <> nil) then Buffer := Buffer + GetSentence(Temp^.Node) else Buffer := Buffer + Temp^.Node^.Token;

Temp := Temp^.Next; end; GetSentence := Buffer; end; end;

function DoValidate(Root:TPtrNode;Sentence:string): boolean;

{Fungsi untuk mengecek bahwa string masukkan adalah valid}

var strTemp : string; i : Integer; MostLeftExpr : TPtrNode; blnResult : boolean; begin

{ jika sudah tidak ada expresi lagi test}

blnResult := false;

MostLeftExpr := GetMostLeftExpressionNode(Root);

strTemp := GetSentence(Root);

if MostLeftExpr = nil then begin

if (Sentence = strTemp) then

blnResult := true;

end else begin

for i := 0 to intRuleCount - 1 do begin

if (prRules[i]^.Expression = MostLeftExpr^.Token) then begin

ExpandTree(MostLeftExpr, prRules[i]^.Result);

strTemp := GetSentence(Root);

if (Length(strTemp) > Length(Sentence)) then

DeleteChild(MostLeftExpr)

else

blnResult := DoValidate(Root, Sentence);

end;

if blnResult = true then

break; end; end; DoValidate := blnResult; end;

function Validate(Sentence : string) : boolean; {Fungsi untuk memulai validasi} var Root : TPtrNode; i : Integer; MostLeft : TPtrNode; begin new(Root); Root^.Token := 'S'; Root^.Child := nil;

Validate := DoValidate(Root, Sentence);

DeleteNode(Root); {bebaskan memori yang dipakai oleh pohon penelusuran }

var

strSentence : string;

begin

{ inisialisasi aturan produksi }

Initialize;

write('Masukkan string ?'); readln(strSentence);

if Validate(strSentence) then begin

writeln('String yang dimasukkan Valid ..');

end else begin

writeln('String yang dimasukkan Tidak valid ..');

end;

{ dealokasikan aturan produksi }

CleanUp;

readln;

Output Program

Masukkan string ?bbaaaabb

String yang dimasukkan Valid .. Masukkan string ?ba

String yang dimasukkan Valid .. Masukkan string ?bbaba

String yang dimasukkan Tidak valid .. Masukkan string ?abba

String yang dimasukkan Valid .. Masukkan string ?bbaaba

String yang dimasukkan Valid .. Masukkan string ?abbaa

String yang dimasukkan Tidak valid .. Masukkan string ?abbbaa

String yang dimasukkan Valid .. Masukkan string ?babbabaa

String yang dimasukkan Valid .. Masukkan string ?abab

String yang dimasukkan Valid .. Masukkan string ?aabb

String yang dimasukkan Valid .. Masukkan string ?ab

String yang dimasukkan Valid .. Masukkan string ?bbaaab

String yang dimasukkan Valid .. Masukkan string ?baaabb

String yang dimasukkan Valid .. Masukkan string ?bbaaaaba

String yang dimasukkan Tidak valid ..

Masukkan string ?baaababb

String yang dimasukkan Valid .. Masukkan string ?bbaaaabb

String yang dimasukkan Valid .. Masukkan string ?baaaababb

String yang dimasukkan Tidak valid .. Masukkan string ?baabbb

String yang dimasukkan Tidak valid .. Masukkan string ?baaaaabb

String yang dimasukkan Tidak valid .. Masukkan string ?bbbaaaab

String yang dimasukkan Tidak valid .. Masukkan string ?aabbbbaa

String yang dimasukkan Valid ..

Masukkan string : bbbaaabb

String yang dimasukkan Tidak valid .. Masukkan string : bbaaaaab

String yang dimasukkan Tidak valid .. Masukkan string : bbbbaabb

String yang dimasukkan Tidak valid .. Masukkan string : bbaaabbb

String yang dimasukkan Tidak valid .. Masukkan string : bbbbaabb

Dokumen terkait