Syntax Analyzer (Parser) - Dasar Sigit Widiyanto, ST., MMSi., MSc
Syntax Analyzer Pengelompokan token-token kedalam class syntax (bentuk syntax), seperti procedure, statement dan 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
Syntax Analyzer 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
Posisi Parser dalam Kompilator
Ketentuan dalam Parser 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. Kesalahan sintaks : terjadi jika pola deretan token tidak memenuhi ketentuan pola yang telah ditentukan grammar untuk parser.
Hal yang Penting!!! Scanner: Regular Grammar (RG) Parser: Grammar Context Free (CFG). 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.
Hal yang Perlu diperhatikan dalam CFG Pola umum CFG : A , A VN, (VN VT )* 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.
Syntax tree Pohon sintaks/ Pohon penurunan (syntax tree/ parse tree) beguna untuk menggambarkan bagaimana memperoleh suatu string dengan cara menurunkan simbol-simbol variable menjadi simbol-simbol terminal. Misalnya: S AB A aA | a B bB | B Penurunan untuk menhasilkan string aabbb
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 terdapat ingin dihasilkan string aabbaa dari Context free language: S a AS | a, A SbA | ba
Proses Penurunan (Derivasi) Penurunan kiri : S => aAS => aSbAS => aabAS => aaabbaS => aabbaa Penurunan kanan : S => aAS => aAa => aSbAa => aSbbaa => aabbaa
Latihan Parsing Diketahui: S -> aB | bA A -> a | aS |bAA B -> b | bS | aBB Penurunan untuk string aaabbabbba Berikan solusi untuk derivasi dan analisis sintaksnya.
Solusi Misalnya: S -> aB | bA A -> a | aS |bAA B -> b | bS | aBB Penurunan untuk string aaabbabbba Dalam hal ini perlu untuk melakukan percobaan pemilihan aturan produksi yang bisa mendapatkan solusi.
Contoh Parsing Lanj. Diketahui grammar G = {I HI HIA, H abc...z, A 012...9} dengan I adalah simbol awal. Bagaimanakah analisa sintaks untuk kalimat x23b.
Solusi Diketahui grammar G = {I HI HIA, H abc...z, A 012...9} dengan I adalah simbol awal. Bagaimanakah analisa sintaks untuk kalimat x23b.
Metode Parsing Perlu memperhatikan 3 hal: Bottom-Up Waktu Eksekusi Metode ini melakukan penelusuran dari leaf ke root Penanganan Kesalahan Penanganan Kode LR(k) Presedence Parser Parsing digolongkan menjadi: Top-Down Penelusuran dari root ke leaf atau dari simbol awal ke simbol terminal metode ini meliputi: Backtrack/backup : Brute Force No backtrack : Recursive Descent Parser
S if E then Sif E then S else S, Ambiguitas Sebuah kalimat adalah ambigu jika terdapat lebih dari satu pohon sintaks yang dapat dibentuk oleh kalimat tersebut. Secara gramatikal kalimat ambigu dihasilkan oleh grammar ambigu yaitu grammar yang mengandung beberapa produksi dengan ruas kiri yang sama sedangkan dua atau lebih ruas kanan-nya mempunyai string terkiri (prefix) yang sama. Contoh : S if E then Sif E then S else S, Dimana S : statement dan E : expression,
Ambiguitas Lanj. Grammar ambigu dapat diperbaiki dengan metoda faktorisasi kiri (left factorization). Prefix dari produksi di atas adalah sentensial if E then S sehingga faktorisasi akan menghasilkan : S if E then S T, T else S { : simbol hampa}
Contoh Lain Ambiguity Diketahui grammar G = {S SOSA , O *+, Kalimat : 2*3+7 mempunyai dua pohon sintaks berikut :
Rekursif Kiri (Left Recursion) Sebuah grammar dikatakan bersifat rekursi kiri jika untuk sebuah simbol nonterminal A terdapat derivasi non hampa A A. Produksi berbentuk A A disebut produksi yang bersifat immediate left recursion.
Rekursif Kiri (Left Recursion) Rekursi kiri dapat dieliminir dengan transformasi berikut : A A transformasi menjadi A R, R R Transformasi ini dapat diperluas sehingga : A A 1A2 ... An 1 2... n bertransformasi menjadi : A 1R2R...n R, R 1 R2 R..n R
Contoh Diketahui : E E + T T, T T * F F, F (E) I yang jelas mengandung immediate left recursion untuk simbol E dan T. Transformasi menghasilkan : E TRE, RE +TRE , T FRT, R *FRT , F (E) I
Tugas Diketahui : S Aab, A AcS d