Anda di halaman 1dari 11

TUGAS KULIAH 02

TEKNIK KOMPILASI
MAKALAH
LEXICAL ANALYSIS

OLEH :
SAERAH
2013020168

JURUSAN TEKNIK INFORMATIKA


STMIK HANDAYANI MAKASSAR
2015

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

dengan OPEN_PARENTHESIS, NAMA

aset MINUS,

NAMA

kewajiban CLOSE_PARENTHESIS, Titik koma


Meskipun adalah mungkin dan kadang-kadang diperlukan untuk menulis lexer dengan tangan,
lexers sering dihasilkan oleh alat bantu otomatis. Peralatan ini umumnya menerima ekspresi reguler yang
menggambarkan token diperbolehkan dalam input stream. Setiap ekspresi yang teratur berkaitan dengan
produksi dalam tata bahasa leksikal dari bahasa pemrograman yang mengevaluasi lexemes yang cocok
dengan ekspresi reguler. Alat-alat ini dapat menghasilkan kode sumber yang dapat dikompilasi dan
dijalankan atau membangun sebuah tabel negara untuk mesin finite state (yang terhubung ke kode
template untuk kompilasi dan eksekusi).
Kalimat biasa kompak merupakan pola bahwa karakter dalam lexemes mungkin mengikuti.
Sebagai contoh, untuk bahasa Inggris berbasis, sebuah NAMA token mungkin karakter abjad Inggris atau
garis bawah, diikuti oleh jumlah instance dari setiap karakter ASCII alfanumerik atau garis bawah. Hal ini
dapat diwakili kompak oleh string [a-zA-Z_] [a-zA-Z_0-9] *. Ini berarti ada karakter az, AZ atau _, diikuti 0
atau lebih dari az, AZ, _ atau 0-9.
Kalimat biasa dan mesin finite state mereka hasilkan tidak cukup kuat untuk menangani pola
rekursif, seperti tanda kurung n pembukaan, diikuti dengan pernyataan, diikuti oleh tanda kurung tutup n.
Mereka tidak mampu menjaga menghitung, dan memverifikasi n yang sama di kedua sisi kecuali jika
Anda memiliki seperangkat nilai-nilai terbatas diperbolehkan untuk n. Dibutuhkan parser penuh untuk
mengenali pola seperti di umum penuh mereka. parser A dapat mendorong kurung di tumpukan dan
kemudian mencoba untuk pop mereka dan melihat apakah stack kosong di akhir. (Lihat contoh di buku
SICP)
Alat Lex pemrograman dan compiler yang dirancang untuk menghasilkan kode untuk analisa
leksikal cepat berdasarkan deskripsi formal sintaks leksikal. Ini umumnya tidak dianggap cukup untuk
aplikasi dengan seperangkat aturan leksikal rumit dan persyaratan kinerja parah, misalnya, GNU Compiler
Collection lexers menggunakan tulisan tangan.
F.

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.

G. Leksikal analyzer generator


ANTLR ANTLR dihasilkan didasarkan, LL (k) lexers. Flex Alternatif varian dari klasik lex (C /
C). JFlex penulisan ulang dari JLex. Ragel Sebuah mesin scanner negara dan generator leksikal
dengan dukungan output untuk C, C Objective-C, D, Jawa dan kode Ruby source. Para penganalisis
leksikal berikut dapat menangani Unicode: JLex A Lexical Analyzer Generator untuk Java. Quex (atau
Que ) A Universal Cepat Analyzer Generator leksikal C.

PERANAN LEXICAL ANALYZER (Scanner)


Membaca source program (input stream), mengenali, mengidentifikasi lexeme (word)
kemudian meng-hasilkan rangkaian token sebagai output.
token
parser

source Scanner
program

get next
token
Symbol
Table

Scanner biasanya diimplementasikan dalam bentuk subroutine dari program Parser


TUGAS LAIN LEXICAL ANALYZER
1.
2.

Membuang comment dan white space (blank, tab <indent>, dan newline character).
Menghasilkan error messages.

BEBERAPA ISU DALAM LEXICAL ANALYSIS


Alasan mengapa Lexical Analysis dipisahkan dari Syntax Analysis :
1.
2.
3.

Desain kompiler menjadi lebih sederhana


Efisiensi kompiler meningkat
Portabilitas kompiler meningkat

TOKEN, PATTERN DAN LEXEME


Token (simbol atomic) :
Bagian terkecil yang dikenal oleh scanner. Token dapat berupa bilang-an atau konstanta
string (x=makan, y=minum),literal(a,lampet), operator (+,-,*,/,%, sqr, sqrt, exp, sin,
cos,tan),exclamation(! ?), functuation (; , . : ), keywords (begin, end, write, read, var, cin,
cout, if, while, for, {, }), karakter ganda (:=,<>,+=,=+,--,++,!=,==,**,), identifier (proc,
var, name, const, type)
Lexeme :
Rangkaian karakter (word) yang sama (matched) dengan pola (pattern) suatu token
Pattern :
Suatu pola/ rules/ aturan yang menggambarkan struktur suatu token
Contoh : const pi = 3.14;
Token

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.

Informasi yang dimaksud :


- Lexeme (word)
- Bentuk identifier
- Type identifier (procedure, variable, label)
- Posisi penyimpanan
Interaksi dengan simbol table
SYMBOL TABLE INTERFACE
Rutin untuk operasi Save dan Retieve terhadapa Lexeme adalah :
insert (s,t): menghasilkan indeks entry baru untuk string s, token t
lookup (s) : menghasilkan indeks entry baru untuk string s, atau 0 bila s tak ditemukan.
RESERVED KEYWORDS HANDLING
Reserved keywords disimpan dalam symbol-table saat inisialisasi proses kompiler.
contoh rutin yang menangani reserved keywords :
insert (div, div_sym)
insert (mod, mod_sym)
Sehingga bila dilakukan
lookup(div)
menghasilkan token div_sym
div tidak bisa digunakan sebagai identifier
IMPLEMENTASI SYMBOL TABLE

Symbol table harus memungkinkan penambahan / pencarian yang efisien


Bisa diimplementasikan dengan : Array, List

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.

Contoh : x=dog dan y=house maka concatenation x dan y adalah doghouse


Himpunan {0,1} adalah binary alphabet
ISTILAH-ISTILAH PENTING STRING
Contoh : Bila s = abc, maka
prefix s
: , a, ab, abc
proper prefix s : a, ab
suffix s
: abc, bc, c,
proper suffix s
: bc, c
substring s
: prefix s suffix s b
: , a, ab, abc, bc, c, b
proper substring s : substring s abc -
subsequence s : substring s ac
EKSPONENSIASI STRING
s0 =
s1 = s untuk i > 0, maka
s2 = ss si = si-1s
s3 = sss
sehingga : Ln = Ln-1 L dan L0 = {}
BEBERAPA OPERASI TERHADAP BAHASA

Union ()
Concatenation (.)
Closure :
Kleene Closure (*)
Kleene closure dari L adalah L*
L* = Li
i=0

Positive Closure (+)


Positive closure dari L adalah L+

L+ = Li
i=1

REGULAR EXPRESSION (RE)


Digunakan untuk mendefenisikan set dan token-token dari suatu bahasa.

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.

RD untuk unsigned numbers:


digit
0|1||9
digits
digit digit*
optional_fraction .digits|
optional_exponent (E(+|-|)digits)|
num
digits optional_fraction
optional_exponent

Anda mungkin juga menyukai