Sabtu, 19 Februari 2011

ANALISIS SYNTAX

Analisis syntax atau parser (penguraian) adalah suatu bagian paling penting dalam sebuah compiler. Bagian ini mengambil inti penting bagian syntactic dari aliran input . Sebagian catatan awal, penganalisis syntax bekerja bertahap sebelum fase analisis lexical. Penganalisis lexical menentukan token yang terdapat pada aliran input berikutnya dan kembali ke parser untuk diperiksa lagi. Penganalisis syntax memperhatikan susunan token agar memungkinkan untuk disesuaikan dengan struktur bahasa pemrograman . Pada bab ini, kita akan memahami tentang fase analisis syntax. Pertama, kita akan membahas aturan uraian dan cara menguraikan dengan singkat. Berdasarkan pada kompleksitas cara parser, disini ada beberapa algoritma parser yang secara luas dibagi atas cara top-down dan bottom-up. Dalam tiap kategori, disana terdapat beberapa parser – seperti parser secara predictive (berulang dan tidak berulang), shift-reduce (operator precedence, parser LR), dan lainnya. Kita akan perlahan melihat ke dalam susunan awal parser dengan yang sederhana seperti parser secara predictive sampai yang kompleks seperi parser LR.
3.1 Aturan Parser
Parser dilihat dari urutan pengembalian token oleh penganalisis lexical dan ekstraksi konstruksi tampilan bahasa secara berurutan. Dengan demikian, aturan penguaraian adalah dua tahapan :
1. Untuk mengidentifikasi konstruksi bahasa ditampilkan pemberian input terhadap program. Jika parser menentukan input adalah sesuai, maka output yang ditampilakan berupa parse tree (pohon faktor).
2. Jika inputan adalah data tidak benar, maka parser menyatakan adanya deteksi kesalahan syntax pada input. Pada keadaan ini, pohon faktor tidak bisa dihasilkan.
3.2 Error Handling
Error handling (penanganan kesalahan) adalah suatu bagian penting pada sebuah kompiler modern. Kompiler dengan kemampuan error handling yang tidak baik tidak akan diterima oleh pengguna, bahkan walaupun itu dapat menghasilkan kode yang benar untuk program yang baik sekalipun. Tantangan yang paling besar disini adalah menebak kesalahan yang mungkin dilakukan programmer dan datang dengan cara menunjukan kesalahan itu secara tepat serta caranya yang tidak lebih dari satu. Ini seharusnya menjadi catatan bagi para perancang bahasa yang tidak menyediakan informasi tentang kesalahan, ini adalah tugas bagi para perancang compiler untuk menyediakan ini. Secara umum terjadiny kesalahan (error) dalam suatu program dapat diklasifikasikan dalam empat kategori sebagai berikut :
1. Lexical error- Ini merupakan kesalahan yang utamanya terletak pada kesalahan ejaan dan kebetulan masukannya berupa istilah asing. Sebagai contoh ‘$’, jika bahasa yang digunakan tidak sesuai dengan itu. Kesalahan ini kebanyakan tertangkap oleh Lexical analyzer.
2. Syntatic error- Ini merupakan kesalahan tata bahasa, seperti tidak sesuainya tanda kurung pada tampilan aritmatika, penyususunan ill-formed, dll. Kesalahan ini sering terjadi pada program. Sebuah parser seharusnya mampu untuk menangkap adanya kesalahan dengn efisien.
3. Semantic error – Ini merupakan kesalahan yang disebabkan oleh variable underfined, tidak sesuainya operands dan operator, dll. Kesalahan ini bisa ditangkap lewat pengenalan beberapa pengujian ekstra selama parsing (penguraian).
4. Logical error – Ini merupakan kesalahan seperti tak terbatasnya loop (perulangan). Di sini tidak ada jalan lain untuk mengetahui adanya kesalahan logika secara otomatis. Bagaimanapun, melakukan debugging mungkin dapat membantu programmer untuk mengetahui adanya kesalahan .
Dengan demikian, sebuah tantangan yang penting dari tahap analysis syntax ini adalah untuk mendeteksi kesalahn syntax. Bagaimanapun tidak seorangpun menyukai compiler yang berhenti setelah pendeteksian kesalahan pertama karena mungkin masih banyak kesalahan yang ada. Jika semua atau sebagian besar kesalahan dapat dilaporkan ke pengguna dalam satu waktu, pengguna dapat memeriksanya dan mengiririm kembali untuk dikompilasi. Laporan suatu kesalahan pada suatu waktu dibutuhkan iterasi dalam jumlah yang besar. Tetapi, pada sebagian besar bentuk, adanya kesalahan pada aliran input menjadi ujung dari sebuah parser untuk sebuah keadaan erroneous, dari sini tidak dapat melakukan pemmrosesan lebih jauh sebelum pekerjaan ini dibatalkan. Caranya terlibat dalam pemrosesan Strategi ini melibatkan proses pengetahuan secara luas sebagai error-recovery strategies.
Yang membedakan dari strategi recovery, disebutkan dengan baik sebagai berikut :
1. Panic mode
2. Phrase level
3. Error production
4. Global correction
Panic mode recovery. Dalam bentuk ini, parser mengesampingkan jumlah token yang cukup untuk dicapai dalam sebuah kedaan turun pada sebuah pendeteksian kesalahan. Satu set token menandai pada akhir konstruksi bahasa yang didefinisikan untuk membuat sebuah synchronizing set. Sebagai contoh yang identik pada sinkronisasi token adalah semicolon, closing brace, end, dll, yang mana sering digunakan untuk mengakhiri kalimat atau mengeblock. Teknik ini termasuk efektif karena setiap parser memperhatikan sebuah sinkronosasi token, dan dampaknya sebelum kesalahan syntax terjadi sanagat besar kemungkinan dapat dilampaui. Walaupun, itu akan melewatkan sedikit banyak token dalam sebuah proses, yang mungkin mengenali beberapa kesalahan yang tidak asli lagi.
Phrase level recovery. Dalam bentuk ini, parser membuat koreksi local dari input untuk mendeteksi kesalahan. Jadi, hasil keluaran input memberikan susunan bahasa yang baik. Sebagai contoh dalam kategori ini termasuk mengganti koma dengan semicolon, menyelipkan karakter yang hilang, dst. Bagaimanapun juga, menyelipkan karakter baru dapat terselesaikan dengan baik sehimgga kesalahan yang asing tidak dikenali dan juga penguraian algoritma dapat diproses tanpa masalah.
Error production.Ini meliputi modifikasi pada susunan bahasa yang mengandung keadaan error. Dalam bentuk ini , compiler mendesain sebuah ide yang sangat baik tentang tipe error yang mungkin terjadi sehingga dia dapat memodifikasi susunan bahasa yang tidak sesuai. Adanya kesalahan input program disini, error production akan membuat penambahan sehingga tercipta kesesuaaian pada susunan bahasa yang baru.
Global correction. Ini merupakan bentuk yang hampir mendekati bentuk teoritikal. Masalahnya, disini dapat menjadi sebuah keadaan yang mengikuti :
Memberikan aliran input x yang tidak benar pada sebuah grammar G, menemukan aliran input lain berupa y yang bisa diterima oleh G, sehingga jumlah token yang menjadi berubah untuk diganti dari x ke y adalah minimum.
Untuk mendekati keadaan yang digambarkan diatas membutuhkan biaya yang sangat mahal, dan untuk membuat program melalui cara error recovery mungkin tidak menjadi apa yang dpikirkan programmer pada awalnya.
Sebelum lanjut ke pembahasan berikutnya pada parser, kita membutuhkan pengetahuan konsep yang sedikit mendasar dan cara penulisan yang digunakan untuk menggambarkan grammar (susunan bahasa).
3.3 Grammar
Sebuah susunan bahasa Gdapat didefinisikan sebagai 4-tuple , dimana VN adalah satu set symbol tidak berbatas yang digunakan untuk menuliskan sebuah grammar, VT adalah satu set yang berbatas (artinya, ini adalah satu set kata yang digunakan dalam bahasa), P adalah satu set aturan produksi dan S Э VN adalah sebuah symbol tak berbatas yang khusus untuk memanggil start symbol pada sebuah grammar. Sebuah string dari bahasa yang digunakan berasal dari S dengan menerapkan production rules dari P. Aturan yang diterapkan pada string perantara terdiri dari urutan dari simbol milik ke VN U VT. Jika terjadi kesesuaian dari sisi kiri pada aturan tertentu dapat ditemukan pula terjadi dalam string,ke mungkinan diganti dengan yang kesesuaian dari sisi kanan. Dengan itu, production rules menentukan bagaimana urutan dari terminal dan simbol nonterminal dapat digantikan oleh beberapa urutan lainnya.
Contoh 3.1 Dengan mempertimbangkan tata bahasa untuk menghasilkan ekspresi aritmatika terdiri dari nomor dan operator simbol +, -, *, /, dan ↑. Aturan tata bahasa dapat ditulis sebagai,
E →EAE
E → (E)
E →- E
E →nomor
A →+
J →-
A →*
A →/
A →↑
Kita dapat menerapkan aturan-aturan untuk memperoleh ungkapan “2 * (3+5 * 4)” sebagai berikut:
E→EAE → EA(E) →EA (EAE) →EA (EAEAE) →EA (EAEA4) →EA (EAE * 4) →EA (EA5 * 4) → EA(E +5 * 4) →EA (3+5*4) →E*( 3 + 5 * 4) →2 * (3 + 5 * 4)
Dalam tata bahasa ini E dan A adalah nonterminal , sedangkan sisanya dari simbol, ini adalah, (.), -, nomer, -, -, *, /, ↑, adalah terminal.
Ada ada beberapa kelas bahasa berdasarkan production rules. Rincian pembahasan A dapat ditemukan dalam buku ini tentang Formal Language. Sebagian besar bahasa pemrograman disusun dengan mempertimbangkan kelas pada Context Free Language. Tata bahasa bebas dari konteks bahasa ini terdiri dari production rules yang pada bagian kiri hanya ada satu nonterminal dan tidak ada terminal . Nama ” ‘konteks bebas” berasal dari kenyataan bahwa sejak sisi kiri mempunyai nonterminal tunggal, disini tidak ada konteks dependensi untuk menerapkan aturan asal dalam proses.

Tidak ada komentar:

Posting Komentar