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
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