MAKALAH TEKNIK KOMPILASI “LAPORAN PROGRAM BOTTOM UP PARSER”
NAMA ANGGOTA :
1.
Dian Cahyono
(08109 810960 6004 040) 0)
2.
Tito ito Ardhi dhi P
(08109 810960 6006 066) 6)
3.
Aditya Perma rmana
(08109 810963 6302 028) 8)
4.
Heik Heikal al Mahe Mahend ndra ra R
(081 (08109 0963 6304 046) 6)
5.
Nur Nur Hadi Hadi Sula Sulaim iman an
(081 (08109 0963 6305 058) 8)
PROGRAM STUDI ILMU KOMPUTER JURUSAN MATEMATIKA FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM UNIVERSITAS BRAWIJAYA MALANG 2010
BAB I
PENDAHULUAN Parsing 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 Parsing Bottom Up membangun pohon pohon sintaks melalui melalui urutan simbol simbol yang direduksi, 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 Lebih gene general ral dari dari TopTop-Down Down Parsin Parsing, g, b. Dapat menang menangani ani aturan aturan produks produksii yang mengandung mengandung left-recurs left-recursive, ive, c. Hampir semua kelas bahasa bahasa CFG dapat diselesaika diselesaikan n oleh oleh metoda metoda ini, ini, d. Aturan Aturan produks produksii yang yang ambigu ambigu dapat dapat menyeb menyebabk abkan an konflik konflik pada penuruna penurunan n dengan dengan metoda metoda ini. e. Metoda Metoda ini akan akan meredu mereduksi ksi string string masukka masukkan n menjadi menjadi simbo simboll awal awal dengan dengan menggu menggunak nakan an 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. Accept Accepted, ed, jika string string masukk masukkan an sudah sudah habis dibaca dibaca dan state state mampu mampu mencapa mencapaii state awal, awal, maka dapat disimpulkan string masukkan diterima. diterima. b. Error Error,, jika string string masukka masukkan n sudah habis habis dibaca dibaca tetapi tetapi tidak tidak dapat mencapa mencapaii state state awal, atau state state awal awal mampu mampu dicapa dicapaii tetapi tetapi masih masih ada string string masukk masukkan an yang yang tersis tersisa, a, maka maka dapat 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 ISI A. STRUKTUR DATA Dalam 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 Stri ng yang diinputkan dan string pada token yang ditampilkan pada tabel pengecekan String.
B. ALGORITMA ProsesRule()
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
b.
var first
c.
var next
dapatkan aturan pada indeks X sesuai nilai entry rX
t indeks ke-0 t indeks ke-2
d. Lakukan perulangan jika nilai paling atas variabel stack tmp tidak sama dengan nilai next -
Lakukan pop pada stack tmp.
e. Lakukan pop pada stack tmp f.
Masukan nilai first pada variabel 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
c.
tk
nilai paling atas Stack stack tmp
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 Code Pada 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 tat a 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");
fix
=
line[i].replace("|",
ar.addAll(Arrays.asList(fix)); } return ar; }
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(); }
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){
=
new
String[]
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
item=tb.getElement(Integer.parseInt(tmp.get(tmp.size("stack")-2)),
top); tmp.add(item.toString()); entry
=
tb.getElement(Integer.parseInt(tmp.peek()),
String.valueOf(tk)); if(entry==null) can = false;
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-1 if(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
=
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()); } else{ Object tb.getElement(Integer.parseInt(tmp.get(tmp.size("stack")-2)), top);
item
=
tmp.add(item.toString()); entry
=
tb.getElement(Integer.parseInt(tmp.peek()),
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");
} 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
=
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(); } 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