Rabu, 21 April 2010

PENGANTAR KECERDASAN BUATAN

(ARTIFICIAL INTELLIGENCE)

1.1 DEFINISI KECERDASAN BUATAN

Artificial Intelligence merupakan salah satu bagian ilmu komputer yang membuat agar mesin/komputer dapat melakukan pekerjaan seperti laykanya dan sebaik yang dilakukan oleh manusia. Teknologi Komputer diharapkan dapat diberdayakan untuk mengerjakan segala sesuatu seperti yang dapat dikerjakan olehmanusia. Manusia memiliki pengetahuan dan pengalaman dalam menyelesaikan masalah yang dihadapinya. Semakin banyak pengalaman dan pengetahuan manusia semakin cepat pula masalah itu dapat diselesaikan. Demikian juga tekonologi komputer akan dapat menyelesaikan masalah jika memiliki pengetahuan dan pengalaman seperti yang dimiliki oleh manusia. Artificial Intelligence merupakan salah satu solusi untuk menyelesaikan permasalahan teknologi informasi yang sekarang ini berkembang.
Definisi Kecerdasan Buatan Menurut Para Ahli

• H. A. Simon [1987] :
“ Kecerdasan buatan (artificial intelligence) merupakan kawasan penelitian, aplikasi dan instruksi yang terkait dengan pemrograman komputer untuk melakukan sesuatu hal yang -dalam pandangan manusia adalah- cerdas”

• Rich and Knight [1991] :
“Kecerdasan Buatan (AI) merupakan sebuah studi tentang bagaimana membuat komputer melakukan hal-hal yang pada saat ini dapat dilakukan lebih baik oleh manusia.”

• Encyclopedia Britannica:
“Kecerdasan Buatan (AI) merupakan cabang dari ilmu komputer yang dalam merepresentasi pengetahuan lebih banyak menggunakan bentuk simbol-simbol daripada bilangan, dan memproses informasi berdasarkan metode heuristic atau dengan berdasarkan sejumlah aturan”

Tujuan dari kecerdasan buatan menurut Winston dan Prendergast [1984] :

1. Membuat mesin menjadi lebih pintar (tujuan utama)
2. Memahami apa itu kecerdasan (tujuan ilmiah)
3. Membuat mesin lebih bermanfaat (tujuan entrepreneurial)

Dua bagian yang penting pada A.I untuk dapat belajar sperti layaknya manusia, yaitu :

• Knowledge base (Basis pengetahuan)
Basis pengetahuan yang berisi data; fakta-fakta, teori atau aturan-aturan yang diberikan dalam bentuk data (perangkat lunak) knowledge ini yang akan tersimpan terus, semakin banyak knowledge yang dimiliki semakin pintar komputer berpikir.
• Inference engine (Mesin inferensi)
Mesin inferensi adaah yang merangkai basis data untuk menjadi suatu esimpulan, mesin inferensi ini yang akan mengambil basis pengetahuan yang digunakan untuk menyelesaikan masalah yang diberikan kepada komputer, data yang diambil dari basis pengetahuan ambil berdasarkan masalah yang dihadapi dan berbeda untuk setiap masalah yang dihadapinya, jika tidak menemukan data yang diinginkan komputer akan menyimpan masalah kedalam data.

AI dapat dipandang dalam berbagai perspektif.

• Dari perspektif Kecerdasan (Intelligence)
AI adalah bagaimana membuat mesin yang “cerdas” dan dapat melakukan hal-hal yang sebelumnya dapat dilakukan oleh manusia

• Dari perspektif bisnis
AI adalah sekelompok alat bantu (tools) yang berdaya guna, dan metodologi yang menggunakan tool-tool tersebut guna menyelesaikan masalah-masalah bisnis.

• Dari perspektif pemrograman (Programming)
AI termasuk didalamnya adalah studi tentang pemrograman simbolik, pemecahan masalah, proses pencarian (search)

o Umumnya program AI lebih fokus pada simbol-simbol daripada pemrosesan numerik (huruf, kata, angka untuk merepresentasikan obyek, proses dan hubungannya).
o Pemecahan masalah -> pencapaian tujuan
o Search -> jarang mengarah langsung ke solusi. Proses search menggunakan beberapa teknik.
o Bahasa pemrograman AI :

§ LISP, dikembangkan awal tahun 1950-an, bahasa pemrograman pertama yang diasosiasikan dengan AI.
§ PROLOG, dikembangkan pada tahun 1970-an.
§ Bahasa pemrograman berorientasi obyek (Object Oriented Programming (Objective C, C++, Smalltalk, Java)

• Dari perspektif penelitian (research)

o Riset tentang AI dimulai pada awal tahun 1960-an, percobaan pertama adalah membuat program permainan (game) catur, membuktikan teori, dan general problem solving (untuk tugas-tugas sederhana)
o “Artificial intelligence” adalah nama pada akar dari studi area.


1.2 DOMAIN PENELITIAN DALAM KECERDASAN BUATAN

• Formal tasks (matematika, games)
• Mundane task (perception, robotics, natural language, common sense, reasoning)
• Expert tasks (financial analysis, medical diagnostics, engineering, scientific analysis, dll)

PERMAINAN (Game)

• Kebanyakan permainan dilakukan dengan menggunakan sekumpulan aturan.
• Dalam permainan digunakan apa yang disebut dengan pencarian ruang.
• Teknik untuk menentukan alternatif dalam menyimak problema ruang merupakan sesuatu yang rumit.
• Teknik tersebut disebut dengan HEURISTIC.
• Permainan merupakan bidang yang menarik dalam studi heuristic

NATURAL LANGUAGE

Suatu teknologi yang memberikan kemampuan kepada komputer untuk memahami bahasa manusia sehingga pengguna komputer dapat berkomunikasi dengan komputer dengan menggunakan bahasa sehari -hari.

ROBOTIK DAN SISTEM SENSOR

Sistem sensor, seperti sistem vision, sistem tactile, dan sistem pemrosesan sinyal jika dikombinasikan dengan AI, dapat dikategorikan kedalam suatu sistem yang luas yang disebut sistem robotik.

EXPERT SYSTEM

Sistem pakar (Expert System) adalah program penasehat berbasis komputer yang mencoba meniru proses berpikir dan pengetahuan dari seorang pakar dalam menyelesaikan masalah-masalah spesifik.

1.3 KONSEP DAN DEFINISI DALAM KECERDASAN BUATAN

TURING TEST – Metode Pengujian Kecerdasan

• Turing Test merupakan sebuah metode pengujian kecerdasan yang dibuat oleh Alan Turing.
• Proses uji ini melibatkan seorang penanya (manusia) dan dua obyek yang ditanyai. yang satu adalah seorang manusia dan satunya adalah sebuah mesin yang akan diuji.
• Penanya tidak bisa melihat langsung kepada obyek yg ditanyai
• Penanya diminta untuk membedakan mana jawaban komputer dan mana jawaban manusia berdasarkan jawaban kedua obyek tersebut.
• Jika penanya tidak dapat membedakan mana jawaban mesin dan mana jawaban manusia maka Turing berpendapat bahwa mesin yang diuji tersebut dapat diasumsikan CERDAS.

PEMROSESAN SIMBOLIK

• Komputer semula didisain untuk memproses bilangan/angka-angka (pemrosesan numerik).
• Sementara manusia dalam berpikir dan menyelesaikan masalah lebih bersifat simbolik, tidak didasarkan kepada sejumlah rumus atau melakukan komputasi matematis.
• Sifat penting dari AI adalah bahwa AI merupakan bagian dari ilmu komputer yang melukan proses secara simbolik dan non-algoritmik dalam penyelesaian masalah

HEURISTIC

• Istilah Heuristic diambil dari bahasa Yunani yang berarti menemukan
• Heuristic merupakan suatu strategi untuk melakukan proses pencarian (search) ruang problema secara selektif, yang memandu proses pencarian yang kita lakukan disepanjang jalur yang memiliki kemung kinan sukses paling besar.

PENARIKAN KESIMPULAN (INFERENCING)

• AI mecoba membuat mesin memiliki kemampuan berpikir atau mempertimbangkan (reasoning)
• Kemampuan berpikir (reasoning) termasuk didalamnya proses penarikan kesimpulan (inferencing) berdasarkan fakta-fakta dan aturan dengan menggunakan metode heuristik atau metode pencarian lainnya.

PENCOCOKAN POLA (PATTERN MATCHING)

• AI bekerja dengan metode pencocokan pola (pattern matching) yang berusaha untuk menjelaskan obyek, kejadian (events) atau proses, dalam hubungan logik atau komputasional.

1.4 Perbandingan Kecerdasan Buatan dengan Kecerdasan Alamiah

Keuntungan Kecerdasan Buatan dibanding kecerdasan alamiah:

• lebih permanen
• memberikan kemudahan dalam duplikasi dan penyebaran
• relatif lebih murah dari kecerdasan alamiah
• Konsisten dan teliti
• Dapat didokumentasi
• Dapat mengerjakan beberapa task dengan lebih cepat dan lebih baik dibanding manusia

Keuntungan Kecerdasan Alamiah dibanding kecerdasan buatan

• Bersifat lebih kreatif
• Dapat melakukan proses pembelajaran secara langsung, sementara AI harus mendapatkan masukan berupa simbol dan representasi-representasi
• Fokus yang luas sebagai referensi untuk pengambilan keputusan sebaliknya AI menggunakan fokus yang sempit

Komputer dapat digunakan untuk mengumpulkan informasi tentang obyek, kegiatan (events), proses dan dapat memproses sejumlah besar informasi dengan lebih efisien dari yang dapat dikerjakan manusia, tetapi disisi lain manusia –dengan menggunakan insting- dapat melakukan hal yang sulit untuk diprogram pada komputer, yaitu: manusia dapat mengenali (recognize) hubungan antara hal-hal tersebut, menilai kualitas dan menemukan pola yang menjelaskan hubungan tersebut.

1.5 Perbedaan Komputasi AI dengan Proses Komputasi Konvensional


Prolog

BAHASA PEMROGRAMAN PROLOG

1.1 Sejarah Prolog
- Prolog singkatan dari Programming in Logic.
- Dikembangkan oleh Alain Colmenraurer dan P.Roussel di Universitas Marseilles Perancis, tahun1972.
- Prolog populer di Eropa untuk aplikasi artificial intelligence, sedangkan di Amerika peneliti mengembangkan aplikasi yang sama, yaitu LISP.

1.2 Perbedaan Prolog dengan Bahasa Lainnya
- Bahasa Pemrograman yang Umum (Basic, Pascal, C, Fortran):
o diperlukan algoritma/prosedur untuk memecahkan masalah (procedural languange)
o program menjalankan prosedur yang sama berulang-ulang dengan data masukan yang berbeda-beda.
o Prosedur dan pengendalian program ditentukan oleh programmer dan perhitungan dilakukan sesuai dengan prosedur yang telah dibuat.

- Bahasa Pemrograman Prolog :
o Object oriented languange atau declarative languange.
o Tidak terdapat prosedur, tetapi hanya kumpulan data-data objek (fakta) yang akan diolah, dan relasi antar objek tersebut membentuk aturan yang diperlukan untuk mencari suatu jawaban
o Programmer menentukan tujuan (goal), dan komputer menentukan bagaimana cara mencapai tujuan tersebut serta mencari jawabannya.
o Dilakukan pembuktian terhadap cocok-tidaknya tujuan dengan data-data yang telah ada dan relasinya.
o Prolog ideal untuk memecahkan masalah yang tidak terstruktur, dan prosedur pemecahannya tidak diketahui, khususnya untuk memecahkan masalah non numerik.
o Prolog bekerja seperti pikiran manusia, proses pemecahan masalah bergerak di dalam ruang masalah menuju suatu tujuan (jawaban tertentu).
o Contoh : Pembuatan program catur dengan Prolog

1.3 Aplikasi Prolog :
- Sistem Pakar (Expert System)
Program menggunakan teknik pengambilan kesimpulan dari data-data yang didapat, layaknya seorang ahli.
Contoh dalam mendiagnosa penyakit
- Pengolahan Bahasa Alami (Natural Languange Processing)
Program dibuat agar pemakai dapat berkomunikasi dengan komputer dalam bahasa manusia sehari-hari, layaknya penterjemah.
- Robotik
Prolog digunakan untuk mengolah data masukanyang berasal dari sensor dan mengambil keputusan untuk menentukan gerakan yang harus dilakukan.
- Pengenalan Pola (Pattern Recognition)
Banyak digunakan dalam image processing, dimana komputer dapat membedakan suatu objek dengan objek yang lain.
- Belajar (Learning)
Program belajar dari kesalahan yang pernah dilakukan, dari pengamataqn atau dari hal-hal yang pernah diminta untuk dilakukan.

1.4 Fakta dan Relasi
- Prolog terdiri dari kumpulan data-data objek yang merupakan suatu fakta.
- Fakta dibedakan 2 macam :
o Menunjukkan relasi.
o Menunjukkan milik/sifat.
- Penulisannya diakhiri dengan tanda titik “.”
- Contoh :


1.5 Aturan (“Rules”)
- Aturan adalah suatu pernyataan yang menunjukkan bagaimana fakta-fakta berinteraksi satu dengan yang lain untuk membentuk suatu kesimpulan.
- Sebuah aturan dinyakatakan sebagai suatu kalimat bersyarat.
- Kata “if” adalah kata yang dikenal Prolog untuk menyatakan kalimat bersyarat atau disimbolkan dengan “:-“.
- Contoh :


- Setiap aturan terdiri dari kesimpulan(kepala) dan tubuh.
- Tubuh dapat terdiri dari 1 atau lebih pernyataan atau aturan yang lain, disebut subgoal dan dihubungkan dengan logika “and”.
- Aturan memiliki sifat then/if conditional
“Kepala(head) benar jika tubuh (body) benar”.
- Contoh : Silsilah keluarga :



1.6 Pertanyaan (“Query”)
-
Setelah memberikan data-data berupa fakta dan aturan, selanjutnya kita dapat mengajukan pertanyaan berdasarkan fakta dan aturan yang ada.
- Penulisannya diawali simbol “?-“ dan diakhiri tanda “.”.
1.7 Predikat (“Predicate”)
- Predikat adalah nama simbolik untuk relasi.
- Contoh : ayah(slamet,amin).
Predikat dari fakta tersebut ditulis : ayah(simbol,simbol).
dimana ayah adalah nama predikat, sedangkan slamet dan amin adalah menujukkan argumen.
Sebuah predikat dapat tidak memiliki atau memiliki argumen dengan jumlah bebas. Jumlah argumen suatu predikat disebut aritas (arity).
ayah(nama) …… aritas-nya 1
ayah(nama1,nama2) ….. aritasnya 2
- Syarat-syarat penulisan nama predikat :
o Harus diawali dengan huruf kecil dan dapat diikuti dengan huruf, bilangan atau garis bawah.
o Panjang nama predikat maksimum 250 karakter.
o Tidak diperbolehkan menggunakan spasi, tanda minus, tanda bintang dan garis miring.
1.8 Variabel
- Varibel adalah besaran yang nilainya dapat berubah-ubah.
- Tata cara penulisan variabel :
1. Nama varibel harus diawali huruf besar atau garis bawah(_)
2. Nama variabel dapat terdiri dari huruf, bilangan, atau simbol dan merupakan kesatuan dengan panjang maksimum 250 karakter.
3. Nama variabel hendaknya mengandung makna yang berkaitan dengan data yang dinyatakannya.
- Contoh : dari silsilah di atas :
?- ayah(slamet,Anak).
Anak=budi ;
Anak=badu
No
Dari query di atas akan dicari siapakah anak dari ayah yang bernama Slamet. Karena mempunyai relasi yang sama (yaitu ayah), variabel Anak akan mencari nilai dari konstanta suatu fakta/aturan yang sepadan.
Tanda “;” digunakan bila terdapat kemungkinan ada lebih dari satu jawaban.
“No” berarti tidak ada lagi kemungkinan jawaban.
Contoh : dari silsilah di atas :
?- ayah(slamet,X),ayah(X,Y).
X=amin
Y=budi ;
X=amin
Y=badu ;
X=anang
Y=didi ;
X=anang
Y=didi
No
Contoh : Silsilah Keluarga
%% FAKTA */
%%orang tua */
ayah(slamet,amin).
ayah(slamet,anang).
ayah(amin,budi).
ayah(amin,badu).
ayah(anang,didi).
ayah(anang,dadi).
ayah(santoso,bu_amin).
ayah(supardi,bu_anang).
ibu(bu_slamet,amin).
ibu(bu_slamet,anang).
ibu(bu_amin,budi).
ibu(bu_amin,badu).
ibu(bu_anang,didi).
ibu(bu_anang,dadi).
ibu(bu_santoso,bu_amin).
ibu(bu_santoso,bu_anang).
%% ATURAN */
%% Kakek adalah kakek Cucu */
kakek(Kakek,Cucu) :-
ayah(Ayah,Cucu),
ayah(Kakek,Ayah).
kakek(Kakek,Cucu) :-
ibu(Ibu,Cucu),
ayah(Kakek,Ibu).
%% Nenek adalah nenek Cucu */
nenek(Nenek,Cucu) :-
ayah(Ayah,Cucu),
ibu(Nenek,Ayah).
nenek(Nenek,Cucu) :-
ibu(Ibu,Cucu),
ibu(Nenek,Ibu).
%% Nama1 adalah saudara kandung Nama2
saudara_kandung(Nama,Name) :-
ayah(Ayah,Nama),
ayah(Ayah,Name),
ibu(Ibu,Nama),
ibu(Ibu,Name),
Nama \= Name.
%% Sdr1 adalah saudara sepupu Sdr2
saudara_sepupu(Sdr1,Sdr2) :-
ayah(Ayah1,Sdr1),
ayah(Ayah2,Sdr2),
saudara_kandung(Ayah1,Ayah2).
saudara_sepupu(Sdr1,Sdr2) :-
ayah(Ayah,Sdr1),
ibu(Ibu,Sdr2),
saudara_kandung(Ayah,Ibu).
saudara_sepupu(Sdr1,Sdr2) :-
ibu(Ibu,Sdr1),
ayah(Ayah,Sdr2),
saudara_kandung(Ibu,Ayah).
saudara_sepupu(Sdr1,Sdr2) :-
ibu(Ibu1,Sdr1),
ibu(Ibu2,Sdr2),
saudara_kandung(Ibu1,Ibu2).

Jumat, 02 April 2010

Algortima Pelatihan Perseptron

Model JST perseptron ditemukan oleh Rosenblatt (1962) dan Minsky – Papert (1969). Model ini merupakan model yang memiliki aplikasi dan pelatihan yang lebih baik pada era tersebut.

Arsitektur Jaringan
Arsitektur jaringan perseptron mirip dengan arsitektur jaringan Hebbian


Jaringan terdiri dari beberapa unit masukan dan sebuah bias, dan memiliki sebuah unit keluaran. Hanya saja fungsi aktivasinya bukan merupakan fungsi biner atau bipolar, tetapi memiliki kemungkinan nilai -1, 0 dan 1:
Untuk suatu harga threshold θ yang ditentukan :


Secara geometris, fungsi aktivasi membentuk 2 garis sekaligus (memisahkan daerah positif dan daerah negatif.
Garis pemisah antara daerah positif dan daerah nol memiliki pertidaksamaan :
x1w1 + .....+ xnwn + b > θ
Garis pemisah antara daerah negatif dan daerah nol memiliki pertidaksamaan :
x1w1 + .....+ xnwn + b < - θ Algortima Pelatihan Perseptron Misalkan : s vektor masukan dan t adalah target keluaran α adalah laju pembelajaran/pemahaman (learning rate) yang ditentukan θ adalah threshold yang ditentukan Algoritma sbb: 0. Inisialisasi semua bobot dan bias (umumnya wi = b =0 ) Set laju pembelajaran α ( 0 < α ≤ 1) (untuk penyederhanaan set α =1) 1. Selama kondisi berhenti benilai FALSE atau selama ada elemen vektor masukan yang respon unit keluarannya tidak sama dengan target (y ≠ t), lakukan langkah-langkah 2 – 6 2. Untuk setiap pasangan (s,t), kerjakan langkah 3 – 5: 3. Set aktivasi unit masukan xi = si (i = 1, ..., n) 4. Hitung respon untuk unit output:
5. Perbaiki bobot dan bias pola jika terjadi kesalahan Jika y ≠ t, maka: wi (baru) = wi (lama) + Δ wi (i = 1...n); dengan Δ wi = α t xi b (baru) = b (lama) + Δb dengan Δ b = α t Jika y = t maka: wi (baru) = wi (lama) b (baru) = b (lama) 6. Test kondisi berhenti: jika tidak terjadi perubahan bobot pada (i) maka kondisi berhenti TRUE, namun jika masih terjadi perubahan maka kondisi berhenti FALSE Ada beberapa hal yang perlu diperhatikan dalam algoritma tersebut: a. Interasi terus dilakukan hingga semua pola memiliki keluaran jaringan yang sama dengan targetnya (jaringan sudah memahami pola). Iterasi TIDAK berhenti setelah semua pola dimasukan seperti yang terjadi pada model Hebbian b. Pada langkah 5, perubahan bobot hanya dilakukan pada pola yang mengandung kesalahan (keluaran jaringan ≠ target). Perubahan tersebut merupakan hasil kali unit masukan dengan target dan laju pembelajaran. Perubahan bobot hanya akan terjadi jika unit masukan ≠ 0 c. Kecepatan iterasi ditentukan oleh laju pembelajaran α ( dengan 0 < α ≤ 1) yang dipakai. Semakin besar α, semakin sedikit iterasi yang diperlukan. Akan tetapi jika α terlalu besar, maka akan merusak pola yang sudah benar sehingga pembelajaran menjadi lambat Algoritma pelatihan perseptron lebih baik dibandingkan model Hebbian karena: a. Setiap kali pola dimasukkan, hasil keluaran jaringan dibandingkan dengan target yang sesungguhnya. Jika terdapat perbedaan, maka bobot akan dimodifikasi. Jadi tidak semua bobot selalu dimodifikasi dalam setiap iterasinya b. Modifikasi bobot tidak hanya ditentukan oleh perkalia antara target dan masukan, tetapi juga melibatkan suatu laju pembelajaran yang besar dapat diatur. c. Pelatihan dilakukan berulang-ulang untuk semua kemungkinan pola yang ada hingga jaringan dapat mengerti polanya (ditandai dengan samanya semua keluaran jaringan dengan target keluaran yang diiinginkan). Satu siklus pelatihan yang melibatkan semua pola disebut Epoch. Dalam jaringan Hebbian, pelatihan hanya dilakukan dalam satu Epoch saja. d. Teorema konvergensi perseptron menyatakan bahwa apabila ada bobot yang tepat, maka proses pelatihan akan konvergen ke bobot yang tepat tersebut. Program Perceptron Nama File : Perceptron.java public class Perceptron { private int[][] x; private int[] w; private int[] t; private int b; private int lRate; private int y; private int epoch; private int net; private boolean stop; private boolean[] bobotBerubah; public Perceptron(){ initial(); printInput(); learning(); } private void printInput(){ System.out.println("Bobot awal dan bias: "+w[0]+" "+w[1]+" "+b); System.out.println("Input data: x1 x2 target"); for(int i=0;i<4;i++){ x =" new" w =" new" b =" 0;" t =" new" lrate =" 1;" y =" 0;" bobotberubah =" new" i="0;i<4;i++){" stop =" false;" epoch =" 0;" stop ="="" i="0;i<4;i++){" net =" x[i][0]" y =" f(net);" stop =" true;"> 0) return 1;
else if(net == 0) return 0;
else return -1;
}

private void perbaikiBobot(int i){
w[0] = w[0] + lRate * t[i] * x[i][0];
w[1] = w[1] + lRate * t[i] * x[i][1];
b = b + lRate * t[i];
}

public void paternRecognize(int x1, int x2){
System.out.println("Pengenalan pola");
int net = x1 * w[0] + x2 * w[1] + b;
System.out.println("Input [x1 x2]: ["+x1+" "+x2+"] gerbang 'AND' dikenal dengan nilai "+f(net));
}
}

Nama File : Main.java

public class Main {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here

Perceptron p = new Perceptron();
p.paternRecognize(1, 1);
p.paternRecognize(1, -1);
p.paternRecognize(-1, 1);
p.paternRecognize(-1, -1);
}
}

sumber : http://farhan-hariri88.blogspot.com/2010/03/algortima-pelatihan-perseptron.html

Source code program penentu Subjek,Predikat dan Objek Kalimat

package id.web.reformation044.app;
import java.awt.Color;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.DefaultListModel;
import javax.swing.JOptionPane;


/**
*
* @author reformation044
*/
public class Utama extends javax.swing.JFrame {
private DefaultListModel modelSubjek = new DefaultListModel();
private DefaultListModel modelPredikat = new DefaultListModel();
private DefaultListModel modelObjek = new DefaultListModel();
private DefaultListModel modelKeterangan = new DefaultListModel();

private ArrayList himpSubjek = new ArrayList();
private ArrayList himpPredikat = new ArrayList();
private ArrayList himpObjek = new ArrayList();
private ArrayList himpKeterangan = new ArrayList();

private String subjek,predikat,objek,keterangan;
/** Creates new form Utama */
public Utama() {
initComponents();
setLocationRelativeTo(null);
inisialModel();
setVisible(true);
JOptionPane.showMessageDialog(this, "SILAKAN DAFTARKAN KATA-KATA DALAM 4 KOLOM POLA DIBAWAH INI\n" +
"SEBELUM MELAKUKAN SEMANTIC CHECKING", "PENTING COY", JOptionPane.WARNING_MESSAGE);
}

private void inisialModel(){
jList1.setModel(modelSubjek);
jList2.setModel(modelPredikat);
jList3.setModel(modelObjek);
jList4.setModel(modelKeterangan);
}

private void splitKalimat(String kal){
String[] token = kal.split(" ");
subjek = token[0];
predikat = token[1];
objek = token[2];
keterangan = token[3]+" "+token[4];
}

private boolean validasiSubjek(String input){
for(String s:himpSubjek){
if(s.equalsIgnoreCase(input)){
return true;
}
}
return false;
}
private boolean validasiPredikat(String input){
for(String s:himpPredikat){
if(s.equalsIgnoreCase(input)){
return true;
}
}
return false;
}
private boolean validasiObjek(String input){
for(String s:himpObjek){
if(s.equalsIgnoreCase(input)){
return true;
}
}
return false;
}
private boolean validasiKeterangan(String input){
for(String s:himpKeterangan){
if(s.equalsIgnoreCase(input)){
return true;
}
}
return false;
}
private int countToken(){
return textKalimat.getText().split(" ").length;
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// //GEN-BEGIN:initComponents
private void initComponents() {

jPanel1 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
textKalimat = new javax.swing.JTextField();
process = new javax.swing.JButton();
clear = new javax.swing.JButton();
jPanel2 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
info = new javax.swing.JTextArea();
jPanel3 = new javax.swing.JPanel();
jPanel4 = new javax.swing.JPanel();
inSubjek = new javax.swing.JTextField();
jScrollPane2 = new javax.swing.JScrollPane();
jList1 = new javax.swing.JList();
jPanel5 = new javax.swing.JPanel();
inPredikat = new javax.swing.JTextField();
jScrollPane3 = new javax.swing.JScrollPane();
jList2 = new javax.swing.JList();
jPanel6 = new javax.swing.JPanel();
inObjek = new javax.swing.JTextField();
jScrollPane4 = new javax.swing.JScrollPane();
jList3 = new javax.swing.JList();
jPanel7 = new javax.swing.JPanel();
inKeterangan = new javax.swing.JTextField();
jScrollPane5 = new javax.swing.JScrollPane();
jList4 = new javax.swing.JList();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Simulasi Sederhana Analisa Semantic Kalimat Aktif Transitif (S-P-O-K), reformation044.web.id");
setResizable(false);

jPanel1.setBackground(new java.awt.Color(102, 102, 102));
jPanel1.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED));

jLabel1.setForeground(new java.awt.Color(255, 255, 255));
jLabel1.setText("Masukkan Kalimat :");
jPanel1.add(jLabel1);

textKalimat.setColumns(30);
textKalimat.setToolTipText("MASUKKAN 5 KATA");
textKalimat.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(java.awt.event.KeyEvent evt) {
textKalimatKeyReleased(evt);
}
});
jPanel1.add(textKalimat);

process.setText("semantic checking");
process.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
processActionPerformed(evt);
}
});
jPanel1.add(process);

clear.setText("clear");
clear.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
clearActionPerformed(evt);
}
});
jPanel1.add(clear);

getContentPane().add(jPanel1, java.awt.BorderLayout.NORTH);

jPanel2.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED));
jPanel2.setPreferredSize(new java.awt.Dimension(544, 290));
jPanel2.setLayout(new java.awt.BorderLayout());

info.setColumns(20);
info.setRows(10);
jScrollPane1.setViewportView(info);

jPanel2.add(jScrollPane1, java.awt.BorderLayout.PAGE_START);

jPanel3.setBackground(new java.awt.Color(51, 51, 51));
jPanel3.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED));

jPanel4.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Subjek", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 11), new java.awt.Color(204, 204, 204))); // NOI18N
jPanel4.setOpaque(false);
jPanel4.setPreferredSize(new java.awt.Dimension(160, 215));
jPanel4.setLayout(new java.awt.BorderLayout());

inSubjek.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
inSubjekKeyPressed(evt);
}
});
jPanel4.add(inSubjek, java.awt.BorderLayout.NORTH);

jList1.setEnabled(false);
jScrollPane2.setViewportView(jList1);

jPanel4.add(jScrollPane2, java.awt.BorderLayout.CENTER);

jPanel3.add(jPanel4);

jPanel5.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Predikat", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 11), new java.awt.Color(204, 204, 204))); // NOI18N
jPanel5.setOpaque(false);
jPanel5.setPreferredSize(new java.awt.Dimension(160, 215));
jPanel5.setLayout(new java.awt.BorderLayout());

inPredikat.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
inPredikatKeyPressed(evt);
}
});
jPanel5.add(inPredikat, java.awt.BorderLayout.NORTH);

jList2.setEnabled(false);
jScrollPane3.setViewportView(jList2);

jPanel5.add(jScrollPane3, java.awt.BorderLayout.CENTER);

jPanel3.add(jPanel5);

jPanel6.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Objek", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 11), new java.awt.Color(204, 204, 204))); // NOI18N
jPanel6.setOpaque(false);
jPanel6.setPreferredSize(new java.awt.Dimension(160, 215));
jPanel6.setLayout(new java.awt.BorderLayout());

inObjek.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
inObjekKeyPressed(evt);
}
});
jPanel6.add(inObjek, java.awt.BorderLayout.NORTH);

jList3.setEnabled(false);
jScrollPane4.setViewportView(jList3);

jPanel6.add(jScrollPane4, java.awt.BorderLayout.CENTER);

jPanel3.add(jPanel6);

jPanel7.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Keterangan", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 11), new java.awt.Color(204, 204, 204))); // NOI18N
jPanel7.setOpaque(false);
jPanel7.setPreferredSize(new java.awt.Dimension(160, 215));
jPanel7.setLayout(new java.awt.BorderLayout());

inKeterangan.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
inKeteranganKeyPressed(evt);
}
});
jPanel7.add(inKeterangan, java.awt.BorderLayout.NORTH);

jList4.setEnabled(false);
jScrollPane5.setViewportView(jList4);

jPanel7.add(jScrollPane5, java.awt.BorderLayout.CENTER);

jPanel3.add(jPanel7);

jPanel2.add(jPanel3, java.awt.BorderLayout.CENTER);

getContentPane().add(jPanel2, java.awt.BorderLayout.CENTER);

java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-729)/2, (screenSize.height-488)/2, 729, 488);
}// //GEN-END:initComponents

private void processActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_processActionPerformed
// TODO add your handling code here:
if(!textKalimat.getText().isEmpty()){
textKalimat.setEditable(false);
splitKalimat(textKalimat.getText());
if(validasiSubjek(subjek)&&validasiPredikat(predikat)&&validasiObjek(objek)&&validasiKeterangan(keterangan)){
StringBuilder sb = new StringBuilder();
sb.append("subjek : "+subjek+"\n");
sb.append("predikat : "+predikat+"\n");
sb.append("objek : "+objek+"\n");
sb.append("keterangan : "+keterangan+"\n");
info.setText(sb.toString());
}else{
info.setText("POLA KALIMAT YANG ANDA MASUKKAN TIDAK SESUAI DENGAN S-P-O-K DIBAWAH");
}
}
}//GEN-LAST:event_processActionPerformed


private void inSubjekKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_inSubjekKeyPressed
// TODO add your handling code here:
if(evt.getKeyCode()==KeyEvent.VK_ENTER){
if(!inSubjek.getText().equals(null)){
modelSubjek.addElement(inSubjek.getText());
himpSubjek.add(inSubjek.getText());
inSubjek.setText("");
}
}
}//GEN-LAST:event_inSubjekKeyPressed

private void inPredikatKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_inPredikatKeyPressed
// TODO add your handling code here:
if(evt.getKeyCode()==KeyEvent.VK_ENTER){
if(!inPredikat.getText().equals(null)){
modelPredikat.addElement(inPredikat.getText());
himpPredikat.add(inPredikat.getText());
inPredikat.setText("");
}
}
}//GEN-LAST:event_inPredikatKeyPressed

private void inObjekKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_inObjekKeyPressed
// TODO add your handling code here:
if(evt.getKeyCode()==KeyEvent.VK_ENTER){
if(!inObjek.getText().equals(null)){
modelObjek.addElement(inObjek.getText());
himpObjek.add(inObjek.getText());
inObjek.setText("");
}
}
}//GEN-LAST:event_inObjekKeyPressed

private void inKeteranganKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_inKeteranganKeyPressed
// TODO add your handling code here:
if(evt.getKeyCode()==KeyEvent.VK_ENTER){
if(!inKeterangan.getText().equals(null)){
modelKeterangan.addElement(inKeterangan.getText());
himpKeterangan.add(inKeterangan.getText());
inKeterangan.setText("");
}
}
}//GEN-LAST:event_inKeteranganKeyPressed

private boolean cekIsiDataPolaKalimat(){
if(himpSubjek.isEmpty()||himpPredikat.isEmpty()||himpObjek.isEmpty()||himpKeterangan.isEmpty())
return true;
else
return false;
}

private void textKalimatKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_textKalimatKeyReleased
// TODO add your handling code here:
if(cekIsiDataPolaKalimat()){
textKalimat.setBackground(Color.red);
textKalimat.setText("");
}else{
textKalimat.setBackground(Color.white);
if(countToken()==6){
textKalimat.setEditable(false);
textKalimat.setText(textKalimat.getText().substring(0,textKalimat.getText().lastIndexOf(" ")));
}
}

}//GEN-LAST:event_textKalimatKeyReleased

private void clearActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_clearActionPerformed
// TODO add your handling code here:
textKalimat.setText("");
textKalimat.setEditable(true);
info.setText("");
}//GEN-LAST:event_clearActionPerformed

/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Utama().setVisible(true);
}
});
}

// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton clear;
private javax.swing.JTextField inKeterangan;
private javax.swing.JTextField inObjek;
private javax.swing.JTextField inPredikat;
private javax.swing.JTextField inSubjek;
private javax.swing.JTextArea info;
private javax.swing.JLabel jLabel1;
private javax.swing.JList jList1;
private javax.swing.JList jList2;
private javax.swing.JList jList3;
private javax.swing.JList jList4;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel4;
private javax.swing.JPanel jPanel5;
private javax.swing.JPanel jPanel6;
private javax.swing.JPanel jPanel7;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JScrollPane jScrollPane3;
private javax.swing.JScrollPane jScrollPane4;
private javax.swing.JScrollPane jScrollPane5;
private javax.swing.JButton process;
private javax.swing.JTextField textKalimat;
// End of variables declaration//GEN-END:variables
}

source code scanner kalimat dengan bahasa c

#include
#include
#include

#define SPASI 0x20
#define KOSONG 0x0

int main(int argc, char *argv[])
{
char kalimat[255] = {0};
int jumlah;
printf("Masukkan Kalimat : ");
gets(kalimat);


for(int i=0;kalimat[i] != KOSONG;i++)
{
jumlah = 1;
if(isdigit(kalimat[i]))
{
printf("Error: menemukan angka di dalam kalimat\n");
exit(1);
}
for(int j=i+1;kalimat[j] != KOSONG;j++)
{
if(kalimat[i] != SPASI || kalimat[j] != SPASI)
{
if(kalimat[i] == kalimat[j])
{
kalimat[j] = SPASI;
++jumlah;
}
}
}

if(kalimat[i] != SPASI)
printf("%c = %d\n",kalimat[i],jumlah);
}
return 0;
}

practice in the class

1. The Armory Show, held in New York in 1913, was a important exhibition of modern European art.
2. Ripe fruit is often stored in a place who contains much carbon dioxide so that the fruit will not decay too rapidly.
3. In 1852 Massachusetts passed a law requiring all children from four to eighteen years of old to attend school.
4. The main purpose of classifying animals is to show the most probable evolutionary relationship of the different species to each another.
5. Matthew C Perry, a United States naval commander, gained fame not in war and through diplomacy.
6. One of the most impressive collections of nineteenth-century European paintings in the United States can be found to the Philadelphia Museum of Art.
7. Three of every four migrating water birds in North America visits the Gulf of Mexico's winter wetlands.
8. Charleston, West Virginia, was named for Charles Clendenin, who son George acquired land at the junction of the Elk and Kanawha rivers in 1787.
9. Financier Andrew Mellon donated most of his magnificent art collection to the National Galerry of Art, where it is now locating.
10. Soil temperatures in Death Valley, California, near the Nevada border, have been known to reach 90 of degrees Celcius.

Analisa Leksikal

1.1 Pengertian
Analisis Leksikal/Analisis Linier/Pembacaan Sekilas (Scanner). Dalam kaitan ini aliran karakter yang membentuk program sumber dibaca dari kiri ke kanan dan dikelompokkan dalam apa yang disebut token yaitu barisan dari karakter yang dalam suatu kesatuan mempunyai suatu arti tersendiri..
Analisis ini melakukan penerjemahan masukan menjadi bentuk yang lebih berguna untuk tahap-tahap kompilasi berikutnya. Analisis Leksikal merupakan antarmuka antara kode program sumber dan analisis sintaktik (parser). Scanner melakukan pemeriksaan karakter per karakter pada teks masukan, memecah sumber program menjadi bagian-bagian disebut Token. Analisis Leksikal mengerjakan pengelompokkan urutan-urutan karakter ke dalam komponen pokok: identifier, delimeter, simbol-simbol operator, angka, keyword, noise word, blank, komentar, dan seterusnya menghasilkan suatu Token Leksikal yang akan digunakan pada Analisis Sintaktik.

Model dasar untuk membentuk suatu Analisis Leksikal adalah Finite-State Automata, 2 aspek penting pembuatan Analisis Leksikal adalah:
• Menentukan token-token bahasa.
• Mengenali token-token bahasa dari program sumber.
Token-token dihasilkan dengan cara memisahkan program sumber tersebut dilewatkan ke parser. Analisis Leksikal harus mengirim token ke parser. Untuk mengirim token, scanner harus mengisolasi barisan karakter pada teks sumber yang merupakan 1 token valid. Scanner juga menyingkirkan informasi seperti komentar, blank, batas-batas baris dan lain-lain yang tidak penting (tidak mempunyai arti) bagi parsing dan Code Generator.
Scanner juga harus dapat mengidentifikasi token secara lengkap dan membedakan keyword dan identifier. Untuk itu scanner memerlukan tabel simbol. Scanner memasukkan identifier ke tabel simbol, memasukkan konstanta literal dan numerik ke tabel simbol sendiri setelah konversi menjadi bentuk internal.
Analisis Leksikal merupakan komponen kompilasi independen yang berkomunikasi dengan parser lewat antarmuka yang terdefinisi bagus dan sederhana sehingga pemeliharaan analisis leksikal menjadi lebih mudah dimana perubahan-perubahan terhadap analisis leksikal tidak berdampak pada pengubahan kompilator secara keseluruhan. Agar dapat memperoleh fitur ini, maka antarmuka harus tidak berubah. Kebanyakan kode yang menyusun analisis leksikal adalah sama untuk seluruh kompilator, tidak peduli bahasa.
Pada analisis leksikal yang dituntun tabel (table-driven lexical analyzer), maka satu-satunya yang berubah adalah tabel itu sendiri. Kadang diperlukan interaksi analisis leksikal dan analisis sintaktik yang lebih kompleks. Sehingga analisis leksikal harus dapat menganggap string sebagai token bertipe, bukan identifier. Untuk itu perlu komunikasi tingkat lebih tinggi yang biasanya dilakukan suatu struktur data dipakai bersama seperti tabel simbol. Analisis Sintaktik dapat memasukkan string ke tabel simbol, mengidentifikasi sebagai Type atau typedef, sehingga analisis leksikal dapat memeriksa tabel simbol untuk menentukan apakah lexeme adalah tipe token atau identifier.
1.2 Tugas-tugas Analsis Leksikal
Tugas-tugas Analisis leksikal antara lain sebagai berikut :1. Konversi Program Sumber Menjadi Barisan Token. Mengubah program sumber yang dipandang sebagai barisan byte/karakter menjadi token.
2. Menangani Kerumitan Sistem Masukkan/Keluaran. Karena analisis leksikal biasanya berhubungan langsung dengan kode sumber yang diwadahi file, maka analisis leksikal juga bertindak sebagai benteng untuk komponen-komponen lain di kompilator dalam mengatasi keanehan-keanehan sistem masukkan/keluaran sistem operasi dan sistem komputer.
Optimasi perlu dilakukan agar analisis leksikal membaca karakter degan sekaligus membaca sejumlah besar bagian file. Perangkat masukkan/keluaran benar-benar diisolasi agar tidak terlihat oleh parser dan komponen-komponen kompilator yang lain.
1.3 Tugas-tugas tambahan Analisis Leksikal
Tugas-tugas tambahan Analisis Leksikal antara lain sebagai berikut :1. Penghilangan komentar dan whitespace (tab,spasi,karakter lainnya).Tindakan housekeeping dilakukan scanner sehingga mengisolasikan dari parser dan komponen-komponen kompilator lain.
Peran ini menyederhanakan perancangan parser (dan grammar bahasa pemrograman). Scanner juga mencatat nomor baris saat itu sehingga penanganan kesalahan yang cerdas dapat mengirim pesan kesalahan dengan lebih akurat.
2. Konversi literal/konstanta numerik menjadi tipe data tertentu. Analisis leksikal dapat mengirim token, dan nilainya. Nilai ini biasa disebut atribut. Namun demikian, bila analisis leksikal ditambahin dengan tugas-tugas tambahan yang terlalu banyak juga akan menjadi tidak baik. Karena itu membatasi analisis
leksikal hanya untuk melakukan tugas pengenalan pola token (ditambah membuang komentar) adalah mempermudah pemeliharaan.
1.4 Tahap-tahap Pelaksanaan Analisis LeksikalTahap Pelaksanaan Analisis Leksikal antara lain sebagai berikut :
- Pada single one pass.
Terjadi interaksi antara scanner dan parser. Sacnner dipanggil saat parser memerlukan token berikutnya. Pendekatan ini lebih baik karena bentuk internal program sumber yang lengkap tidak perlu dibangun dan disimpan di memori sebelum parsing dimulai.
- Pada separate pass.
Scanner memproses secara terpisah, dilakukan sebelum parsing. Hasil scanner disimpan dalam file. Dari file tersebut, parsing melakukan kegiatannya.
Scanner mengirim nilai-nilai integer yang mempresentasikan bentuk internal token, bukan nilai-nilai string.
Keunggulan cara ini adalah ukurannya kecil dan tetap. Parser sangat lebih efisien bekerja dengan nilai integer yang mempresentasikan simbol daripada string nyata dengan panjang variabel.

1.5 Implementasi Analisis LeksikalImplementasi Analisis Leksikal antara lain sebagai berikut :
- Pengenalan Token.1. Scanner harus dapat mengenali token
2. Terlebih dahulu dideskripsikan token-token yang harus dikenali
- Pendeskripsian Token.1. Menggunakan reguler grammar. Menspesifikasikan aturan-aturan pembangkit token-token dengan kelemahan reguler grammar menspesifikasikan token berbentuk pembangkit, sedang scanner perlu bentuk pengenalan.
2. Menggunakan ekspresi grammar. Menspesifikasikan token-token dengan ekspresi reguler.
3. Model matematis yang dapat memodelkan pengenalan adalah finite-state acceptor (FSA) atau finite automata.
- Implementasi Analisis Leksikal sebagai Finite Automata.Pada pemodelan analisis leksikal sebagai pengenal yang menerapkan finite automata, analisis leksikal tidak cuma hanya melakukan mengatakan YA atau TIDAK. Dengan demikian selain pengenal, maka analisis leksikal juga melakukan aksi-aksi tambahan yang diasosiasikan dengan string yangsedang diolah.
Analisis leksikal dapat dibangun dengan menumpangkan pada konsep pengenal yang berupa finite automata dengan cara menspesifikasikan rutin-rutin (aksi-aksi) tertentu terhadap string yang sedang dikenali.
- Penanganan Kesalahan di Analisis Leksikal Hanya sedikit kesalahan yang diidentifikasi di analisis leksikal secara mandiri karena analisis leksikal benar-benar merupakan pandangan sangat lokal terhadap program sumber.
Bila ditemui situasi dimana analisis leksikal tidak mampu melanjutkan proses karena tidak ada pola token yang cocok, maka terdapat beragam alternatif pemulihan. yaitu:
1. "Panic mode" dengan menghapus karakter-karakter berikutnya sampai analisis leksikal menemukan token yang terdefinisi bagus
2. Menyisipkan karakter yang hilang
3. Mengganti karakter yang salah dengan karakter yang benar
4. Mentransposisikan 2 karakter yang bersebelahan.
Salah satu cara untuk menemukan kesalahan-kesalahan di program adalah menghitung jumlah transformasi kesalahan minimum yang diperlukan untuk mentransformasikan program yang salah menjadi program yag secara sintaks benar.