You are on page 1of 17

j

( ANALISIS SINTAKSIS

Analis Sintaksis (Syntax Analyser) adalah bagian kedua dari compiler yang bertugas memeriksa kebenaran dan urutan dari token-token yang terbentuk oleh lexical analysis. Tugas dari syntax analyser adalah :

I
• Sebuah pohon (tree) adalah suatu graph
terhubung tidak sirkuler, yang memiliki satu
simpul (node) / vertex disebut akar (root) dan dari
situ memiliki lintasan ke setiap simpul.
• Pohon sintaks / pohon penurunan (syntax tree /
derivation tree / parse tree) berguna untuk
menggambarkan bagaimana memperoleh suatu
string (untai) dengan cara menurunkan simbol-
simbol variabel menjadi simbol-simbol terminal.
Setiap simbol variabel akan diturunkan menjadi
terminal, sampai tidak ada yang belum
tergantikan.
I • Pengelompokan token-token kedalam class syntax (bentuk syntax), seperti procedure, Statementdan expression

• Grammar: sekumpulan aturan-aturan, untuk mendefinisikan bahasa sumber

• Grammar dipakai oleh syntax analyser untuk menentukan struktur dari

program sumber

• Proses pen-deteksian-nya (pengenalan token) disebut dengan parsing

• Maka Syntax analyser sering disebut dengan parser

• Pohon sintaks yang dihasilkan digunakan untuk semantics analyser yang bertugas untuk menentukan 'maksud' dari program sumber, misalnya operator penjumlahan maka semantics analyser akan mengambil aksi apa yang harus dilakukan

'"----l

1

Terdapat statement: ( A + B ) * ( C + D )

Akan menghasilkan bentuk sintaksis: <factor>, <term> & <expression>

< Expression>

<Term>

*

<term>

-:

<factor>

<Factor>

I

( <expression> )

~

<Expression> + <term>

I

( <Expression> )

~

<Expression> + <term>

<term>

<fractor>

I

<term> <factor>

I I

<factor> B

I

<factor>

I

I

D

c

I
• Kesalahan sintaks : terjadi jika pola deretan token tidak
memenuhi ketentuan pola yang telah ditentukan
grammar untuk parser. Grammar yang dipilih untuk
scanner adalah Regular Grammar (RG) sedangkan
untuk parser adalah Grammar Context Free (CFG).
Penting diketahui perbedaan cara pandang RG
dengan CFG terhadap sebuah token yang mengalir
antara scanner dan parser. Bagi RG (scanner) sebuah
token (kecuali reserve word) adalah sebuah kalimat
dimana setiap karakter pembentuk token tersebut
adalah simbol terminal. Sebaliknya bagi CFG (parser)
sebuah token adalah sebuah simbol terminal dimana
sederetan tertentu token akan membentuk sebuah
kalimat.
I I

( Posisi Parser dalam Kompilator I

l~ ~j

~

Deretan token

Parser

Po han Parse (Parse Tree)

Kesalah! Sintaks (sintax errors)

• Deretan token: dihasilkan oleh Penganalisa Leksikal (Scanner)

• Pohon parse: suatu pohon dimana akarnya (root) adalah simbol awal grammar (starting symbol), setiap node dalam (inner node) adalah simbol nonterminal, dan daunnya (leaf) dibaca dari kiri ke kanan adalah deretan token masukan. Pohon parse ini dibentuk berdasarkan aturan grammar yang ditetapkan untuk parser.

I

j
Regular Grammar
• Bahasa regular adalah penyusun ekspresi regu/er (ER)
• Ekspresi reguler terdiri dari kombinasi simbol-simbol atomik
menggunakan 3 operasi yaitu :
- katenasi,
- alternasi, dan
- repetisi Iclosure
• Pada kasus scanner, simbol-simbol atomik adalah karakter-
karakter di dalam program sumber.
• Dua buah ekspresi regular adalah ekuivalen jika keduanya
menyatakan bahasa yang sama 2

I
[Operasi Regular - Katenasi J
• Katenasi Ikonkatenasi atau sequencing disajikan
dengan physical adjacency
- e.g. ekspresi regular '<letter> <digit>' bentuk
penyajian sederhana (diasumsikan sebagai definisi
yang jelas dari letter dan digit) komposisi terurut
dari letter diikuti dengan digit
» "<" dan ">" digunakan untuk mengidentifikasi
simbol-simbol yang merepresentasikan simbol-
simbol spesifik (menggunakan ekspresi regular)
» Kita bisa menggunakan "::=" (ekivalensi) untuk
menggabungkan ekspresi regular yang didefinisikan
denoan <letter> dan <dicit>
I I

Operasi Regular - Repetisi

• Terakhir, repetisi membolehkan ekspresi dari kontruksi yang diulang beberapa kali

• Terdapat 2 operator yang digunakan yaitu

superscript '+' dan superscript ,*,

- E.g. <word> ::= <Ietter>+

» this implies a word consists of one or more letters (* would imply zero or more letters and a word must have at least one letter so we use +)

I
[Operasi Regular - Alternasi J
I
• Alternasi membolehkan pilihan dari beberapa pilihan
dan biasanya disajikan dengan operator 'I'
- E.g. <digit> ::= 0 11 12 1 3 14 1 5 1 6 1 7 1 8 1 9
» contoh yang menggunakan juga operator ekivalensi
• Bentuk tulisan cepat tertentu juga biasanya digunakan
dengan alternasi (khususnya ellips)
- E.g. <letter> ::= alb 1 ... 1 z 1 AlB 1 ... 1 z
» Can use the ellipses (" ... ") when a sequence is well
defined
I j

CONTEXT-FREE GRAMMAR (CFG) dan PARSING

• Bentuk umum produksi CFG adalah : a ~ ~, a E V N, ~ E (V N I V T)*

• Analisis Sintaks :

Penelusuran sebuah kalimat (sentensial) sampai pada simbol awal grammar. Analisis sintaks dapat dilakukan melalui derivasi atau parsing. Penelusuran melalui parsing menghasilkan pohon sintaks.

3

I
• Contoh :
Diketahui grammar G = {I ~ H II HilA, H ~ a I b I c I ... 1 z, A ~
011 121 ... 19}
dengan I adalah simbal awal.
Berikut ini kedua cara analisa sintaks untuk kalimat x23b.
cara 1 (derivasi) cara 2 (parsing)
I => IH I 'A.H
=> IAAH ~
HAAH I H
~ I
=> xAAH I A b
=> x2AH ~ I
=> x23H I A 3
I I
=> x23b H 2
I
x
I I
• Contoh:
Diketahui grammar G = {S ~ SOS 1 A, 0 ~ * 1 +, A ~ 011 121 ... 19}
Kalimat: 2*3+7 mempunyai dua pohon sintaks berikut :
S S
./'I---_ ~
S 0 S S 0 s
I I ~ ~ I I
A :I: S 0 S S 0 S + A
I I I I I I I I
2 A + A A :I: A 7
I I I I
3 7 2 3
Sebuah kalimat yang mempunyai lebih dari satu pohon sintaks
disebut kalimat ambigu (ambiguous). Grammar yang menghasilkan
paling sedikit sebuah kalimat ambigu disebut grammar ambigu.
I s

Syntax tree

• Pohon sintaksj Pohon penurunan (syntax treej parse tree) beguna untuk menggambarkan bagaimana memperoleh suatu string dengan cara menurunkan simbol-simbol variable menjadi simbol-simbol terminal.

• Misalnya:

5 -1 AB

A -1 aA I a B-1 bB I B

S~AB

A ~ aA I a B ~ bB I B

A

B
»<.
b B
-<:
b B
I
b a

->:

A

a

Penurunan untuk menghasilkan string aabbb

4

I

Parsing atau Proses Penurunan Parsing dapat dilakukan dengan cara :

• Penurunan terkiri (leftmost derivation) : simbol variable yang paling kiri diturunkan (tuntas) dahulu

• Penurunan terkanan (rightmost derivation): variable yang paling kanan diturunkan (tuntas) dahulu

• Misalkan:ingin dihasilkan string aabbaa dari

• context free language:

S---7aASla, A ---7 SbA I ba

• Penurunan kiri: 5 => aAS

=> aSbAS => aabAS => aabbaS => aabbaa

• Misalnya:

S -.'> aB I bA

A -> a I as I bAA B -c- bibS I aBB

S

a

.r >: .r >;

B B b S

1 I~

b b S

/1

B

J

b

a

Penurunan untuk string aaabbabbba

Dalam hal ini perlu untuk melakukan percobaan pemilihan aturan produksi yang bisa mendapatkan solusi

'----l

j

• Penurunan kanan 5 => aAS
=> aAa
=> aSbAa
=> aSbbaa
=> aabbaa A

1

a

j

Metode Parsing

Proses Parsing merupakan tahapan analisis sintaksis yang berguna untuk memeriksa urutan kemunculan token. Di dalam mengimple-mentasikan sebuah metode parsing ke dalam program perlu diperhatikan tiga hal sebagai berikut :

«Rentanq waktu eksekusi

«Penanqanan kesalahan

«Penanqanan kode

5

Metode Parsing bisa digolongkan sebagai berikut:

1. Top Down

Kalau dilihat dari terminologi pohon penurunan, metode ini melakukan penelusuran (Parsing) dari rootlpuncak menuju ke leaf/daun (simbol awal sampai simbol terminal / simbol awal S sampai kalimat x ). Metode Top Down sendiri meliputi:

a. Backtrack / Backup: Brute Force

b. No Backtrack: Recursive Descent Parser

2. Bottom Up

Metode ini melakukan penelusuran dari leaf / daun menuju ke root / puncak (dari kalimat x sampai simbol awal S)

I

Metoda Recursive-Descent

• Kelas metoda tanpa backup, termasuk metoda recursive descent, adalah kelas metoda parsing yang tidak menggunakan produksi alternatif ketika hasil akibat penggunaan sebuah produksi tidak sesuai dengan simbol input. Jika produksi A mempunyai dua buah ruas kanan atau lebih maka produksi yang dipilih untuk digunakan adalah produksi dengan sirnbol pertarna ruas kanannya sarna dengan input yang sedang dibaca. Jika tidak ada produksi yang demikian maka dikatakan bahwa parsing tidak dapat dilakukan.

j
Metoda Brute-Force

Kelas metoda dengan backup, termasuk metoda
Brute-Force, adalah kelas metoda parsing yang
menggunakan produksi alternatif, jika ada, ketika
hasil penggunaan sebuah produksi tidak sesuai
dengan simbol input. Penggunaan produksi sesuai
dengan nomor urut produksi. j

Metoda Recursive-Descent

• Ketentuan produksi yang digunakan metoda recursive descent adalah : Jika terdapat dua atau /ebih produksi dengan ruas kiri yang sama maka karakter pertama dari semua ruas kanan produksi tersebut tidak bo/eh sama. Ketentuan ini tidak melarang adanya produksi yang bersifat rekursi kiri.

6

J
Parsing Bottom-Up
• Salah satunya adalah grammar preseden sederhana (GPS).
• Pengertian Dasar
- Jika a dan x keduanya diderivasi dari sirnbol awal grammar tertentu,
maka a disebut sentensial jika a E (V I V)*, dan x disebut kalimat
jika x E (V)*
- Misalkan a = Q1~ Q2 adalah sentensial dan A E VN :
~ adalah Frase dari sentensial a jika :
S => ... => Q1 a Q2 dan a=> ... => ~
~ adalah simple Frase dari sentensial a jika :
S => ... => Q1 a Q2 dan a => ~
Simple frase terkiri dinamakan handel
frase, simple frase, dan handel adalah string dengan panjang ;:: 0 I
Contoh:
I => I H
=> H H
=> H b
Hb adalah sentensial dan b adalah simple frase
(dibandingkan dengan Q1~Q2 maka Q1= H, ~ = b, dan Q2= E)
Perhatikan : simple frase (b) adalah yang terakhir diturunkan
I => I H
=> I b
=> H b
Hb adalah sentensial dan H adalah simple frase
(dibandingkan dengan Q1~ Q2 maka Q1= E, ~ = H, dan Q2= b)
Perhatikan : simple frase (H) adalah yang terakhir diturunkan
• Sentensial Hb mempunyai dua simple frase (b dan H), sedangkan
handelnya adalah H.
I I
Parsing dengan Brute Force
• Memilih aturan produksi mulai dari paling kiri
• 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
untuk setiap simbol non terminal. I

Contoh, suatu bahasa dengan aturan produksi:

S -7 aAd I aB A-7blc

B -7ccd I ddc

• Misal ingin dilakukan parsing untuk string 'aced'

(i)

(ii)~

(iii) S

/1~

S

d

a

A

d

A

a

b

Terjadi kegagalan (iii), dilakukan back track ._____,

7

I
(iv) S (v) S (vi) S
~ .>: /~
a A d a B a B
I ~
c c c d Terjadi kegagalan lagi (iv), dilakukan back-track

....__

j
Contoh pada Brute-Force
Terdapat grammar/tata bahasa G = (V,T,P,S), dimana :
V=("E","T","F") Simbol NonTerminal (variable)
T=("i" ,"*" ,"I" ,"+" ,"-") Simbol Terminal
S="E" Simbol Awal I Start Simbol
String yang diinginkan adalah i * i
Aturan produksi (P) yang dicobakan adalah :
1. E-7TIT+EIT-E
T-7FIF*TIF/T
F -7 i
Accept (diterima)
I j

Kelemahan dari Metode-metode BruteForce

• Mencoba untuk semua aturan produksi yang ada sehingga menjadi lambat (waktu eksekusi)

• Mengalami kesukaran untuk melakukan

pembetulan kesalahan

• Banyak memakan memori, karena membuat backup lokasibacktrack

• Grammar yang memiliki Rekursif Kiri tidak bisa diperiksa, sehingga harus diu bah dulu sehingga tidak rekursif kiri, karena rekursif kiri akan mengalamai Loop yang terus-menerus

j
2. E-7TIE+TIE-T
T-7FIT*FIT/F
F -7 i
accept (diterima)
Meskipun ada rekursif kiri, tetapi tidak diletakkan sebagai aturan
yang paling kiri.
3. E-7E+TIE-TIT
T-7T*FIT/FIF
F -7 i
Rekursif kiri, program akan mengalami loop, karena sebelum bisa
memeriksa string atau aturan produksi yang lain, terus menerus
menurunkan aturan produksi pertama (yang paling kiri)
4. E-7T+EIT-EIT
T-7F*TIFITIF
F -7 I
accept (diterima) 8

J

Aturan Produksi Rekursif

Aturan produksi yang rekursif memiliki ruas kanan (hasil produksi) yang memuat simbol variabel pada ruas kiri.

Sebuah produksi dalam bentuk A -7 j3A

merupakan produksi rekursif kanan.

j3=(V u T)* atau kumpulan simbol variabel dan terminal.

~
Contoh Contex Free Grammar dengan aturan produksi
yang rekursif kiri
S -7 aAc
s
A -7 Ab I E ~
a A c
.>.
A b
/~
A b
/~
A b
I I
Contoh aturan produksi yang rekursif kanan :
S -7 dS
B -7 adB
Produksi dalam bentuk : A -7 Aj3 merupakan aturan
produksi yang rekursif kiri. Contohnya :
S -7 Sd
B-7 Bad
Produksi yang rekursif kanan menyebabkan pohon
penurunan tumbuh ke kanan, sebaliknya produksi yang
rekursif kiri menyebabkan pohon penurunan tumbuh ke
kiri.
I j

Dalam Banyak penerapan tata-bahasa, rekursif kiri tidak diinginkan, Untuk menghindari penurunan kiri yang looping, perlu dihilangkan sifat rekursif, dengan langkah-langkah sebagai berikut:

• Pisahkan Aturan produksi yang rekursif kiri dan yang tidak; misalnya Aturan produksi yang rekursif kid

A ~ A a1 I A a2 I ... I A an

Aturan produksi yang tidak rekursif kiri A ~ 131 I 132 I ... I I3n

• lakukan per-gantian aturan produksi yang rekursif kiri, sebagai berikut: 1. A ~ 131 Z I 132 Z I ... I I3n Z

2 Z ~ a1 I a2 I ... I an

3 Z ~ a1 Z I a2 Z I ... I an Z

~

9

• Pergantian dilakukan untuk setiap aturan produksi dengan simbol ruas kiri yang sama, bisa muncul varia bel Zl, Z2 dst, sesuai dengan varia bel yang menghasilkan rekurisif kiri

Contoh: Tata Bahasa Context free

S ---; Sab I aSc I dd I ff I Sbd

• Pisahkan aturan produksi yang rekursif kiri 5 ---; Sab I Sbd

Ruas Kiri untuk S: al=ab , a2=bd

• Aturan Produksi yang tidak rekursif kiri S ---; aSc I dd I ff

dari situ didapat untuk Ruas Kiri untuk S: ~l = aSc, ~2 = dd, ~3= ff

I

• Langkah berikutnya adalah penggantian yang rekursif kiri S ---7 Sab I Sbd, dapat digantikan dengan

1. S ---; aScZl I ddZll ffZl

2. Zl ---; ab I bd

3. Zl ---; abZll bdZl

• Hasil akhir yang didapat setelah menghilangkan rekursif kiri adalah sebagai Berikut:

S ---; aSc I dd I ff

S ---; aScZl I ddZl I ff Zl

Zl ---; ab I bd

Zl ---; abZll bdZl

---,

• Kalau pun tidak mung kin menghilangkan rekursif kiri dalam penyusunan aturan produksi maka produksi rekursif kiri diletakkan pada bagian belakang atau terkanan, hal ini untuk menghindari looping pada awal proses parsing

• Metode ini jarang digunakan, karena semua kemungkinan harus ditelusuri, sehingga butuh waktu yang cukup lama serta memerlukan memori yang besar untuk penyimpanan stack (backup lokasi backtrack)

• Metode ini digunakan untuk aturan produksi yang memiliki alternatif yang sedikit

....__

j

PARSING DENGAN RECURSIVE DESCENT PARSER

• Recursive Descent Parser adalah salah satu cara untuk mengaplikasikan Bahasa Bebas Konteks (Context Free Grammar) untuk melakukan analisis sintaksis suatu source code.

• Pad a Recursive Descent Parser, simbol terminal maupuan simbol variabel sudah bukan sebuah karakter, tetapi berapa besaran leksik sebagai simbol terminalnya dan besaran sintaks sebagai simbol variabelnya.

10

• Ciri dari Recursive Descent Parser yang menonjol adalah secara rekursive menurunkan semua variabel dari awal sampai bertemu terminal dan tidak pernal mengambil token secara mundur (no back- track), berbeda dengan mesin Turing yang dapat maju dan mundur dalam melakukan parsing.

• Ciri lain dari Recursive Descent Parser adalah sangat bergantung apda algoritma scan dalam mengambil token.

Contoh : Apabila t_ASS (:=) diartikan oleh Scanner sebagai t_COL (:) dan t_EG (=), maka parser tidak akan dapat mengenali bahwa itu sebenarnya adalah t_ASS. Untuk itu, apabila ingin menggunakan recursif descent parser, maka disarankan untuk menggunakan scanner yang "dapat dipercaya".

I
• Awalnya Recursive Descent Parser dapat mengandung
back tracking. Contoh :
S -7 cAd
A -7 ab I a
Dengan string masukan w = cad untuk membangun
sebuah pohon parser bagi string ini secara top-down,
mula-mula suatu pohon yang mengandung node
tunggal S diciptakan. Pointer input menunjuk ke c,
simbol pertama dari w. Lalu dengan menggunakan
produksi pertama dari S untuk mengekspansi pohon
tersebut.
I j
• Dengan menuliskan grammar secara hati-hati, sifat left
recursive dari grammar dihilangkan, serta melakukan
left factoring untuk grammar yang dihasilkan, akan
dapat diperoleh suatu grammar yang dapat diparse
oleh recursive descent parser yang tidak memerlukan
back tracking, yaitu predictive parser.
• Recursive Descent Parser adalah Non-back tracking
recursive descent parser, yaitu predictive parser,
atau one-pass no-back-tracking parser. Lebih
khusus lagi metode parser yang digunakan adalah
LL(1) parser, sesuai dengan sifat-sifat proses parsing
yang dilakukannya, yaitu memparsing satu simbol no
terminal dengan metoda top down parsing yang
tidak mengandung left recursive. j
Predictive Parser
Berikut ini adalah model dari Predictive Parser.
INPUT • I··· I a I + I b I ... $ I

S!#;ck T
X Predictive Parsing ~ OUTPUT
~ Program (P3) ,.
Z 1
.~.
rn

Parsing Table M 11

I
• Input: rangkaian token dan diakhiri dengan tanda
$.
• Stack: berisi simbol grammar (VN atau VT). Pada
keadaan awal stack hanya berisi $ dan S (simbol
awal).
• Parsing Table M : array 2 dimensi M(A,a), dimana
A adalah simbol nonterminal dan a adalah simbol
terminal (token) atau simbol $. Nilai M(A,a) adalah :
sebuah produksi A ----+ a atau ta n d a - ta n d a
kesalahan
• Predictive Parsing Program (P3) : sebuah program
yang mengendalikan parser berdasarkan nilai A
dan a.
I I

Parsing Table M

• Parsing Table M dibentuk berdasarkan dua fungsi yang berhubungan dengan suatu tata bahasa. Kedua fungsi tersebut adalah First(X), X E (VN I VT ) dan Follow(Y), Y E V N.

• First(X) adalah himpunan simbol terminal yang merupakan simbol pertama dari X atau merupakan simbol pertama dari simbol-simbol yang dapat diturunkan dari X.

• Follow(Y) adalah himpunan simbol terminal yang dapat muncul tepat di sebelah kanan Y melalui nol atau lebih derivasi.

I

Sifat dan tanggapan P3 terhadap simbol A (pada stack) dan a (pada input) :

1. Jika A = a = $ : parser berhenti dan memberitahukan bahwa kerja parser telah selesai tanpa ditemukan kesalahan sintaks.

2. Jika A = a -:j:. $ : parser akan mengeluarkan A dari stack, dan selanjutnya membaca token berikutnya.

3. Jika A E VT ' A -:j:. a : terjadi kesalahan sintaks, dan selanjutnya akan dipanggil routine penanganan kesalahan (error handler).

4. Jika A E VN : program akan membaca tabel M(A,a). Jika M(A,a) berisi produksi A- UVW maka parser akan mengganti A dengan WVU (yaitu dengan U berada di puncak stack). Jika M(A,a) berisi tanda-tanda kesalahan maka parser akan memanggil Error_Handler routine.

I
Ketentuan selengkapnya tentang First(X) dan Follow(Y)
adalah sebagai berikut.
a. First(X)
a1. Jika X E VT maka First(X) = {X}
a2. Jika terdapat X _ aa maka a E First(X). Jika X _ £
maka £ E First(X)
a3. Jika X_ Y1 Y2 ... Y k maka First(Y 1 ) C First(X). Jika
ternyata Y 1 dapat menderivasi £ (sehingga £ E
First(Y1 )) maka First(Y2 ) juga subset dari First(X).
Jelaslah jika semua First(Yj ) mengandung £ , i = 1,
2, ... , n, maka semua elemen First(Y j) adalah juga
elemen First(X).
I 12

I
b. Follow(X)
b1. Jika X = S = simbol awal maka $ E Follow(S)
b2. Jika X ~ aYI3, 13 -:j: £ , maka {First(l3) - {£}} C
Follow(Y)
b3. Jika 1. X ~ aY atau 2. X ~ aYI3 dimana £ E First(l3)
maka Follow(X) C Follow(Y). Grammar LL(1)

Grammar yang bagus adalah grammar yang mempunyai nilai tunggal untuk setiap sel M(A,a) pad a Parsing Tab/e. Tetapi sayangnya tidak semua grammar bersifat bag us.

Untuk mengetahui syarat-syarat grammar yang bagus perhatikan tiga contoh grammar berikut, ketiganya mengandung dua produksi dengan pola A~all3:

I
Dengan kedua fungsi First(X) dan Follow(X) di atas maka
Parsing Table M disusun melalui algoritma berikut :
Algoritma Parsing_ Table
1. for setiap produksi A ~ a do begin
1a. for setiap a E First(a) do
M(A, a) = A ~ a
1b. if £ E First(a) then
for setiap b E Follow(A) do
M(A,b)=A~a
1c. if (e E First(a)) and ($E Follow(A) then
M(A, $) = A ~ a
end
2. if M(A, a) = blank then M(A, a) = error
j 1
1.01 = {A ~ aBc 1 aCb, B ~ b, C ~ c}
{A ~ a 113 ¢:} A ~ aBcD aCb}
a. Dari : A ~ aBc, maka First(a = aBc) = {a} dan
M(A,a) = A ~ aBc
b. Dari : A ~ aCb, maka First(13 = aCb) = {a} dan
M(A,a) = A ~ aCb
Dari (a) dan (b) diperoleh : M(A,a) = {A ~ aBc,
A ~ aCb} atau :
a
A A~aBc
A~aCb 13

I

2.02 =



{S ~ A I B, A~ a I £ , B ~ b I £ } {A ~ a I 13 ¢> S ~ A I B}

a. Dari A~ £ , maka £ E First(A). Karena S ~ A harus diselidiki Follow(S).

Karena S adalah simbol awal, maka $ E Follow(S) Dari keduanya diperoleh : M(S, $) = S ~ A

b. Dari B~ £ , maka £ E First(B).

Karena S ~ B harus diselidiki Follow(S). Karena S adalah simbol awal, maka $ E Follow(S).

Dari keduanya diperoleh : M(S, $) = S ~ B

Dari (a) dan (b) diperoleh : M(S, $) = { S ~ A, S ~ B}

atau:

$

~
Sekarang kita analisa mengapa pada ketiga contoh di atas
M(A, a) tidak bernilai tunggal. Sifat-sifat produksi pada masing-
masing contoh (yaitu produksi yang berpola A ~ a I 13) adalah :
1. A ~ aBc I aCb : mempunyai satu sifat :
First(aBc) = Fisrt(aCb) = {a}
2. S ~ A I B : mempunyai satu sifat :
A dan B bisa menurunkan simbol £
3. S' ~ eS I £ : mempunyai dua sifat :
sifat pertama adalah £ bisa menurunkan simbol s, dan
sifat kedua adalah e E First(eS) dan juga e E Follow(S')
Agar sebuah grammar selalu mempunyai nilai M(A,a) yang
tunggal maka tentu saja grammar tersebut tidak boleh memiliki
sifat-sifat yang dimiliki oleh ketiga contoh grammar di atas.
I I
3.03 = {S ~ iEtSS' I a, S'~ Es I e , E ~ b}
{A ~ a I 13 ¢> s' ~ eS I £ }
a. Dari : S' ~ eS , maka e E First(S') sehingga
• M(S', e) = S'~ eS
b. Dari S'~ £ , maka £ E Firstte), selanjutnya harus diteliti
Follow(S'). Dari : S'~ eS , maka Follow(S') c
Follow (S) dari : S ~ iEtSS' (Iihat suku SS'), maka
Follow(S) = First{S'} - {£} = {e}
Dari keduanya diperoleh : M(S', e) = S'~ £
Dari (a) dan (b) diperoleh : M(S', e) = {S'~ eS, S'~ s)
atau:
$
S S~eS
S~£
I ~
Secara formal grammar yang bagus tersebut harus
bersifat:
Untuk setiap produksi berbentuk A ~ a 113 maka :
• 1. First( a) n First(l3) = {}
2. If a => ... =>£ then 13 => ... => notre)
3. If c=e ... =e and a E First(l3) then a Et Foliow(A)
Grammar yang mempunyai ketiga sifat di atas
dinamakan grammar LL(1), singkatan dari scanning the
input from Left to right for producing Leftmost derivation
using 1 (one) input symbol of lookahead at each step to
making parsing action decision.
I 14

I
Untuk mengimplementasikan aturan-aturan produksi
memakai teknik Recursive Descent dengan aturan
sebagai berikut :
• Semua simbol variabel dijadikan prosedur/fungsi.
• Jika ketemu simbol terminal pada aturan produksi,
maka panggil prosedur Scan.
• Jika ketemu simbol variabel pada aturan produksi,
maka panggil prosedurnya.
Bisa dilihat :
• Penelusuran bersifat Top Down (turun) mengikuti
sintaks sesuai pola yang tertera pada diagram sintaks.
• Karena memakai prosedur yang rekursif maka dipakai
rekursif stacking yang hampir sama dengan Top Down
Parsing metode Brute Force dengan limited back up. I
• Metode Recursive Descent adalah salah satu metode
parsing tanpa backup. Pada metoda ini urutan produksi
direalisasikan dengan menggunakan urutan dari
pemanggilan dari fungsi/prosedur.
• Fungsi/prosedur ditulis untuk setiap non terminal dari
suatu produksi. Setiap fungsi prosedure akan
melemparkan nilai benar atau salah bergantung pada
apakah fungsi tersebut menenali substring yang
diterima sebagai ekspansi dari non terminal.
Contoh Grammar memiliki aturan produksi :
<program> ::= t_PROG t_ID t_SEMICOL <block> t_DOT
<block> .. _ t_BEGIN <statement> { t_SEMICOL
<statement> } t_END
_1 j
Contoh Grammar memiliki aturan produksi :
<program> ::= t_PROG t_ID t_SEMICOL <block> t_DOT
<block> .. _ t_BEGIN <statement> { t SEMICOL
<statement> } t_END
<statement> ::= t_ID t_ASS <simple_exp> I t_IF <exp>
t_ THEN <statement> I t_IF <exp> t_ THEN <statement>
t ELSE <statement>
<exp> .. _ <simple_exp> t_EQ <simple_exp> I
<simple_exp> t_L T <simple_exp> I <simple_exp> t_GT
<simple_exp>
dan seterusnya ...
Maka jika akan membuat prosedurnya adalah sebagai
berikut: j
Procedure Program;
Begin
Scan;
If token=t_ID then
Begin
If token=t_SEMICOL then
Begin
Scan;
Block; {panggil prosedur Block}
If token = t_DOT the
Begin
Scan;
End;
End;
End;
End;
.1 15

I
Procedure Block;
Begin
If token=t BEGIN then
Begin
Scan;
Statemen; {panggil prosedur Statement}
While token=t SEMICOL do
Begin
Scan;
Statement; {ulang panggil prosedur statement}
End;
If token = t_END then Scan;
End;
End; I
Procedure Statement;
Begin
If token=t 10 then
Begin
Scan;
If token=t_ASS then
Begin
Scan;
Simple_exp; {panggil prosedur simple_exp}
End;
else j
If token = t_IF then
Begin
Scan;
Exp;
If token=t_ THEN then
Begin
Scan;
Statement;
If token=t_ELSE then
Begin
Scan;
Statement;
End;
End;
End;
End; j
Procedure Exp;
Begin
simple_exp;
If (token=t_EQ) OR (token=t_L T) OR (token=t_GT) then
Begin
Scan;
simple_exp;
End;
End; 16

J
Beberapa hal yang diperhatikan pada program di
atas:
• Dalam penanganan error; cukup dilakukan
proses halt dengan pemberian pesan kesalahan
sebelumnya .
• Beberapa kesalahan yang mung kin adalah :
- Jika kesalahan akibat token tak dikenal
- Jika kesalahan akibat token tidak pada tempat yang
seharusnya. 17

You might also like