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