Makalah Tugas 2 SLR Bottom Up Parser Fix

Embed Size (px)

Citation preview

MAKALAH TEKNIK KOMPILASI LAPORAN PROGRAM BOTTOM UP PARSER

NAMA ANGGOTA :

1. 2. 3. 4. 5.

Dian Cahyono Tito Ardhi P Aditya Permana Heikal Mahendra R Nur Hadi Sulaiman

(0810960040) (0810960066) (0810963028) (0810963046) (0810963058)

PROGRAM STUDI ILMU KOMPUTER JURUSAN MATEMATIKA FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM UNIVERSITAS BRAWIJAYA MALANG 2010

BAB I

PENDAHULUANParsing adalah konsturksi atau pembentukan Pohon Sintaks untuk suatu kalimat (ekspresi). Bila terdapat lebih dari satu pohon sintaks untuk sebuah grammar maka dikatakan grammar tersebut Ambiguous. Dua cara melakukan validitas sintaks dengan parsing : - TOP DOWN Parsing : melakukan derivasi string dari NT - BOTTOM UP Parsing : melakukan reduksi simbol ke NT Parsing Bottom Up membangun pohon sintaks melalui urutan simbol yang direduksi, atau dimulai dengan sebuah string hingga mencapai simbol start Grammar. Contoh apabila diketahui identifier x2, dengan parsing bottom up menjadi :

Ciri ciri bottom parsing, antara lain: a. Lebih general dari Top-Down Parsing, b. Dapat menangani aturan produksi yang mengandung left-recursive, c. Hampir semua kelas bahasa CFG dapat diselesaikan oleh metoda ini, d. Aturan produksi yang ambigu dapat menyebabkan konflik pada penurunan dengan metoda ini. e. Metoda ini akan mereduksi string masukkan menjadi simbol awal dengan menggunakan aturan produksi yang ada. Terdapat dua aksi yang dilakukan pada proses parsing, yaitu Shift, membaca string masukkan berikutnya dan Reduce, mengubah menjadi simbol variabel yang dapat menurunkan string tersebut. Hasil akhir dapat berupa : a. Accepted, jika string masukkan sudah habis dibaca dan state mampu mencapai state awal, maka dapat disimpulkan string masukkan diterima. b. Error, jika string masukkan sudah habis dibaca tetapi tidak dapat mencapai state awal, atau state awal mampu dicapai tetapi masih ada string masukkan yang tersisa, maka dapat disimpulkan string masukkan ditolak.

LR Parser

LR parser merupakan bottom-up parser, yang akan membaca input dari kiri ke kanan dan melakukan parsing secara penurunan terkanan (right-most derivation). Kelas grammar yang bisa diturunkan dengan menggunakan LR parser dinamakan LR grammar. LR parser dikatakan LR(k) parser, jika digunakan k token dari look-ahead pada saat proses parsing terjadi. Aturan produksi yang memenuhi bentuk CFG merupakan LR grammar.

BAB II ISIA. STRUKTUR DATADalam tugas ini, program yang kami buat memakai struktur data yaitu : 1. Array Meliputi 2 jenis yaitu array 1 dimensi dan array 2 dimensi. Struktur data array dipakai pada class table. Pada kelas ini, array 1 dimensi digunakan untuk menampung nama atribut pada tabel parser. Sedangkan array 2 dimensi digunakan untuk menampung elemen-elemen dalam tabel parser tersebut. 2. Array List Struktur data ini dipakai pada class grammar dan class rule. Array list pada class grammar digunakan untuk menampung data dari class rule. Dan array list pada class rule digunakan untuk menampung aturan aturan tabel SLR. 3. Stack Struktur data Stack digunakan pada kelas tampung dan kelas proses. Pada kelas tampung stack digunakan untuk menampung karakter dari String yang diinputkan dan string pada token yang ditampilkan pada tabel pengecekan String.

B. ALGORITMAProsesRule() Input : entry Output : t 1. Jika entry mengandung string s a. Masukan hasil pop token kedalam variabel tmp b. Masukan string setelah setelah string s di variabel entry pada variabel tmp c. Cetak t nilai Shift, entry state ke.. 2. Jika entry mengandung String r a. t dapatkan aturan pada indeks X sesuai nilai entry rX b. var first t indeks ke-0 c. var next t indeks ke-2 d. Lakukan perulangan jika nilai paling atas variabel stack tmp tidak sama dengan nilai next f. Lakukan pop pada stack tmp. Masukan nilai first pada variabel tmp e. Lakukan pop pada stack tmp 3. Return t.

cekString() Input : boolean can , object entry Output : object entry dan String action 1. can = true 2. Lakukan perulangan jika can dan tidak accepted a. Cetak nilai stack dan nilai token b. top nilai paling atas Stack stack tmp c. tk nilai paling atas Stack token tmp d. jika nilai top indeks ke 0 sama dengan tipe karakter string 0 1. entry masukan elemen sesuai top dan tk pada tabel 2. jika entry kosong maka can = false 3. jika entry String Acc accepted = true action = String kosong 4. Jika tidak maka Lakukan prosesRule() terhadap entry e. Jika tidak 1. item masukan elemen sesuai ukuran stack dan variabel top pada tabel 2. Masukan nilai variabel item ke variabel stack tmp 3. entry masukan elemen sesuai nilai paling atas variabel tmp dan tk pada tabel 4. jika entry kosong can = false 5. Jika entry berisi acc accepted = true action = String kosong 6. Jika lainya maka action dilakukan prosesRule terhadap entry 7. Cetak entry dan action

C. Analisa Program dan Source CodePada program Bottom Up Parser akan dilakukan proses pengecekan String apakah diterima atau tidak melalui tabel SLR. Program ini terdiri dari beberapa kelas yang saling berhubungan. Kelas Pertama adalah kelas chooser yang juga merupakan tampilan awal program kelas ini berfungsi untuk menampilkan pilihan auto dan manual. Pilihan auto akan menampilkan Tabel SLR yang telah ada dan akan melakukan pengecekan string berdasarkan tabel SLR tersebut.private void auActionPerformed(java.awt.event.ActionEvent evt) { new parser(0).setVisible(true); }

private void manActionPerformed(java.awt.event.ActionEvent evt) { new parser(1).setVisible(true); }

Kelas kedua adalah kelas grammar, kelas ini berfungsi untuk menampilkan tata bahasa yang akan diubah menjadi tabel SLR. Kelas ini diawali dengan inisialisasi variable gr dan def yang bertipe String. Pada variable def diinisialisasi tata bahasa yang sudah ditentukan. Selanjutnya akan di buat konstruktor dengan parameter str yang bertipe String. Konstruktor ini berisi inisialisasi nilai gr dengan yang didefinisi dengan variable Str. Stelah itu dibuat method getInstance() yang bertipe grammar dan memiliki parameter Boolean auto. Method ini berisi perintah apabila yang dipilih adalah auto maka nilai gr diisi dengan Tata Bahasa yang telah ditentukan, dan apabila tidak atau dipilih manual maka tata bahasa diisi dengan String kosong.if(gram==null&&auto) gram = new grammar(); else if(gram==null&&!auto) gram = new grammar(""); return gram;

Method berikutnya adalah setGrammar () dengan parameter string str yang berisi perintah inisialisasi gr yang didefinisikan sebagai var str. Dilanjutkan dengan method getGrammar() yang mengembalikan nilai variable gr. Method toRules() yang berparameter string grm berfungsi untuk memisahkan sisi kanan dari tata bahasa yang sama. Tata bahasa dipisahkan dengan cara mengubah char | dengan variable tata bahasa yang kemudian ditambahkan = dan ditampung dalam variable fix yang bertipe Array string. Yang kemudian variable fix ditampung kembali dalam variable ar. Method uniq() yang berparameter string b digunakan untuk menampung variable pada tata bahasa dalam arrayList a, Variabel yang sama tidak akan dimasukan. Perintah untuk menampung variable tata bahasa yang sama adalah dengan cara melakukan perulangan sepanjang variable b dan dicari karakter pada indeks 0 dan ditampung pada variable x apabila arrayList a belum mengandung nilai x maka nilai x dimasukan.

char x = i.toString().charAt(0); if(!a.contains(x)) a.add(x);import java.util.ArrayList; import java.util.Arrays;

public class grammar {

static grammar gram; private String gr; private final String def = "E=E+T|E-T|T|E*F\nT=T/F|F\nF=(E)|i";

private grammar(){ gr = def; }

public grammar(String str){ gr = str; }

public static grammar getInstance(boolean auto){ if(gram==null&&auto) gram = new grammar(); else if(gram==null&&!auto) gram = new grammar(""); return gram; }

public void setGrammar(String str){ gr = str; }

public String getGrammar(){ return gr; }

public ArrayList toRules(String grm){ ArrayList ar = new ArrayList(); String[] line = grm.split("\n"); for(int i = 0; i < line.length; i++){ String[] "\n"+line[i].charAt(0)+"=").split("\n"); ar.addAll(Arrays.asList(fix)); } return ar; } fix = line[i].replace("|",

public ArrayList uniq(ArrayList b){ ArrayList a = new ArrayList(); for(Object i : b){ char x = i.toString().charAt(0); if(!a.contains(x)) a.add(x); } return a; }

public String toString(ArrayList al){ StringBuilder sb = new StringBuilder(); for(int i = 0; i < al.size(); i++){ sb.append(i+1).append(". ").append(al.get(i)).append("\n"); } return sb.toString(); } }

Kelas ketiga adalah kelas table yang berfungsi membentuk tabel SLR. Pada kelas ini diawali dengan inisialisasi variable awal yaitu element dengan array dua dimensi bertipe Object yang akan menampung isi dari tabel SLR, variable title dengan tipe string array satu dimensi yang berfungsi

untuk menampilkan nama variable pada bagian atas tabel, variable fft bertipe table dan variable def yang bertipe DefaultTableModel. Dalam kelas ini terdapat constructor yang berparameter Boolean auto. Construktor ini berfungsi untuk menampilkan tabel SLR, apabila yang dipilih adalah auto maka tabel akan ditampilkan secara otomatis sesuai tata bahasa yang berlaku. Apabila tidak maka tabel akan berisi kosong. Dalam kelas ini juga terdapat method setElTabel() yang berparameter array dua dimensi a. method ini akan menginisialisasi element dengan nilai a. Method setTitle () yang berparameter array satu dimensi b. method ini akan menginisialisasi title dengan nilai b. Method getArrEl() akan mengembalikan nilai element dan method getTitle() akan mengembalikan nilai title. Method getElement() memiliki parameter integer a dan string b, dalam method ini akan dilakukan proses untuk mengisikan elemen sesuai title dengan elemen berdasarkan variable element [a][key].for(int i = 0; i < title.length; i++){ if(title[i].equals(b)) key = i; } return element[a][key];

Method selanjutnya adalah getTableModel() yang bertipe DefaultTableModel method ini akan membuat objek baru bertipe DefaultTableModel berdasarkan variable element dan title.import javax.swing.table.DefaultTableModel;

public class table { private Object[][] element; private String[] title; private static table fft; private DefaultTableModel def;

public table(boolean auto){ if(auto){ element {{0,"s5",null,null,null,null,"s4",null,null,1,2,3}, = new Object[][]

{1,null,"s6","s7",null,null,null,null,"acc",null,null,null}, {2,null,"r3","r3","s8","s9",null,"r3","r3",null,null,null}, {3,null,"r6","r6","r6","r6",null,"r6","r6",null,null,null}, {4,"s5",null,null,null,null,"s4",null,null,10,2,3}, {5,null,"r8","r8","r8","r8",null,"r8","r8",null,null,null}, {6,"s5",null,null,null,null,"s4",null,null,null,11,3}, {7,"s5",null,null,null,null,"s4",null,null,null,12,3},

{8,"s5",null,null,null,null,"s4",null,null,null,null,13}, {9,"s5",null,null,null,null,"s4",null,null,null,null,14}, {10,null,"s6","s7",null,null,null,"s15",null,null,null,null}, {11,null,"r1","r1","s8","s9",null,"r1","r1",null,null,null}, {12,null,"r2","r2","s8","s9",null,"r1","r2",null,null,null}, {13,null,"s4","s4","s4","s4",null,"s4","s4",null,null,null}, {14,null,"r5","r5","r5","r5",null,"r5","r5",null,null,null}, {15,null,"r7","r7","r7","r7",null,"r7","r7",null,null,null}}; title {"","i","+","-","*","/","(",")","$","E","T","F"}; def = new DefaultTableModel(element, title); } else def = new DefaultTableModel(); } = new String[]

public void setElTabel(Object[][] a){ element = a; }

public void setTitle(String[] b){ title = b; }

public Object[][] getArrEl(){ return element; }

public String[] getTitle(){ return title; }

public void setElement(int a, int b, Object v){

element[a][b] = v; }

public Object getElement(int a, int b){ return element[a][b]; }

public Object getElement(int a, String b){ int key = 0; for(int i = 0; i < title.length; i++){ if(title[i].equals(b)) key = i; } return element[a][key]; }

public DefaultTableModel getTableModel(){ return new DefaultTableModel(element, title); } }

Kelas keempat adalah kelas rule. Kelas ini berfungsi untuk membuat aturan dan rule pada tabel SLR. Method ini diawali dengan inisialisasi variable rules yang bertipe ArrayList dan variable ru yang bertipe kelas rule itu sendiri. Pada method getInstance() diberikan perintah untuk membuat objek rule apabila variable ru bernilai kosong. Method setRule() yang berparameter ArrayList al akan mendefinisikan variable rules sebagai al. Method selanjutnya adalah addRule () yang berparameter Object obj. Method ini akan memasukan nilai variable obj pada rules. Method getRules() yang bertipe ArrayList akan mengembalikan nilai rules. Sedangkan untuk method Contain() yang bertipe Boolean dan berparameter object obj akan mengembalikan nilai rules yang mengandung variable obj.import java.util.ArrayList;

public class rule { private ArrayList rules; static rule ru;

public rule(){ rules = new ArrayList(); }

public static rule getInstance(){ if(ru == null) ru = new rule(); return ru; }

public void setRule(ArrayList al){ rules = al; }

public void addRule(Object obj){ rules.add(obj); }

public ArrayList getRules(){ return rules; }

public boolean contain(Object obj){ return rules.contains(obj); }

public ArrayList uniq(ArrayList b){ ArrayList a = new ArrayList(); for(Object i : b){ char x = i.toString().charAt(0); if(!a.contains(x)) a.add(x); }

return a; }

public String toString(ArrayList al){ StringBuilder sb = new StringBuilder(); for(int i = 0; i < al.size(); i++){ sb.append(i+1).append(". ").append(al.get(i)).append("\n"); } return sb.toString(); } }

Kelas kelima adalah kelas tampung yang berfungsi menampung stack dan input pada tabel SLR. Kelas ini diawali dengan menginisialisasi variable stack yang bertipe Stack dan akan menampung string, serta variable token yang bertipe Stack dan akan menampung character. Pada kelas ini terdapat method add() berparameter String str yang akan memasukan string kedalam var stack serta method add() berparameter char chr yang akan memasukan charakter kedalam var token. Method pop() digunakan untuk mengeluarkan satu elemen stack paling atas. Untuk Method pop2() digunakan untuk mengeluarkan satu elemen token paling atas. Method get() dan get2() dengan parameter int i berfungsi untuk mendapatkan nilai dari variable stack dan token. Method selanjutnya adalah method peek() dan peek2() yang berfungsi untuk melihat nilai paling atas dari variable stack dan token yang bertipe Stack. Method size yang bertipe int dan berparameter String id digunakan untuk menentukan ukuran dan panjang dari variable stack dan token.if(id.equals("stack")) a = stack.size(); else if(id.equals("token")) a = token.size(); return a;

Method yang terakhir dalam kelas ini adalah getStack() dan getToken() yang akan mengembalikan nilai stack dan token.import java.util.Stack;

public class tampung{

private Stack stack; private Stack token;

public tampung(){ stack = new Stack(); token = new Stack(); }

public void add(String str){ stack.add(str); }

public void add(char chr){ token.add(chr); }

public String pop(){ return stack.pop(); }

public char pop2(){ return token.pop(); }

public String peek(){ return stack.peek(); }

public char peek2(){ return token.peek(); }

public String get(int i){ return stack.get(i); }

public char get2(int i){ return token.get(i); }

public int size(String id){ int a = 0; if(id.equals("stack")) a = stack.size(); else if(id.equals("token")) a = token.size(); return a; }

public Stack getStack(){ return stack; }

public Stack getToken(){ return token; } }

Kelas keenam adalah kelas proses. Ini merupakan kelas utama yang akan memproses pengecekan string dan pembuatan tabel pengecekan String. Kelas ini diawali dengan pendeklarasian variable tmp yang bertipe referensi pada kelas tamping, variable r1 yang bertipe referensi kelas rule dan didefinisikan sebagai pemanggilan method getInstance(), variable tb yang bertipe referensi kelas table. Kemudian dideklarasikan variable accepted yang bertipe Boolean dan diinisialisasi false, dan variable result bertipe String. Pada konstruktor proses akan dimasukan string 0 pada variable tmp. Sebagai nilai awal. Pada method StringtoStack() yang berparameter string x akan dimasukan nilai string x kedalam variable tmp dengan jalan melakukan perulangan sesuai panjang x dan kemudian memasukan nilai x yang telah dicharAt atau dipisah berdasarkan karakter. for(int i = x.length()-1; i >= 0; i--) tmp.add(x.charAt(i)); Method berikutnya adalah method cekString() yang akan mengecek string yang ada. Method ini diawali dengan pendeklarasian variable can yang bertipe Boolean dan diinisialisasi sebagai nilai true,

variable entry bertipe objek, action bertipe String, dan int i yang diberi nilai awal satu. Langkah berikutnya adalah melakukan perulangan while apabila can dan tidak diterima maka akan diambil nilai stack pada variable tmp dan nilai token pada variable tmp dan dimasukan pada tabel SLR.sb.append(i).append("\t").append(toString(tmp.getStack())).append("\t\t"). append(toString2(tmp.getToken()));

Perintah berikutnya adalah mendefinisikan variable top dengan melihat nilai paling atas dalam Stack stack pada variable tmp dan didefinisikan pula variable tk sebagai nilai paling atas Stack token pada variable temp.String top = tmp.peek(); char tk = tmp.peek2();

Kemudian dilakukan perintah untuk mengecek jika tipe karakter pada variable top indeks ke 0 sama dengan tipe karakter string 0 maka akan dipanggil method getElement dengan parameter int top dan string tk pada variable tb dan dimasukan kedalam variable entry. Perintah ini digunakan untuk mendapatkan nilai element dari tabel SLR. Lalu jika entry bernilai kosong maka var can diset false dan apabila entry = string acc maka var accepted diisi true dan action diset string kosong. Dan jika lainya maka nilai action akan diset sebagai method prosesRule dengan parameter entry.toString.if(Character.getType(top.charAt(0))==Character.getType('0')){ entry = tb.getElement(Integer.parseInt(top), String.valueOf(tk)); if(entry==null) can = false; else if(entry=="acc") { accepted = true; action = ""; }

else action = prosesRule(entry.toString()); jika tipe karakter pada variable top indeks ke 0 tidak sama dengan tipe karakter string 0 maka didefinisikan variable item bertipe Object sebagai pemanggilan method getElement oleh tb dengan parameter pemanggilan method get() untuk mendapatkan nilai stack pada indeks panjang stack dikurangi dua serta berparameter top. Selanjutnya akan dimasukkan nilai item.tostring kedalam var tmp.Variabel entry didefinisikan sebagai pemanggilan method getElement dengan parameter int tmp.peek dan string tk pada variable tb. Jika variable entry bernilai null maka var can didefinisikan sebagai false. Dan jika entry = string acc maka accepted = true dan action didefinisikan sebagai kosong. Dan jika lainya maka nilai action akan diset sebagai method prosesRule dengan parameter entry.toString.Object top); tmp.add(item.toString()); entry = tb.getElement(Integer.parseInt(tmp.peek()), String.valueOf(tk)); if(entry==null) can = false; item=tb.getElement(Integer.parseInt(tmp.get(tmp.size("stack")-2)),

else if(entry=="acc") { accepted = true; action = ""; } else action = prosesRule(entry.toString()); }

Method Selanjutnya adalah method toString() yang berparameter stack penambung String b. Method ini digunakan untuk mengubah isi stack menjadi string yang kemudian ditambahkan dengan spasi.Method toString2()yang berparameter stack penambung character b. Method ini digunakan untuk mengubah isi Stack Token menjadi string yang kemudian ditambahkan dengan spasi. Method terakhir pada kelas ini adalah prosesRule() yang berparameter String entry. Method ini berfungsi untuk menetukan proses pop dan push pada stack dan input. Jika entry mengandung string s maka tmp akan diisi dengan hasil dari pop token dan hasil dari string entry pada indeks ke-1if(entry.contains("s")) tmp.add(String.valueOf(tmp.pop2())); tmp.add(entry.substring(1));

Apabila nilai entry mengandung string r maka variable t didefinisikan sebagai pemanggilan method getRules() oleh var r1 , dan untuk mendapatkan aturan dari entry dengan menggunakan pemanggilan method get() method r1.getRules(). Variabel first yang bertipe char didefinisikan sebagai variable t indeks ke 0 dan variable next didefinisikan sebagai variable t indeks ke 2. Dilakukan perulangan apabila dilihat isi dari stack tmp tidak sama dengan variable next maka dilakukan proses pop.t = rl.getRules().get(Integer.parseInt(entry.substring(1))-1).toString(); char first = t.charAt(0); char next = t.charAt(2); while(!tmp.peek().equals(String.valueOf(next))){ tmp.pop();

Selanjutnya akan dilakukan proses pop lagi yang diteruskan dengan memasukan variable first kedalam variable stack tmp.tmp.pop(); tmp.add(String.valueOf(first));import java.util.Stack;

public class proses {

tampung tmp;

rule rl = rule.getInstance(); table tb; private boolean accepted = false; private String result;

public proses(boolean auto){ tmp = new tampung(); tb = new table(auto); tmp.add("0"); }

public boolean isAccepted(){ return accepted; }

public String getResult(){ return result; }

void StringtoStack(String x){ for(int i = x.length()-1; i >= 0; i--){ tmp.add(x.charAt(i)); } }

void cekString(){ boolean can = true; StringBuilder sb = new StringBuilder(); Object entry = ""; String action = ""; int i = 1; sb.append("no").append("\t").append("stack").append("\t\t").append("inpu

t") .append("\t\t").append("rule").append("\t").append("action").app end("\n"); while(can&&!accepted){ sb.append(i).append("\t").append(toString(tmp.getStack())).append("\ t\t").append(toString2(tmp.getToken())); String top = tmp.peek(); char tk = tmp.peek2(); if(Character.getType(top.charAt(0))==Character.getType('0')){ entry String.valueOf(tk)); if(entry==null) can = false; else if(entry=="acc") { accepted = true; action = ""; } else action = prosesRule(entry.toString()); } else{ Object tb.getElement(Integer.parseInt(tmp.get(tmp.size("stack")-2)), top); tmp.add(item.toString()); entry String.valueOf(tk)); if(entry==null) can = false; else if(entry=="acc") { accepted = true; action = ""; } else action = prosesRule(entry.toString()); } i++; sb.append("\t\t").append(entry).append("\t").append(action).append(" \n"); = tb.getElement(Integer.parseInt(tmp.peek()), item = = tb.getElement(Integer.parseInt(top),

} result = sb.toString(); }

String toString(Stack b){ StringBuilder c = new StringBuilder(); for(String i : b){ c.append(i).append(" "); } return c.toString(); }

String toString2(Stack b){ StringBuilder c = new StringBuilder(); for(int i = b.size()-1; i >= 0; i--){ c.append(b.get(i)).append(" "); } return c.toString(); }

String prosesRule(String entry){ String t = ""; if(entry.contains("s")) { tmp.add(String.valueOf(tmp.pop2())); tmp.add(entry.substring(1)); t = "Shift, entry state"+entry.substring(1); } else if(entry.contains("r")) { t 1).toString(); char first = t.charAt(0); char next = t.charAt(2); = rl.getRules().get(Integer.parseInt(entry.substring(1))-

while(!tmp.peek().equals(String.valueOf(next))){ tmp.pop(); } tmp.pop(); tmp.add(String.valueOf(first)); } return t; } }

Kelas ketujuh adalah kelas parser, kelas parser ini merupakan kelas inti yang akan memanggil kelas-kelas sebelumnya, dalam kelas ini juga terdapat desain interface dari program Bottom Up parser. Kelas ini diawali dengan pendeklarasian variabel gr yang bertipe referensi kelas grammar, r1 yang bertipe referensi kelas rule, variabel tb dan fftb yang bertipe referensi dari kelas table, variabel ljs yang bertipe ArrayList, manual yang bertipe boolean dan diset true. Variabel tmp yang bertipe referensi terhadap kelas tampung, serta variabel pro yang bertipe referensi terhadap kelas proses. Selanjutnya dilakukan pembuatan construktor parser () yang berparameter int i. Pada construktor ini akan diberikan syarat apabila nilai dari i adalah 0 maka nilai boolean manual diset dengan false selanjutnya dipanggil method reset(). Pada baris selanjutnya diberikan perintah apabila tombol ok ditekan maka dilakukan pembutan objek tampung() yang disimpan dalam variabel tmp. Kemudian jika manual maka variabel grammar berisi kosong dan kemudian dibuat objek rule() baru yang disimpan dalam variabel r1. Variabel r1 akan mengeset nilai rulemelalui pemanggilan toRules yang diisikan parameter getGrammar.rl.setRule(gr.toRules(gr.getGrammar()));

variabel lhs akan melakukan pemanggilan method uniq() yang berparameter pemanggilan getRules() oleh r1. Hal ini dimaksudkan untuk menampung variabel yang ada pada rules, variabel yang sama akan ditampung satu saja. Apabila bukan manual maka akan dipanggil objek proses bukan manual. Berikutnya akan ditambahkan string $ dibelakang string. Dilakukan proses cek string dan pencarian hasil melalui pemanggilan method getResult() oleh variabel pro.pro.StringtoStack(input.getText()+"$"); pro.cekString(); progress.setText(pro.getResult());

Apabila string diterima maka akan ditampilkan pesan Accepted dan apabila tidak maka ditampilkan pesan Not Accepted.private void okActionPerformed(java.awt.event.ActionEvent evt) {

tmp = new tampung(); ok.setEnabled(false); if(manual) { gr = grammar.getInstance(manual); gr.setGrammar(ttb.getText()); rl = new rule(); rl.setRule(gr.toRules(gr.getGrammar())); ruleF.setText(gr.toString(rl.getRules())); lhs = gr.uniq(rl.getRules()); DFA dfa = new DFA(rl.getRules(), lhs); dfa.create();

pro = new proses(manual); //enterFFTTable(); } else { pro = new proses(!manual); } pro.StringtoStack(input.getText()+"$"); pro.cekString(); progress.setText(pro.getResult()); if(pro.isAccepted()) result.setText("Accepted"); else result.setText("Not Accepted"); ok.setEnabled(true); }

final void reset(){ gr = grammar.getInstance(!manual); rl = rule.getInstance(); ttb.setText(gr.getGrammar()); rl.setRule(gr.toRules(gr.getGrammar())); ruleF.setText(gr.toString(rl.getRules()));

tb = new table(!manual); slr.setModel(tb.getTableModel()); lhs = new ArrayList(); lhs.addAll(Arrays.asList("E","F","T")); fft.setVisible(false); ttb.setEditable(false); }

grammar gr; rule rl; table tb, fftb; ArrayList lhs; boolean manual = true; tampung tmp; proses pro;

SCREENSHOT

Gambar 1. Screen Awal

Gambar 2. Tampilan kosong untuk pilihan manual

Gambar 3. Tampilan dengan isi default untuk pilihan auto

Gambar 4. Keluaran dan hasil