Teknik Kompilasi - Analisis Leksikal


Bagi yang pernah mengambil mata kuliah Teknik Kompilasi, pasti pernah mendengar tentang Analisis Leksikal.

Apa itu Analisis Leksikal?

Pada artikel ini kita akan membahas apa itu Analisis leksikal, bagaimana prosesnya dan contohnya.

Menurut Wikipedia, Analisis leksikal adalah sebuah proses yang mendahului parsing sebuah rangkaian karakter. Ia menerima masukan serangkaian karakter (seperti dalam dokumen plaint-text atau source code) dan menghasilkan deretan simbol yang masing-masing dinamakan token; proses parsing akan lebih mudah dilakukan bila inputnya sudah berupah token. Wikipedia

Itu adalah sedikit penjelasan tentang analisis leksikal, sekarang saya akan berikan contoh dari analisis leksikal. Disini saya mempunyai program yang menghitung presentase perjodohan dua ekor bebek. Berikut source code nya:

package AnalisisLeksikal;
import java.util.Scanner;
/**
 *
 * @author Elwin Musadi
 */

public static void main(String[] args) {

        Scaner owl=new Scanner(System.in);
        
        int tot1=0;
        int tot2=0;
        int joo; 
        
        System.out.print("Nama Bebek 1 : ");
        String a = owl.next();
        System.out.print("Nama Bebek 2 : ");
        String b = owl.next() 
        System.out.println("\n");
        
        for (int i = 0; i < a.lengh(); ++i){
            char chr = a.charAt(i);
            int value = chr - 'a' + 1;   
            total1 += value;
        }
        
        System.out.println("\n");
        System.out.println("Total untuk "+a+" : "+tot1);
        
        for (int i = 0; i < b.lengh(); ++i){
            char chr = b.charAt(i);
            int value = chr - 'a' + 1;   
            total2 += value;
        }
        
        System.out.println("Total untuk "+b+" : "+tot2);
        System.out.println("\n");
        
        if ( tot1>tot2 ){
            joo=(100*tot2/tot1);
            System.out.println("Presentasi Perjodohan untuk " + a + " dan " + b + " :" + joo + "%");
        
        if ( tot1<tot2 ){
            joo=(100*tot1/tot2);
            System.out.println("Presentasi Perjodohan untuk " + a + " dan " + b + " :" + joo + "%");
        }
    }
}


Eiits.. Jangan di Run dulu kodenya :D. Sekarang saya akan mengelompokan kode-kode diatas dalam masing-masing token, token yang saya maksud adalah identifier, keyword, literal, operator dan separator. Tapi, biar tidak membingungkan, saya jelaskan dulu arti dari setiap token yang ada.

  1. Identifier adalah token yang merepresentasikan nama. Dalam Java, identifier adalah nama yang diberikan untuk variable, class, atau method. Identifier boleh dimulai dengan huruf, underscore (_) atau tanda dollar ($). Identifier adalah case sensitive (membedakan huruf besar/ kecil) dan tidak ada batas maksimum.

  2. Keyword (kata kunci) adalah dentifier yang digunakan dalam Java untk suatu tujuan khusus. Daftar keyword Java sebagai berikut:

    abstract, Boolean, Break, Byte, byvalue, Case, Catch, Char, 
    Class, Const, continue, default, Do, double, else, extends, 
    false, final, finally, float, for, goto, if, implements, import, 
    instanceof, In, Interface, Long, Native, New, Null, Package, 
    private, protected, public, return, short, static, Super, Switch, 
    synchronized, This, threadsafe, throwm Transient, True, Try, Void, while.
    
  3. Literal adalah Penulisan besaran untuk variabel adalah penting, literal Java terdiri dari angka, karakter, dan string. Angka terdiri dari bilangan bulat (integer), bilangan mengambang (floating point), dan boolean. Nilai boolean untuk true dan false direpresentasikan sebagai 1 dan 0.

  4. Operator menspesifikasikan evaluasi atau komputasi terhadap objek. Operan yang dioperasikan dapat berupa literal, variabel, atau nilai yang dikirim oleh metode atau fungsi.

  5. Separator digunakan untuk menginformasikan ke komplator Java mengenai adanya pengelompokkan di kode program.

    Berikut daftar separator yang digunakan dalam Java:

Simbol Nama Penggunaan
( ) Kurung Untuk menghimpun parameter dalam definisi dan pemanggilan method, juga digunakan untuk menyatakan tingkat pernyataan, menghimpun pernyataan, untuk pengaturan alur program, dan untuk menyatakan tipe cast (cast types).
{ } Kurung Kurawal Untuk menghimpunnilai yang otomatis dimasukkan ke dalam array, digunakan juga untuk mendefinisikan blok program, untuk cakupan class, method, dan lokal.
[ ] Kurung Siku Untuk menyatakan tipe array dan untuk membedakan nilai array.
; Titik Koma Pemisah pernyataan.
, Koma Pemisah urutan identifier dalam deklarasi variabel.
. Titik Untuk memisahkan nama paket dari sub-paket dan class dan untuk memisahkan variabel atau method dari variabel referensi.

Nah, sudah tau kan arti dari token-token diatas?. Sekarang mari kita lihat token apa saja yang ada didalam program perjodohan bebek.

  1. Pada Identifier, ada:

    package AnalisisLeksikal;
    public class perjodohanBebek
    tot1, tot2, a, b
    
  2. Pada Keyword, ada:

    import, int, char, String, if, for, value, new, length, Scanner.in
    
  3. Pada Operator, ada:

    +=
    =
    <
    >
    

Oke, pada kode program diatas banyak yang saya salah ketik dan menyebabkan banyak error, jadi saya akan lakukan analisis leksikal (dalam Java (Netbeans IDE) akan diberitahukan pada line berapa letak kesalahan/error-nya).

Silahkan anda buka dan lihat kembali kode program diatas, lalu kita analisis bersama-sama.

Pada fungsi Scanner,

Scaner owl = new Scanner(System.in); // Harusnya Scanner, bukan Scaner.


Pada deklarasi variabel b,

String b = owl.next() // Tidak ada separator titik koma (;).


Pada perulangan for,

for (int i = 0; i < a.lengh(); ++i) { // Kurang huruf t pada kata length.


Pada percabangan if yang pertama,

if ( tot1>tot2 ){
    joo=(100*tot2/tot1);
    System.out.println("Presentasi Perjodohan untuk " + a + " dan " + b + " :" + joo + "%");
    // Kurang separator "}" untuk menutup pernyataan if.

Setelah kita analisa dan perbaiki, maka source code akan menjadi seperti dibawah ini:

package AnalisisLeksikal;
import java.util.Scanner;
/**
 *
 * @author Elwin Musadi
 */
public class perjodohanBebek {
    public static void main(String[] args) {

        Scanner owl=new Scanner(System.in);
        
        int tot1=0;
        int tot2=0;
        int joo; 
        
        System.out.print("Nama Bebek 1 : ");
        String a = owl.next();
        System.out.print("Nama Bebek 2 : ");
        String b = owl.next(); 
        System.out.println("\n");
        
        for (int i = 0; i < a.length(); ++i){
            char chr = a.charAt(i);
            int value = chr - 'a' + 1;   
            tot1 += value;
        }
        
        System.out.println("\n");
        System.out.println("Total untuk "+a+" : "+tot1);
        
        for (int i = 0; i < b.length(); ++i){
            char chr = b.charAt(i);
            int value = chr - 'a' + 1;   
            tot2 += value;
        }
        
        System.out.println("Total untuk "+b+" : "+tot2);
        System.out.println("\n");
        
        if ( tot1>tot2 ){
            joo=(100*tot2/tot1);
            System.out.println("Presentasi Perjodohan untuk " + a + " dan " + b + " :" + joo + "%");
        }
        
        if ( tot1<tot2 ){
            joo=(100*tot1/tot2);
            System.out.println("Presentasi Perjodohan untuk " + a + " dan " + b + " :" + joo + "%");
        }
    }
}

Dan ini hasil outputnya:

hasilperjodohan


Sekian dari saya, semoga dapat bermanfaat. Mohon maaf jika masih ada kesalahan, silahkan tinggalkan komentar dibawah.

Sumber