TEKNIK KOMPILASI
MAKALAH
LEXICAL ANALYSIS
OLEH :
SAERAH
2013020168
Lexical Analysis
A. Pendahuluan
Dalam ilmu komputer, analisis leksikal adalah proses mengubah urutan karakter ke dalam suatu
urutan token. Sebuah program atau fungsi yang melakukan analisis leksikal disebut sebagai analisa
leksikal, lexer atau pemindai. lexer A sering ada sebagai fungsi tunggal yang disebut oleh parser atau
fungsi lain.
B. Tata bahasa leksikal
Spesifikasi bahasa pemrograman yang sering akan mencakup seperangkat aturan yang
mendefinisikan lexer tersebut. Peraturan-peraturan ini biasa disebut ekspresi reguler dan mereka
menentukan urutan karakter set yang digunakan kemungkinan untuk membentuk token atau lexemes.
spasi, (yakni karakter yang diabaikan), juga didefinisikan dalam kalimat biasa.
C. Token
Sebuah token adalah string karakter, dikategorikan menurut aturan sebagai simbol (misalnya
identifier, NOMOR, koma, dll). Proses pembentukan token dari input stream karakter disebut (tokenization)
dan lexer yang mengkategorikan mereka sesuai dengan jenis simbol. Sebuah token dapat terlihat seperti
apa yang berguna untuk memproses input stream teks atau file teks.
Sebuah analisa leksikal biasanya tidak berbuat sesuatu dengan kombinasi bukti, tugas kiri untuk
sebuah parser. Sebagai contoh, penganalisis leksikal khas mengakui kurung sebagai bukti, tapi tidak
melakukan apapun untuk memastikan bahwa setiap ( yang cocok dengan a) .
Pertimbangkan ini istilah dalam bahasa pemrograman C: jumlah = 3 2;
Tokenized dalam tabel berikut: lexeme jenis token, jumlah Identifier, = Tugas operator, 3 Jumlah;
Penambahan operator, 2 Jumlah ; Akhir pernyataan.Token sering ditentukan oleh ekspresi reguler, yang
dipahami oleh generator penganalisa leksikal seperti lex. Penganalisa leksikal (baik yang dihasilkan secara
otomatis oleh alat seperti lex, atau tangan-crafted) membaca dalam aliran karakter, mengidentifikasi
lexemes di sungai, dan mengkategorikan mereka ke dalam token. Hal ini disebut tokenizing. Jika lexer
menemukan sebuah token yang tidak valid, itu akan melaporkan kesalahan.
Tokenizing Berikut ini adalah parsing. Dari sana, data diinterpretasikan boleh diambil ke dalam
struktur data untuk penggunaan umum, penafsiran, atau kompilasi.
D. Scanner
Tahap pertama, pemindai, biasanya didasarkan pada sebuah mesin finite state. Telah dikodekan
di dalamnya informasi tentang kemungkinan urutan karakter yang dapat ditampung dalam salah satu token
itu menangani (contoh individual dari urutan karakter yang dikenal sebagai lexemes). Sebagai contoh,
integer token dapat berisi karakter angka urutan numerik. Dalam banyak kasus, karakter non-spasi
pertama dapat digunakan untuk menyimpulkan jenis token yang berikut dan karakter masukan berikutnya
kemudian diproses satu per satu sampai mencapai karakter yang tidak di set karakter yang dapat diterima
untuk token (ini dikenal sebagai aturan mengunyah maksimal, atau peraturan pertandingan terpanjang).
Dalam beberapa bahasa penciptaan lexeme aturan lebih rumit dan bisa melibatkan mundur lebih dari
sebelumnya membaca karakter.
E. Tokenizer
Tokenization adalah proses yang membatasi dan mengelompokkan mungkin bagian dari sebuah
string karakter input. Token yang dihasilkan kemudian disampaikan kepada bentuk lain dari pengolahan.
Proses ini dapat dianggap sebagai sub-tugas parsing input.
Ambil, misalnya, string berikut. Sesuatu cepat rubah cokelat melompat selama anjing malas. Tidak
seperti manusia, komputer tidak dapat secara intuitif melihat bahwa ada 9 kata-kata. Untuk komputer ini
hanya serangkaian 43 karakter. Suatu proses tokenization dapat digunakan untuk memisahkan kalimat
menjadi kata token. Meskipun contoh berikut ini diberikan sebagai XML ada banyak cara untuk mewakili
input tokenized:
<sentence>
<word> <The / word>
<word> cepat </> kata
<word> cokelat </> kata
<word> <rubah / word>
<word> melompat </> kata
<word> atas </> Kata
<word> </ word>
<word> malas </> kata
<word> <anjing / word>
</ Kalimat>
Lexeme A, bagaimanapun, adalah hanya sebuah string karakter dikenal dari jenis tertentu
(misalnya, sebuah string literal, urutan dari huruf). Dalam rangka membangun sebuah token, penganalisa
leksikal kebutuhan tahap kedua, evaluator, yang berjalan selama karakter lexeme untuk menghasilkan
nilai. type lexeme, ditambah dengan nilai yang benar merupakan sebuah token yang dapat diberikan
kepada sebuah parser. (Beberapa bukti seperti tanda kurung tidak benar-benar memiliki nilai, dan fungsi
evaluator untuk ini bisa kembali apa-apa. Para evaluator untuk bilangan bulat, pengidentifikasi, dan string
bisa jauh lebih kompleks. Kadang-kadang evaluator dapat menekan lexeme yang sepenuhnya,
menutupinya dari parser, yang berguna untuk spasi dan komentar.)
Misalnya, dalam kode sumber dari program komputer string,
net_worth_future = (aset
kewajiban); mungkin akan diubah (dengan spasi dirahasiakan) ke dalam aliran token leksikal: NAMA
net_worth_future Sama
aset MINUS,
NAMA
Generator Lexer
Analisis leksikal sering dapat dilakukan dalam satu lulus dilakukan jika membaca karakter
sekaligus. lexers Single-pass dapat dihasilkan oleh alat seperti flex klasik. Lex ini / keluarga flex generator
menggunakan pendekatan tabel-driven yang jauh lebih efisien dibandingkan dengan pendekatan secara
langsung kode [meragukan mendiskusikan]. Dengan pendekatan yang kedua generator menghasilkan
mesin yang langsung melompat ke negara tindak lanjut melalui laporan goto. Peralatan seperti re2c dan
Quex telah terbukti (misalnya artikel tentang re2c) untuk memproduksi mesin yang antara dua sampai tiga
kali lebih cepat daripada mesin dihasilkan flex. [Rujukan?] Hal ini pada umumnya sulit untuk tanganmenulis analisa yang berperforma lebih baik dibandingkan mesin yang dihasilkan oleh alat terakhir ini.
Utilitas sederhana menggunakan generator scanner tidak boleh diabaikan, terutama dalam tahap
perkembangan, ketika sebuah spesifikasi bahasa mungkin berubah setiap hari. Kemampuan untuk
mengekspresikan leksikal konstruksi sebagai ekspresi reguler memfasilitasi deskripsi penganalisis leksikal.
Beberapa alat menawarkan spesifikasi dan pra-kondisi pasca-yang sulit program dengan tangan. Dalam
hal ini, dengan menggunakan generator scanner dapat menghemat banyak waktu pembangunan.
source Scanner
program
get next
token
Symbol
Table
Membuang comment dan white space (blank, tab <indent>, dan newline character).
Menghasilkan error messages.
Contoh Lexeme
const_sym
const, define
if_sym
Loop_sym
relation
id
num
literal
Contoh Pattern
const pi:=3.14,
#define pi 3.14
if
if (expr) then [else]
for, while..do,
for var :=init to fnl do
Repeat .. until
init :=num
Do while(expr)
while(expr) do stmt
<,<=,=,<>,>,>=
< or <= or =S
.lt. .le. .eq. .ne. .gt. .ge.
or <> or > or >=
pi, count, d2
Letter diikuti oleh
letters atau digits
3.14, 0, 6.0E10
Sembarang
konstanta angka
Hallo
Sembarang
karakter diantara
dan kecuali
Pada bahasa-bahasa tertentu Lexical Analysis menjadi lebih sulit, contoh populer : Statement DO
pada bahasa pemrograman FORTRAN :
DO 5 I = 1.25 Do bagian dari
DO 5 I
DO 5 I = 1,25
Do = Keyword
ATRIBUT-ATRIBUT TOKEN
Informasi tentang token (biasanya single atribut)
Dibutuhkan pointer untuk load/ store dalam simbol table entry
Lexeme sebuah identifier dan line number akan tersimpan dalam simbol table entry
dituliskan : <token,attribut,value>
Contoh :
E := M * C ** 2
Token-token yang akan dihasilkan :
< id, pointer to symbol table untuk E >
< assign_op, := >
< id, pointer to symbol table untuk M >
< mult_op, * >
< id, pointer to symbol table untuk C >
< exp_op, ** >
< num, integer value 2 >
INPUT BUFFERING
Fungsi : menyimpan hasil scanning untuk menemukan token.
Untuk menemukan 2 token digunakan 2 pointer :
Pointer forward :
menunjuk akhir token
Pointer lexeme_beginning :
menunjuk awal token
E = M * C * * 2 eof
Forward chaining
lexeme-ending
lexeme-beginning
backward chaining
Buffer hanya menampung satu baris perintah, dan berhubungan dengan simbol table.
STRATEGI ERROR-RECOVERY
1.
Menghapus suatu karakter yang tidak sesuai hingga ditemukan suatu token yang sesuai
2.
Menyisipkan sebuah karakter yang hilang.
3.
Mengganti suatu karakter yang salah dengan karakter yang benar.
4.
Menukarkan dua karakter yang berdampingan.
SYMBOL TABLE
Symbol table adalah suatu struktur data yang digunakan untuk menyim-pan informasi tentang
komponen (token) suatu source program.
SPESIFIKASI TOKEN
STRING DAN LANGUAGES
Alphabet class adalah suatu himpunan terbatas dari simbol-simbol.
String adalah rangkaian simbol-simbol dari alpabetik
Panjang string S ditulis dengan |S| adalah banyaknya simbol dalam string s misalnya : S=abc
maka |S| = 3
Empty string ditulis dengan dengan panjang string nol (0)
Empty set ditulis dengan atau {}
Concatenation adalah menggabung 2 buah atau lebih string.
Union ()
Concatenation (.)
Closure :
Kleene Closure (*)
Kleene closure dari L adalah L*
L* = Li
i=0
L+ = Li
i=1
Misalnya :
Token identifier ditulis dengan :
letter letter (letter | digit)*
dimana :
letter ={a,b,..,z, A,B,C,...,Z}
digit ={0,1,2,...,9}
| berarti atau
( ) berarti subexpression
* berarti nol atau lebih
SIFAT-SIFAT R.E.
r|s
= s|r
r|(s|t)
= (r|s)|t
(rs)t
= r(st)
r(s|t)
= rs|rt
r = r = r
r*
= (r|)*
r**
= r*
r*
= r +|
r+
= rr*
Contoh :
alphabet = {a, b}
1. RE ab menyatakan himpunan {a,b}
2. RE (a|b)(a|b) menyatakan {aa,ab,ba,bb}
3. RE a* menyatakan {,a,aa,aaa,...}
4. RE a+ menyatakan {a,aa,aaa,...}
5. RE (a|b)* menyatakan himpunan
string yang terdiri dari nol atau
beberapa a atau beberapa b.
6.
RE a|(a*b) menyatakan himpunan string yang terdiri dari a atau beberapa a, diikuti oleh
sebuah b.
REGULAR DEFINITION (RD)
RD adalah suatu sekuensi/ rangkaian definisi dalam bentuk :
d1 r1
dimana : di nama unik ri
d2 r2 r1
yaitu RE yang terdiri dari
...........
simbol-simbol dalam
...........
{d1,d2,...dI-1}
dn rn
Contoh :
1. regular definition untuk identifier :
letter A|B|...|Z|a|b|...|z
digit 0|1|...|9
id
letter(leter|digit)*
2.