Pertemuan 6 Analisis Sintaksis pdf
Analisis Sintaksis
Istiqomah, S.Kom [Teknik Kompilasi UNIKOM 2014]
Definisi Analisis Sintaks
Pengelompokkan token-token ke dalam class syntax (bentuk sintaks),
seperti procedure, statement, dan expression.
Grammar : sekumpulan aturan-aturan untuk mendefinisikan bahasa
sumber
Grammar dipakai oleh analisis sintaksis untuk menentukan struktur dari
program sumber.
Definisi Analisis Sintaks
Proses pendeteksian atau pemeriksaan urutan kemunculan token disebut
dengan istilah Parsing.
Parsing adalah konstruksi atau pembentukan Pohon Sintaks untuk suatu
kalimat (ekspresi).
Pohon Sintaks
Pohon Sintaks berguna untuk menggambarkan bagaimana memperoleh
suatu string (untai) dengan cara menurunkan simbol-simbol non-terminal
(variable) menjadi simbol terminal.
Contoh 1
Misal terdapat sebuah kalimat
The cat sat on the mat
Contoh 2
Misal terdapat aturan tata bahasa bebas
konteks dengan aturan produksi :
S AB
A aA | a
B bB | b
String yang dihasilkan adalah ‘aabbb’
Teknik Penurunan
Proses penurunan/parsing bisa dilakukan dengan cara :
1. Penurunan terkiri (leftmost derivation), simbol variabel
terkiri yang diperluas lebih dulu.
2. Penurunan terkanan (rightmost derivation), simbol variabel
terkanan yang diperluas lebih dulu.
Contoh 3
Misal terdapat tata bahasa Penurunan Kiri
bebas konteks :
S aAS | a
A SbA | ba
Penurunan Kanan
S aAS
S aAS
» S aSbAS
» S aAa
» S aabAS
» S aSbAa
» S aabbaS
» S aSbbaa
» S aabbaa
» S aabbaa
Contoh 3 (lanjutan)
S
a
A
S
a
S
a
b
A
b
a
Metode Parsing
Top Down
Metode ini melakukan penelusuran dari root/puncak menuju leaf/daun (S T).
Meliputi : Backtrack/backup (Brute Force) & No Backtrack (Recursive
Descent Parser)
Bottom Up
Metode ini melakukan penulusuran dari leaf/daun menuju ke root/puncak. (T-S)
Parsing dengan Brute Force
Metode ini memilih aturan produksi dari paling kiri
Kemudian melakukan expand semua non terminal pada aturan produksi sampai
yang tertinggal adalah simbol terminal.
Bila terjadi kesalahan (string tidak sesuai) maka akan dilakukan backtrack.
Algoritma ini membangun pohon parsing yang top down, yaitu mencoba segala
kemungkinan yang ada secara satu persatu.
Parsing dengan Brute Force
Misal :
S aAd | aB
Ab|c
B ccd | ddc
Lakukan parsing untuk
String ‘accd’
Parsing dengan Brute Force (Rekursif Kiri)
Aturan produksi dalam bentuk :
AA
dengan = (V T)* atau kumpulan simbol variabel dan terminal
Contoh :
S Sd
B Bad
Parsing dengan Brute Force (Rekursif Kiri)
Dalam banyak penerapan tata bahasa, rekursif kiri tak dinginkan
Untuk menghindari penurunan yang bisa mengakibatkan looping, perlu
dihilangkan sifat rekursif kiri dari aturan produksi.
Contoh 4
Terdapat grammar/tata bahasa G = {V, T, S, P}
V = {“E”, “T”, “F”}
Simbol non-terminal
T = {“i”, “*”, “/”, “+”, “-” }
Simbol terminal
S = “E”
String yang diinginkan adalah i*i
Tentukan aturan produksi yang bisa diterima.
Simbol awal
Contoh 4 (lanjutan)
Aturan produksi (P) yang dicobakan
adalah :
F i diterima
TF|T*F|T/F
F i diterima, walaupun rekursif kiri
ET|T+E|T–E
TF|F*T|F/T
ET|E+T|E–T
EE+T|E–T|T
TF*T|F/T|F
F i tidak diterima, karena rekursif kiri
menyebabkan looping.
Penghilangan Rekursif Kiri
Pisahkan aturan produksi yang rekursif kiri dan tidak, misal :
Rekursif kiri : A A1 | A2 | A3 | …. | An
Bukan Rekursif kiri : A 1 | 2 | 3 | …. | m
Lalu tentukan 1 , 2 …. n dan 1 , 2 …. m dari setiap aturan produksi yang memiliki simbol ruas kiri
yang sama.
Lakukan penggantian aturan produksi yang rekursif kiri.
1. A 1Z | 2Z | …. | mZ
2. Z 1 | 2 | …. | n
3. Z 1Z | 2Z | …. | nZ
Hasil akhir berupa aturan produksi ditambah dengan aturan produksi semula yang tidak rekursif kiri.
Contoh 5
Tata bahasa bebas konteks :
S Sab | aSc | dd | ff | Sbd
Langkah Pengilangan rekursif kiri
1. Pisahkan
Rekursif kiri
Bukan Rekursif kiri
: S Sab | Sbd
: S aSc | dd | ff
=> 1 = ab, 2 = bd
=> 1 = aSc, 2 = dd, 3 = ff
Contoh 5 (Lanjutan)
2. Lakukan pergantian
S aScZ | ddZ | ffZ
Z ab | bd
Z abZ | bdZ
3. Hasil akhir yang didapat
S aSc | dd | ff
S aScZ | ddZ | ffZ
Z ab | bd
Z abZ | bdZ
Kelemahan Metode Brute Force
Mencoba untuk semua aturan produksi yang ada sehingga menjadi
lambat (rentang waktu eksekusi tidak jelas)
Mengalami kesukaran untuk melakukan pembetulan kesalahan
Memakan banyak memori, karena perlu mencatat (backup) lokasi
backtrack
Grammar yang memiliki Rekursif Kiri tidak bisa diperiksa, maka harus
diubah dulu sehingga tidak rekursif kiri, Karena rekursif kiri akan
mengalami Loop yang terus-menerus
Parsing dengan Recursive Descent Parser
Salah satu cara untuk mengaplikasikan bahasa bebas konteks untuk
melakukan analisa sintaksis suatu source code
Pada tahap ini, simbol terminal maupun simbol non-terminal (variabel)
sudah bukan sebuah karakter, tetapi berupa besaran leksikal sebagai
simbol terminalnya dan besaran sintaks sebagai simbol non-terminal
(variabel).
Parsing dengan Recursive Descent Parser
Ciri dari RDP yang menonjol secara rekursif menurunkan semua variabel
dari awal sampai bertemu terminal dan tidak pernah mengambil token
secara mundur.
Ciri lain dari RDP adalah sangat bergantung pada algoritma scan dalam
mengambil token.
Contoh 6
Apabila t_ASS (:=) diartikan oleh scanner sebagai t_COL (:) dan t_E (=),
maka parser tidak dapat mengenali bahwa itu sebenarnya adalah t_ASS,
Untuk itu, apabila ingin menggunakan RDP, maka disarankan untuk
menggunakan scanner yang “dapat dipercaya”.
Contoh 7
Sebuah grammar memiliki aturan produksi sebagai berikut :
::= t_PROG t_ID t_SEMICOL t_DOT
::= t_BEGIN {t_SEMICOL } t_END
::= t_ID t_ASS | t_IF t_THEN |
t_IF t_THEN t_ELSE
::= t_EQ | t_LT
| t_GT
Dan seterusnya….
Contoh 7 (lanjutan)
Contoh 7 (lanjutan)
Contoh 7 (lanjutan)
Latihan
Lakukan parsing dengan metode brute force, untuk mendapatkan string
‘adssfd’ dari :
S aAd | Ba | cd
A b | c | Bf
B aef | dss
Latihan
Lakukan penghilangan rekursif kiri dari :
A Abc | cd | Afg | Ai | d
Istiqomah, S.Kom [Teknik Kompilasi UNIKOM 2014]
Definisi Analisis Sintaks
Pengelompokkan token-token ke dalam class syntax (bentuk sintaks),
seperti procedure, statement, dan expression.
Grammar : sekumpulan aturan-aturan untuk mendefinisikan bahasa
sumber
Grammar dipakai oleh analisis sintaksis untuk menentukan struktur dari
program sumber.
Definisi Analisis Sintaks
Proses pendeteksian atau pemeriksaan urutan kemunculan token disebut
dengan istilah Parsing.
Parsing adalah konstruksi atau pembentukan Pohon Sintaks untuk suatu
kalimat (ekspresi).
Pohon Sintaks
Pohon Sintaks berguna untuk menggambarkan bagaimana memperoleh
suatu string (untai) dengan cara menurunkan simbol-simbol non-terminal
(variable) menjadi simbol terminal.
Contoh 1
Misal terdapat sebuah kalimat
The cat sat on the mat
Contoh 2
Misal terdapat aturan tata bahasa bebas
konteks dengan aturan produksi :
S AB
A aA | a
B bB | b
String yang dihasilkan adalah ‘aabbb’
Teknik Penurunan
Proses penurunan/parsing bisa dilakukan dengan cara :
1. Penurunan terkiri (leftmost derivation), simbol variabel
terkiri yang diperluas lebih dulu.
2. Penurunan terkanan (rightmost derivation), simbol variabel
terkanan yang diperluas lebih dulu.
Contoh 3
Misal terdapat tata bahasa Penurunan Kiri
bebas konteks :
S aAS | a
A SbA | ba
Penurunan Kanan
S aAS
S aAS
» S aSbAS
» S aAa
» S aabAS
» S aSbAa
» S aabbaS
» S aSbbaa
» S aabbaa
» S aabbaa
Contoh 3 (lanjutan)
S
a
A
S
a
S
a
b
A
b
a
Metode Parsing
Top Down
Metode ini melakukan penelusuran dari root/puncak menuju leaf/daun (S T).
Meliputi : Backtrack/backup (Brute Force) & No Backtrack (Recursive
Descent Parser)
Bottom Up
Metode ini melakukan penulusuran dari leaf/daun menuju ke root/puncak. (T-S)
Parsing dengan Brute Force
Metode ini memilih aturan produksi dari paling kiri
Kemudian melakukan expand semua non terminal pada aturan produksi sampai
yang tertinggal adalah simbol terminal.
Bila terjadi kesalahan (string tidak sesuai) maka akan dilakukan backtrack.
Algoritma ini membangun pohon parsing yang top down, yaitu mencoba segala
kemungkinan yang ada secara satu persatu.
Parsing dengan Brute Force
Misal :
S aAd | aB
Ab|c
B ccd | ddc
Lakukan parsing untuk
String ‘accd’
Parsing dengan Brute Force (Rekursif Kiri)
Aturan produksi dalam bentuk :
AA
dengan = (V T)* atau kumpulan simbol variabel dan terminal
Contoh :
S Sd
B Bad
Parsing dengan Brute Force (Rekursif Kiri)
Dalam banyak penerapan tata bahasa, rekursif kiri tak dinginkan
Untuk menghindari penurunan yang bisa mengakibatkan looping, perlu
dihilangkan sifat rekursif kiri dari aturan produksi.
Contoh 4
Terdapat grammar/tata bahasa G = {V, T, S, P}
V = {“E”, “T”, “F”}
Simbol non-terminal
T = {“i”, “*”, “/”, “+”, “-” }
Simbol terminal
S = “E”
String yang diinginkan adalah i*i
Tentukan aturan produksi yang bisa diterima.
Simbol awal
Contoh 4 (lanjutan)
Aturan produksi (P) yang dicobakan
adalah :
F i diterima
TF|T*F|T/F
F i diterima, walaupun rekursif kiri
ET|T+E|T–E
TF|F*T|F/T
ET|E+T|E–T
EE+T|E–T|T
TF*T|F/T|F
F i tidak diterima, karena rekursif kiri
menyebabkan looping.
Penghilangan Rekursif Kiri
Pisahkan aturan produksi yang rekursif kiri dan tidak, misal :
Rekursif kiri : A A1 | A2 | A3 | …. | An
Bukan Rekursif kiri : A 1 | 2 | 3 | …. | m
Lalu tentukan 1 , 2 …. n dan 1 , 2 …. m dari setiap aturan produksi yang memiliki simbol ruas kiri
yang sama.
Lakukan penggantian aturan produksi yang rekursif kiri.
1. A 1Z | 2Z | …. | mZ
2. Z 1 | 2 | …. | n
3. Z 1Z | 2Z | …. | nZ
Hasil akhir berupa aturan produksi ditambah dengan aturan produksi semula yang tidak rekursif kiri.
Contoh 5
Tata bahasa bebas konteks :
S Sab | aSc | dd | ff | Sbd
Langkah Pengilangan rekursif kiri
1. Pisahkan
Rekursif kiri
Bukan Rekursif kiri
: S Sab | Sbd
: S aSc | dd | ff
=> 1 = ab, 2 = bd
=> 1 = aSc, 2 = dd, 3 = ff
Contoh 5 (Lanjutan)
2. Lakukan pergantian
S aScZ | ddZ | ffZ
Z ab | bd
Z abZ | bdZ
3. Hasil akhir yang didapat
S aSc | dd | ff
S aScZ | ddZ | ffZ
Z ab | bd
Z abZ | bdZ
Kelemahan Metode Brute Force
Mencoba untuk semua aturan produksi yang ada sehingga menjadi
lambat (rentang waktu eksekusi tidak jelas)
Mengalami kesukaran untuk melakukan pembetulan kesalahan
Memakan banyak memori, karena perlu mencatat (backup) lokasi
backtrack
Grammar yang memiliki Rekursif Kiri tidak bisa diperiksa, maka harus
diubah dulu sehingga tidak rekursif kiri, Karena rekursif kiri akan
mengalami Loop yang terus-menerus
Parsing dengan Recursive Descent Parser
Salah satu cara untuk mengaplikasikan bahasa bebas konteks untuk
melakukan analisa sintaksis suatu source code
Pada tahap ini, simbol terminal maupun simbol non-terminal (variabel)
sudah bukan sebuah karakter, tetapi berupa besaran leksikal sebagai
simbol terminalnya dan besaran sintaks sebagai simbol non-terminal
(variabel).
Parsing dengan Recursive Descent Parser
Ciri dari RDP yang menonjol secara rekursif menurunkan semua variabel
dari awal sampai bertemu terminal dan tidak pernah mengambil token
secara mundur.
Ciri lain dari RDP adalah sangat bergantung pada algoritma scan dalam
mengambil token.
Contoh 6
Apabila t_ASS (:=) diartikan oleh scanner sebagai t_COL (:) dan t_E (=),
maka parser tidak dapat mengenali bahwa itu sebenarnya adalah t_ASS,
Untuk itu, apabila ingin menggunakan RDP, maka disarankan untuk
menggunakan scanner yang “dapat dipercaya”.
Contoh 7
Sebuah grammar memiliki aturan produksi sebagai berikut :
::= t_PROG t_ID t_SEMICOL t_DOT
::= t_BEGIN {t_SEMICOL } t_END
::= t_ID t_ASS | t_IF t_THEN |
t_IF t_THEN t_ELSE
::= t_EQ | t_LT
| t_GT
Dan seterusnya….
Contoh 7 (lanjutan)
Contoh 7 (lanjutan)
Contoh 7 (lanjutan)
Latihan
Lakukan parsing dengan metode brute force, untuk mendapatkan string
‘adssfd’ dari :
S aAd | Ba | cd
A b | c | Bf
B aef | dss
Latihan
Lakukan penghilangan rekursif kiri dari :
A Abc | cd | Afg | Ai | d