Analisis Leksikal (Analyzer) dalam Desain Kompiler dengan Contoh

Apa itu Analisis Leksikal?

Analisis Leksikal adalah fase pertama dalam perancangan kompiler. Seorang Lexer mengambil kode sumber yang dimodifikasi yang ditulis dalam bentuk kalimat. Dengan kata lain, ini membantu Anda mengubah rangkaian karakter menjadi rangkaian token. Penganalisis leksikal memecah sintaksis ini menjadi serangkaian token. Ini menghilangkan spasi atau komentar tambahan yang ditulis dalam kode sumber.

Program yang melakukan Analisis Leksikal dalam desain kompiler disebut penganalisis leksikal atau lexer. Sebuah lexer berisi tokenizer atau pemindai. Jika penganalisis leksikal mendeteksi bahwa token tidak valid, ini akan menghasilkan kesalahan. Peran Penganalisis Lexical dalam desain kompiler adalah membaca aliran karakter dari kode sumber, memeriksa token legal, dan meneruskan data ke penganalisis sintaksis saat dibutuhkan.

Example

How Pleasant Is The Weather?

Lihat contoh Analisis Leksikal ini; Di sini kita dapat dengan mudah mengenali bahwa ada lima kata Betapa Menyenangkan, The, Weather, Is. Hal ini sangat wajar bagi kita karena kita dapat mengenali pemisah, titik kosong, dan simbol tanda baca.

 HowPl easantIs Th ewe ather?

Sekarang, periksa contoh ini, kita juga bisa membacanya. Namun hal tersebut memerlukan waktu karena separator dipasang di Tempat Ganjil. Ini bukanlah sesuatu yang datang kepada Anda secara instan.

Terminologi Dasar

Apa itu leksem?

Leksem adalah rangkaian karakter yang disertakan dalam program sumber menurut pola pencocokan suatu token. Itu tidak lain hanyalah sebuah contoh dari sebuah token.

Apa itu tanda?

Token dalam desain compiler adalah urutan karakter yang mewakili unit informasi dalam program sumber.

Apa itu Pola?

Pola adalah deskripsi yang digunakan oleh token. Dalam kasus kata kunci yang digunakan sebagai token, polanya adalah rangkaian karakter.

Penganalisis Leksikal Architekstur: Bagaimana token dikenali

Tugas utama analisis leksikal adalah membaca karakter masukan dalam kode dan menghasilkan token.

Penganalisis leksikal memindai seluruh kode sumber program. Ini mengidentifikasi setiap token satu per satu. Pemindai biasanya diimplementasikan untuk menghasilkan token hanya jika diminta oleh parser. Inilah cara kerja pengenalan token dalam desain kompiler-

Penganalisis Leksikal Architekstur
Penganalisis Leksikal Architekstur
  1. “Dapatkan token berikutnya” adalah perintah yang dikirim dari parser ke penganalisis leksikal.
  2. Saat menerima perintah ini, penganalisis leksikal memindai input hingga menemukan token berikutnya.
  3. Ini mengembalikan token ke Parser.

Lexical Analyzer melewatkan spasi dan komentar saat membuat token ini. Jika ada kesalahan, maka penganalisis leksikal akan menghubungkan kesalahan tersebut dengan file sumber dan nomor baris.

Peran penganalisis leksikal

Penganalisis leksikal melakukan tugas-tugas yang diberikan di bawah ini:

  • Membantu mengidentifikasi token ke dalam tabel simbol
  • Menghapus spasi dan komentar dari program sumber
  • Mengkorelasikan pesan kesalahan dengan program sumber
  • Membantu Anda memperluas makro jika ditemukan di program sumber
  • Membaca karakter masukan dari program sumber

Contoh Analisis Leksikal, Token, Non Token

Pertimbangkan kode berikut yang dimasukkan ke Lexical Analyzer

#include <stdio.h>
    int maximum(int x, int y) {
        // This will compare 2 numbers
        if (x > y)
            return x;
        else {
            return y;
        }
    }

Contoh Token yang dibuat

leksem Token
int Kata kunci
maksimum mengenali
( Operator
int Kata kunci
x mengenali
, Operator
int Kata kunci
Y mengenali
) Operator
{ Operator
If Kata kunci

Contoh Nontokens

Tipe contoh
Pesan // Ini akan membandingkan 2 angka
Petunjuk pra-prosesor #termasuk
Petunjuk pra-prosesor #definisikan ANGKA 8,9
Makro ANGKA
Ruang putih /n /b /t

Kesalahan Leksikal

Urutan karakter yang tidak mungkin dipindai menjadi token valid apa pun adalah kesalahan leksikal. Fakta penting tentang kesalahan leksikal:

  • Kesalahan leksikal tidak terlalu umum, namun harus dikelola oleh pemindai
  • Kesalahan ejaan pengidentifikasi, operator, kata kunci dianggap sebagai kesalahan leksikal
  • Umumnya, kesalahan leksikal disebabkan oleh munculnya beberapa karakter ilegal, sebagian besar di awal token.

Pemulihan Kesalahan di Penganalisis Leksikal

Berikut adalah beberapa teknik pemulihan kesalahan yang paling umum:

  • Menghapus satu karakter dari input yang tersisa
  • Dalam mode panik, karakter yang berurutan selalu diabaikan hingga kita mencapai token yang terbentuk dengan baik
  • Dengan memasukkan karakter yang hilang ke dalam input yang tersisa
  • Ganti karakter dengan karakter lain
  • Ubah urutan dua karakter serial

Penganalisis Leksikal vs. Parser

Penganalisis Leksikal parser
Pindai program masukan Lakukan analisis sintaksis
Identifikasi Token Buat representasi abstrak dari kode
Masukkan token ke dalam Tabel Simbol Perbarui entri tabel simbol
Ini menghasilkan kesalahan leksikal Ini menghasilkan pohon parse dari kode sumber

Mengapa memisahkan Leksikal dan Parser?

  • Kesederhanaan desain: Memudahkan proses analisis leksikal dan analisis sintaksis dengan menghilangkan token yang tidak diinginkan
  • Untuk meningkatkan efisiensi kompiler: Membantu Anda meningkatkan efisiensi kompiler
  • Spesialisasi: teknik khusus dapat diterapkan untuk meningkatkan proses analisis leksikal
  • Portabilitas: hanya pemindai yang perlu berkomunikasi dengan dunia luar
  • Portabilitas lebih tinggi: kekhasan khusus perangkat masukan terbatas pada lexer

Keuntungan Analisis Leksikal

  • Metode penganalisis leksikal digunakan oleh program seperti kompiler yang dapat menggunakan data yang diurai dari kode pemrogram untuk membuat kode biner terkompilasi yang dapat dieksekusi.
  • Ini digunakan oleh browser web untuk memformat dan menampilkan halaman web dengan bantuan data yang diurai dari JavaScript, HTML, CSS
  • Penganalisis leksikal terpisah membantu Anda membuat prosesor khusus dan berpotensi lebih efisien untuk tugas tersebut

Kerugian dari analisis leksikal

  • Anda perlu menghabiskan banyak waktu untuk membaca program sumber dan mempartisinya dalam bentuk token
  • Beberapa ekspresi reguler cukup sulit untuk dipahami dibandingkan dengan aturan PEG atau EBNF
  • Diperlukan lebih banyak upaya untuk mengembangkan dan men-debug lexer dan deskripsi tokennya
  • Overhead runtime tambahan diperlukan untuk menghasilkan tabel lexer dan membuat token

Kesimpulan

  • Analisis leksikal adalah fase pertama dalam desain kompiler
  • Leksem dan Token adalah urutan karakter yang disertakan dalam program sumber sesuai dengan pola pencocokan suatu token
  • Penganalisis leksikal diimplementasikan untuk memindai seluruh kode sumber program
  • Penganalisis leksikal membantu mengidentifikasi token ke dalam tabel simbol
  • Urutan karakter yang tidak mungkin dipindai menjadi token valid apa pun adalah kesalahan leksikal
  • Menghapus satu karakter dari sisa masukan berguna dalam metode pemulihan kesalahan
  • Lexical Analyzer memindai program masukan sementara parser melakukan analisis sintaksis
  • Ini memudahkan proses analisis leksikal dan analisis sintaksis dengan menghilangkan token yang tidak diinginkan
  • Penganalisis leksikal digunakan oleh browser web untuk memformat dan menampilkan halaman web dengan bantuan data yang diurai dari JavsScript, HTML, CSS
  • Kelemahan terbesar menggunakan penganalisis Lexical adalah memerlukan overhead runtime tambahan untuk menghasilkan tabel lexer dan membuat token