Implementasi PERANCANGAN DAN IMPLEMENTASI

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