D.3 Frame Form Java
Frame Form Java meliputi kelas Layar_Sampul, Layar_Utama, Layar_Tambah_Produksi dan Layar_Input_Produksi yang diimport menggunakan
‘import javax.swing.JOptionPane’, ‘import javax.swing.DefaultComboBoxModel’ dan ‘import javax.swing.DefaultListModel’ yang berisi kelas-kelas untuk
membuat komponen GUI yang disediakan pada masing-masing form.
E. Implementasi
Program transformasi ke bentuk normal Chomsky ini dalam prosesnya mengalami perubahan tahap demi tahap untuk mencapai bentuk normal Chomsky
yang optimal. Sebagai langkah awal, program melakukan pengecekan untuk penyederhanaan tata bahasa bebas konteks, kemudian pengecekan dengan mencari
produksi yang sudah memenuhi syarat bentuk normal Chomsky. Selanjutnya, program akan melakukan transformasi ke bentuk normal Chomsky.
E.1 Pengecekan Bentuk Produksi Tunggal
Pengecekan dilakukan pada saat user menginputkan tata bahasa bebas konteks yaitu pada ‘Layar_Input_Produksi’. Dalam layar ini disediakan tombol
terminal berupa huruf Yunani ‘a’ sampai ‘e’ , non terminal berupa huruf kapital ‘A’ sampai ‘E’ dan ‘S’, tanda ‘|’, tanda ‘OK’, tanda ‘HAPUS KARAKTER’ dan
tanda ‘BATAL’. Jika user menginputkan simbol non terminal sebanyak 1 pada hasil produksi maka program akan mengnonaktifkan tanda ‘OK’ dan tanda ‘|’.
Sedangkan semua tombol simbol terminal dan non terminal diaktifkan. Setelah user menambahkan simbol terminal atau non terminal maka program akan
mengaktifkan tanda ‘OK’ dan tanda ‘|’. Berikut adalah beberapa penggalan programnya :
private void jButton_AActionPerformedjava.awt.event. ActionEvent evt {
if hrfProduksi { jLabel_S.setTextA;
produksi = A-; hrfProduksi = false;
enable_hrfkeciltrue; return;
} produksi = produksi + A;
jumBesar++; if awal {
jLabel_P.setTextA; awal = false;
} else
jLabel_P.setTextjLabel_P.getText + A; if jumBesar = 2 {
jButton_Garis.setEnabledtrue; jButtonOK.setEnabledtrue;
} jButtonHapusKarakter.setEnabledtrue;
} private void jButton_aActionPerformedjava.awt.event.
ActionEvent evt { produksi = produksi + a;
if awal { jLabel_P.setTexta;
awal =
false; }
else jLabel_P.setTextjLabel_P.getText + a;
jButton_Garis.setEnabledtrue;
jButtonOK.setEnabledtrue; jumKecil++;
jButtonHapusKarakter.setEnabledtrue; }
private void jButtonOKActionPerformedjava.awt.event. ActionEvent evt {
int jumHuruf = 0; int i;
String produk = produksi.substring3, produksi.length; for i=0; i=produk.length-1; i++ {
if produk.charAti = | jumHuruf++;
} if jumHuruf 20 {
JOptionPane.showMessageDialogthis, Ruas kanan Tanda Panah Tidak Boleh Lebih Dari 20 Simbol;
return; }
OK = true; this.dispose;
} private void jButton_GarisActionPerformedjava.awt.event.
ActionEvent evt { produksi = produksi + |;
jLabel_P.setTextjLabel_P.getText + |; jButton_Garis.setEnabledfalse;
jButtonOK.setEnabledfalse; jumBesar = 0;
jumKecil = 0; }
private void jButtonHapusKarakterActionPerformedjava.awt. event.ActionEvent evt {
String hp = jLabel_P.getText; if hp.compareTo = 0 {
if Character.isUpperCaseproduksi.charAtproduksi.
length-1 jumBesar--;
else if Character.isLowerCaseproduksi. charAt produksi.length-1
jumKecil--; else if produksi.charAtproduksi.length-1==| {
set JumHurufBesarJumHurufKecil jika karakter | String produk = produksi.substring0,produksi.
length - 1; int i = produk.length-1;
jumBesar = 0; jumKecil = 0;
while i=0 { if produk.charAti == |
break; if produk.charAti ==
break; if Character.isUpperCaseproduksi.charAti
jumBesar++; else if Character.isLowerCase
produksi.charAti jumKecil++;
i--; }
JOptionPane.showMessageDialogthis, Integer. toStringjumBesar;
JOptionPane.showMessageDialogthis, Integer. toStringjumKecil;
} produksi = produksi.substring0, produksi.length-1;
hp = hp.substring0, hp.length-1; jLabel_P.setTexthp;
if jumBesar = 1 jumKecil=0 { jButtonOK.setEnabledfalse;
jButton_Garis.setEnabledfalse; }
else { jButtonOK.setEnabledtrue;
jButton_Garis.setEnabledtrue; }
} else
jButtonHapusKarakter.setEnabledfalse; }
private void jButtonBatalActionPerformedjava.awt.event. ActionEvent evt {
BATAL = true; this.dispose;
}
E.2 Pengecekan Produksi Yang Tidak Bisa Diturunkan Hingga Terminal
Program akan
mengecek input supaya tidak mengandung produksi yang
tidak bisa diturunkan sampai ke terminal. Dalam hal ini program tidak akan menghilangkan produksi yang tidak digunakan tersebut, tetapi program hanya
melakukan pengecekan. Selanjutnya user harus menginputkan kembali tata bahasa bebas konteks yang benar.
private boolean cekProduksiTidakBisaDiturunkan { String produk;
String nonTerminalKiri = ; String nonTerminalKanan = ;
int i, j; boolean adaHurufBesar;
produksi_bantu = new String[10]; INISISALISASI NONTERMINALKIRI DAN VARIABEL ARRAY PRODUKSI
for i=0; idataProduksi.getSize; i++ { produk = String dataProduksi.geti;
for j=3; jproduk.length; j++ { if Character.isUpperCaseproduk.charAtj {
if nonTerminalKiri.indexOfproduk.charAtj nonTerminalKiri = nonTerminalKiri +
produk.substringj, j+1; }
} produksi_bantu[i] = produk + 0;
} end for i CEK NON TERMINAL YANG ADA HURUF KECIL
for i=0; idataProduksi.getSize; i++ { produk = String dataProduksi.geti;
adaHurufBesar = false; for j=3; jproduk.length; j++ {
if Character.isUpperCaseproduk.charAtj { adaHurufBesar = true;
} if produk.charAtj == | {
if adaHurufBesar == false break;
else adaHurufBesar = false;
} } end for j
if adaHurufBesar == false { nonTerminalKanan = nonTerminalKanan +
produk.substring0, 1; produk.replaceAll0, 1;
produksi_bantu[i] = produk; }
} end for i String nonTerminalKanan2 = ;
String nonTerminalKanan3 = ; for i=0; inonTerminalKanan.length; i++ {
nonTerminalKanan2 = nonTerminalKanan2 + cekNaik nonTerminalKanan.substringi, i+1 ;
} end for i for i=0; inonTerminalKanan2.length; i++ {
if cekPanggilSendirinonTerminalKanan2.substringi,i+1 == false
nonTerminalKanan3 = nonTerminalKanan3 + nonTerminalKanan2.substringi, i+1;
} nonTerminalKanan2 = nonTerminalKanan3;
boolean ada; for i=0; inonTerminalKanan2.length; i++ {
ada = false; for
j=0; jnonTerminalKanan.length;
j++ {
ifnonTerminalKanan.charAtj==nonTerminalKanan2. charAti {
ada = true; break;
} }
if ada == false { nonTerminalKanan = nonTerminalKanan +
nonTerminalKanan2.substringi, i+1; }
} String msg = ;
for i=0; inonTerminalKiri.length; i++ { ada = false;
for j=0; jnonTerminalKanan.length; j++ { ifnonTerminalKiri.charAti== nonTerminalKanan.
charAtj { ada = true;
break; }
} if ada == false {
if msg.indexOfTata Bahasa Bebas Konteks Tidak Sederhana Karena Non Terminal +
nonTerminalKiri.substringi, i+1 + Tidak Bisa Diturunkan Hingga Terminal\n 0
msg = msg + Tata Bahasa Bebas Konteks Tidak Sederhana Karena Non Terminal +
nonTerminalKiri.substringi, i+1 + Tidak Bisa Diturunkan Hingga
Terminal\n;
} } for i=0; inonTerminalKiri.length; i++
if msg.compareTo == 0 return true;
else { msg = msg + \n Apakah anda ingin melanjutkan
Transformasi ke Bentuk Normal Chomsky tanpa menyederhanakan Tata Bahasa Bebas Konteks?;
if JOptionPane.showConfirmDialogthis, msg, Chomsky, JOptionPane.YES_NO_OPTION == 0
return true; else
return false; }
}
E.3 Pengecekan Produksi Yang Tidak Bisa Dicapai dari Simbol Awal
Setelah input tidak mengandung produksi yang tidak bisa diturunkan,
program akan mengecek lagi sampai input tersebut tidak mengandung produksi yang tidak bisa dicapai dari simbol awal. Sama dengan pengecekan sebelumnya
program tidak menghilangkan simbol non terminal yang tidak berguna tersebut, melainkan hanya pengecekan dan user harus memasukkan lagi input yang benar.
private boolean cekNonTerminalTidakBisaDicapai { String produk;
String[] produksi = new String[10]; String nonTerminalKiri = ;
String nonTerminalKanan = ; int i, j;
INISISALISASI NONTERMINALKIRI DAN VARIABEL ARRAY PRODUKSI for i=0; idataProduksi.getSize; i++ {
produk = String dataProduksi.geti; nonTerminalKiri=nonTerminalKiri+produk.substring0,1;
produksi[i] = produk + 0; }
nonTerminalKanan = S; nonTerminalKanan = listNonTerminalKanannonTerminalKanan,
produksi, S; boolean ada;
String msg = ; for i=0; inonTerminalKiri.length; i++ {
ada = false; for j=0; jnonTerminalKanan.length; j++ {
if nonTerminalKiri.charAti== nonTerminalKanan. charAtj {
ada = true; break;
} }
if ada == false { if msg.indexOfTata Bahasa Bebas Konteks Tidak
Sederhana Karena Non Terminal + nonTerminalKiri.substringi, i+1 + Tidak
Bisa Dicapai dari S \n 0 msg = msg + Tata Bahasa Bebas Konteks Tidak
Sederhana Karena Non Terminal + nonTerminalKiri.substringi, i+1 +
Tidak Bisa Dicapai dari S \n; }
} for i=0; inonTerminalKiri.length; i++ if msg.compareTo == 0
return true; else {
msg = msg + \n Apakah anda ingin melanjutkan Transformasi ke Bentuk Normal Chomsky tanpa
menyederhanakan Tata Bahasa Bebas Konteks ?; if JOptionPane.showConfirmDialogthis, msg,
Chomsky, JOptionPane.YES_NO_OPTION == 0 return true;
else return false;
} } end function
E.4 Pengecekan Bentuk Normal Chomsky
Program akan melakukan pengecekan tata bahasa bebas konteks yang sudah dalam bentuk bentuk normal Chomsky, yaitu produksi yang mengandung
tepat satu terminal atau dua non terminal. Berikut penggalan programnya :
String produk, produk2, hrf, z; int i, j, jumHrf;
fori=0; ijumProduksi; i++{ produk = produksi[i];
produksi1[i] = produk.substring0,3; jumHrf = 0;
forj=3; jproduk.length; j++{ hrf = produk.substringj,j+1;
ifproduk.charAtj == | jumHrf = 0;
else jumHrf++;
ifCharacter.isLowerCasehrf.charAt0{ ifj+1produk.length
ifproduk.charAtj+1 = | jumHrf++;
else produksi1[i] = produksi1[i] + hrf;
} else
produksi1[i] = produksi1[i] + hrf; } end for j
} end for i jumProduksi1 = jumProduksi;
Program akan membiarkan produksi yang sudah dalam bentuk normal Chomsky dan mengirimkan produksi tesebut ke output.
E.5 Pengubahan Simbol Terminal Menjadi Non Terminal
Mentransformasikan tata bahasa bebas konteks ke dalam bentuk normal Chomsky perlu dilakukan pengubahan dari simbol-simbol terminal menjadi
simbol non terminal. Pengubahan untuk produksi
A
→ w dengan 1
w . Dalam program ini semua
terminal yang mengalami perubahan menjadi non terminal, simbol non terminalnya menggunakan lambang huruf kapital Z yang diikuti dengan indeks
yang dimulai dari ‘0’.
private String nilaiZString hrf{ int i, j;
String Z, batas, namaHrf; fori=0; ijumMappingZ; i++{
forj=0; jhrf.length; j++{ batas = mappingZ[i].substringj, j+1;
ifhrf.compareTo- == 0 break;
} end for j Z = mappingZ[i].substring0, j+1;
namaHrf = mappingZ[i].substringj+3; ifnamaHrf.compareTohrf == 0{
return Z; } } end for i
namaHrf = Z+Integer.toStringjumMappingZ; mappingZ[jumMappingZ] = namaHrf + - + hrf ;
jumMappingZ ++; return namaHrf;
}
E.6 Pengubahan Simbol Non Terminal Lebih dari 2 Menjadi Tepat 2 Non Terminal
Hasil transformasi pertama menyebabkan produksi berbentuk
A
→ w dengan
2 ≥
w . Oleh karena itu untuk mencapai produksi berbentuk
A
→ w dengan
= 2 non terminal dilakukan pemecah string pada ruas kanan produksi yang panjangnya lebih dari dua non terminal.
w
private String ubahHurufBesarString hrf, int totalHrf{ int i, j, jumHrf, ind1;
String hrfTemp, hrf1; jumHrf = 0;
i = 0; ind1 = 0;
hrf1 = hrf; hrfTemp = hrf;
whileihrf.length{ System.out.printlnHRF1 : +hrf1;
ifhrf1.charAti ==Z{ jumHrf++;
j = i+1; ifjhrf1.length-1{
whileCharacter.isDigithrf1.charAtj j++;
} ifj==hrf1.length
i = j-1; else
i = j-1; }
else jumHrf++;
ifjumHrf == 2{ hrfTemp = nilaiZhrf1.substringind1,i+1 +
hrf1.substringi+1;
System.out.printlnHrfBsr +hrf1.substring ind1,i+1+=+hrfTemp;
totalHrf--; iftotalHrf=2
break; ind1 = 0;
i = 0; jumHrf = 0;
hrf1 = hrfTemp; }
else i++;
} return hrfTemp;
}
BAB IV HASIL DAN PEMBAHASAN