Mempelajari struktur program dan tiap-tiap statement. Sebagai contoh, diberikan program loop seperti pada materi Lexical Analysis. Tahap ini akan mengenali bahwa 1 adalah counter loop dengan batas awal 1 dan batas akhir max, dan lainnya.
Pada tahap ini juga dideteksi kesalahan tulis, misalnya tertulis x[i :=0, maka parser akan mengetahui bahwa pernyataan tersebut salah karena kurang tanda kurung tutup.
Hasil dari parsing dinyatakan dengan parse tree.
Contoh, diberikan pernyataan:
distance := rate * time;
Pada saat analisis leksikal/tokenizing akan terbentuk token-token seperti identifier, operator, titik koma, dan lainnya yang diringkas menjadi seperti berikut:
id1 := id2 * id3;
dimana id1 adalah token yang bersesuaian dengan distance, id2 bersesuaian dengan rate dan id3 bersesuaian dengan time. Dari token-token tersebut dibentuk parse tree sebagai berikut:
Sintak adalah susunan kalimat dan aturan-aturan dalam membentuk kalimat disebut Grammar. Penganalisis sintak dalam bidang kompilasi disebut sebagai Parser.
Untuk menganalisis kalimat biasanya digunakan bantuan parse-tree.
Contoh:
Perhatikan kalimat berikut ini "The dog gnawed the bone".
Buat dalam bentuk parse-tree.
Pada node paling atas (root) ditulis Sentence (kalimat), karena analisis sintak adalah menganalisis kalimat. Pada contoh diatas kalimatnya dalam bahasa Inggris (bahasa alami), tetapi cara ini juga digunakan untuk bahasa pemrograman (kompiler).
Kalimat ada bermacam-macam susunannya. Kalimat yang dicontohkan di atas terdiri dari 2 bagian, yaitu <noun-phrase> dan <verb-phrase>.
<sentence> → <noun phrase> <verb phrase>
<noun phrase> → <article><noun>
<verb phrase> → <verb><noun phrase>
<noun> → dog, cat, bone, sentence, verb, ...
<article> → the, a, an
<verb> → contains, gnawed, saw, walks, ...
Cara diatas disebut Production rules.
Contoh dalam bahasa pemrograman, perhatikan pernyataan berikut : a * b + c. Buat dalam bentuk parse-tree:
|
Parse Tree a * b + c |
Dalam bentuk Production rule dituliskan sebagai berikut:
<expression> → <expression> * <expression>
<expression> → <expression> + <expression>
<expression> → a,b,c, ...
Kata atau simbol nyata pada kalimat tersebut disebut Terminal symbol (Pada contoh di atas: a, b, c, *, +), sedangkan yang berada dalam tanda <> disebut Non-terminal symbol karena masih dapat dipecah lagi menjadi simbol yang nyata.
Definisi Formal dari Grammar
Grammar (G) merupakan fungsi dari (T,N,S,R), masing-masing adalah:
T : himpunan terminal symbol
N : himpunan non-terminal symbol
<sentence>, <expression>
N dan T adalah himpunan disdjoint (tidak bersinggungan)
S : simbol awal (starting symbol) ynag unik <sentence>
S E N
R : himpunan produksi dengan bentuk α → β , α dan β adalah kumpulan non-terminal dan terminal symbol.
Produksi adalah setiap kejadian di mana string bagian kiri (α) dapat digantikan oleh string bagian kanan (β).
Context-Free Grammar adalah grammar yang berbentuk α → β di mana α adalah non terminal tunggal.
Lambang-lambang yang digunakan dalam mendefinisikan kalimat menggunakan aturan Chomsky, yaitu non terminal dinyatakan dengan hutuf besar (A, B, C, dst), terminal dinyatakan dengan huruf kecil bagian awal (a,b,c, dst), sederet terminal dinyatakan dengan huruf kecil bagian akhir (w, x,y, dst.), dan campuran antara non terminal dan terminal (sentential form) dinyatakan dengah hutuf latin (α, β, γ, dst.).
Cara lain untuk mendefinisikan kalimat adalah dengan BNF (Backus Naur Form). Aturan ini digunakan untuk grammar yang bersifat Context-Free. Simbol-simbol yang digunakan adalah:
Non terminal ditulis dengan <>, tanda := sama dengan tanda panah, pengulangan dinyatakan dalam tanda {}, tanda [] dinyatakan pilihan (optional) bila ada beberapa produksi dengan bagian kiri yang sama seperti misalnya:
<expression> ::= <expression> + <expression>
<expression> ::= (<expression>)
<expression> ::= i dimana i = identifier = terminal symbol
dapat ditulis:
<expreesion>::=<expression>+<expression> | <expression>| i
Contoh lain dalam Turbo Pascal. Deklarasi variabel dengan var bila dinyatakan dalam BNF menjadi seperti berikut :
<var-declaration-part> ::= var <var-declaration> {; <var-declaration};
Tanda { } adalah pengulangan atau dikenal dengan Kleene Closure.
Untuk menyatakan integer, ditulis:
<integer-contant> ::= [+|-] <digit>{<digit>}
Ambiguous Grammar
Perhatikan ekspresi i+i*i. Ekspresi tersebut mengandung 2 macam arti, yaitu:
|
Ambiguous Grammar |
dari kedua gambar diatas, mana yang benar ?
Untuk mengatasi ambiguitas maka digunakan aturan tambahan, yaitu dengan menggunakan aturan operator-operator preseudence dalam Pascal, atau grammarnya ditulis ulang agar tidak terjadi ambiguitas.
E-> E+E | E-T| T
T->T*F | T/F | F
F -> (E) | i
E menyatakan ekspresi, T menyatakan Term dan F menyatakan Faktor. Dengan demikian grammar tersebut tidak akan membingungkan lagi.