Seorang penterjemah ialah ... Jenis penterjemah. Menukar dan menyiarkan program. Penterjemah: konsep asas. LL(k) - bahasa dan tatabahasa

Untuk menterjemah dari satu bahasa ke bahasa lain, program, seperti orang, memerlukan penterjemah atau, secara saintifik, penterjemah.

Penterjemah: konsep asas

Program sedemikian sebagai penterjemah adalah perwakilan linguistik pengiraan I ->P ->P (i). Jurubahasa ialah atur cara yang mengambil program P sebagai input dengan beberapa data input X. Ia melaksanakan P pada X: I(P, x)=P(x). Terdapat penterjemah tunggal yang boleh melakukan segala-galanya program yang mungkin(yang boleh diwakili dalam sistem formal). Ini adalah penemuan yang sangat penting dan mendalam oleh Turing. Pemproses ialah penterjemah program dalam bahasa mesin. Tulis jurubahasa untuk bahasa tahap tinggi biasanya terlalu mahal, jadi ia diterjemahkan ke dalam bentuk yang lebih mudah untuk ditafsirkan. Sesetengah jenis penterjemah mempunyai nama yang sangat pelik. Program ini menterjemah program bahasa himpunan ke dalam bahasa mesin. Pengkompil membolehkan anda menterjemah daripada bahasa peringkat tinggi kepada bahasa peringkat rendah. Penterjemah ialah program yang mengambil program dalam beberapa bahasa S sebagai input dan, selepas pemprosesan, menghasilkan program dalam bahasa T. Oleh itu, kedua-duanya mempunyai semantik yang sama: P->X->Q. Oleh itu, untuk sebarang xP(x)=Q(x). Jika anda menterjemah keseluruhan program kepada sesuatu yang ditafsirkan, maka ini dipanggil kompilasi pra-pelaksanaan atau kompilasi AOT. Penyusun AOT boleh digunakan secara konsisten. Yang terakhir ini adalah sangat kerap assembler. Jadi, pertimbangkan contoh: Kod sumber -> Pengkompil (penterjemah) -> Kod pemasangan -> Pemasang (penterjemah) -> Kod mesin -> CPU (jurubahasa). Penyusunan dinamik atau dalam talian berlaku apabila sebahagian daripada program diterjemahkan manakala bahagian lain yang disusun sebelum ini sedang dilaksanakan. Penterjemah JIT mengingati apa yang telah mereka lakukan supaya mereka tidak perlu mengulangi kod sumber berulang kali. Mereka juga mampu melakukan penyusunan dan penyusunan semula adaptif, yang berdasarkan kelakuan persekitaran masa jalan program. Banyak bahasa menyediakan keupayaan untuk melaksanakan kod semasa terjemahan, serta untuk menyusun kod baharu semasa pelaksanaan program.

Siaran: peringkat

Proses terjemahan terdiri daripada peringkat sintesis dan analisis. Secara skematik, proses ini kelihatan seperti ini: Kod sumber -> Penganalisis -> Perwakilan konsep -> Pensintesis (penjana) -> Kod sasaran. Ini disebabkan oleh sebab-sebab berikut:

- mana-mana kaedah lain tidak sesuai;

Terjemahan tidak berfungsi.

Anda boleh menggunakan penyelesaian kejuruteraan berikut: jika anda perlu menulis penterjemah untuk bahasa sumber M dan bahasa sasaran N, anda hanya perlu menulis M+N program mudah(separa penyusun), bukan penyusun penuh (kompleks) MxN. Walau bagaimanapun, dalam praktiknya, perwakilan konsep jarang ekspresif dan cukup kuat untuk merangkumi semua bahasa sasaran dan sumber sedia ada. Walaupun beberapa pengguna telah dapat mendekatinya. Penyusun sebenar melalui pelbagai peringkat. Apabila anda mencipta pengkompil anda sendiri, anda tidak perlu membuat semula semua kerja keras yang telah dilakukan oleh pengaturcara semasa mencipta penjana dan pandangan. Anda boleh menterjemah bahasa anda terus ke dalam JavaScript atau C dan menggunakan penyusun C dan enjin JavaScript sedia ada untuk melakukan yang lain. Anda juga boleh menggunakan paparan perantaraan sedia ada dan mesin maya.

Rakaman penterjemah

Penterjemah boleh menjadi alat teknikal atau program yang menggunakan tiga bahasa: sumber, sasaran, asas. Anda boleh menulisnya dalam bentuk T, meletakkan sumber di sebelah kiri, sasaran di sebelah kanan, dan pangkalan di bawah. Terdapat tiga jenis penyusun secara keseluruhan.

  1. Penterjemah ialah penyusun sendiri jika bahasa sumbernya sepadan dengan bahasa asas.
  2. Pengkompil dipanggil pemastautin sendiri jika bahasa sasaran adalah sama dengan bahasa asas.
  3. Jika bahasa sasaran dan asas berbeza, maka penterjemah adalah pengkompil silang.

Mengapakah penting untuk membezakan antara jenis penyusun ini? Walaupun anda tidak pernah membina pengkompil yang benar-benar berkualiti tinggi, adalah baik untuk mengetahui tentang teknologi penciptaannya, kerana semua konsep yang digunakan untuk tujuan ini digunakan di mana-mana dalam bahasa pertanyaan pangkalan data, dalam pemformatan teks, secara lanjutan seni bina komputer ah, antara muka grafik, masalah pengoptimuman umum, terjemahan mesin, pengawal dan mesin maya. Selain itu, jika anda perlu menulis prapemproses, pemuat, pemasang, penyahpepijat atau pemprofil, anda mesti melalui semua langkah yang sama seperti semasa menulis pengkompil. Anda juga boleh belajar tentang cara terbaik untuk menulis program, kerana membangunkan penterjemah untuk bahasa pengaturcaraan bermakna lebih memahami semua kekaburan dan kehalusannya. Dengan mempelajari prinsip umum terjemahan, anda boleh menjadi seorang pereka yang baik bahasa. Tetapi adakah ia benar-benar penting? Betapa hebatnya bahasa jika ia tidak dapat dilaksanakan dengan cekap?

teknologi skala

Teknologi penyusun merangkumi pelbagai bidang sains komputer yang berbeza. Ia termasuk teori bahasa formal, tatabahasa, seni bina komputer, penghuraian, kebolehkiraan, set arahan, CISC atau RISC, saluran paip, kitaran jam, kernel, dsb., serta kawalan jujukan, rekursi, pelaksanaan bersyarat, penguraian fungsi, lelaran, modulariti, penyegerakan, pengaturcaraan meta, pemalar, skop, templat, jenis output, anotasi, prototaip, strim, peti mel, monad, kad bebas, sambungan, ingatan transaksi, ungkapan biasa, polimorfisme, warisan, mod parameter, dsb. Juga, untuk mencipta pengkompil, anda perlu memahami bahasa pengaturcaraan abstrak, algoritma dan struktur data, ungkapan biasa, algoritma grafik, pengaturcaraan dinamik.

Reka bentuk penyusun. Masalah yang mungkin timbul apabila mencipta penterjemah sebenar

Apakah masalah yang boleh timbul dengan bahasa sumber? Adakah ia mudah untuk disusun? Adakah terdapat prapemproses untuk ini? Bagaimanakah jenis dikendalikan? Apakah kumpulan pas pengkompil yang digunakan - pas tunggal atau berbilang? Tahap pengoptimuman yang diingini juga patut diberi perhatian khusus. Terjemahan pantas dan tidak tulen bagi program dengan sedikit atau tiada pengoptimuman boleh menjadi perkara biasa. Pengoptimuman yang berlebihan boleh melambatkan pengkompil, bagaimanapun, pada masa jalan kod terbaik mungkin berbaloi.

Tahap pengesanan ralat. Adakah perlu bagi penterjemah berhenti pada kesilapan pertama? Bilakah dia harus berhenti? Sekiranya pengkompil dipercayai untuk membetulkan ralat?

Set alat yang diperlukan

Jika dalam kes anda bahasa sumber tidak terlalu kecil, maka penjana penganalisis dan pengimbas adalah satu kemestian. Terdapat juga penjana kod khas, tetapi ia tidak digunakan secara meluas.

Bagi jenis kod sasaran untuk dijana, adalah perlu untuk memilih daripada kod mesin tulen, ditambah atau maya. Anda juga boleh menulis hujung hadapan yang mencipta paparan perantaraan yang popular seperti LLVM, JVM, RTL. Anda juga boleh menterjemah dari sumber kepada kod sumber dalam Skrip Java atau C. Jika kita bercakap tentang format kod sasaran, di sini anda boleh memilih kod mesin mudah alih, kod mesin imej memori, bahasa pemasangan.

penyasaran semula

Apabila menggunakan sejumlah besar penjana, adalah baik untuk mempunyai bahagian input yang sama. Juga atas sebab ini adalah lebih baik untuk mempunyai satu pengayun untuk banyak bahagian input.

Komponen Penyusun

Kami menyenaraikan yang utama komponen berfungsi penterjemah yang menjana kod mesin jika program output ialah program C atau mesin maya:

- program input memasuki penganalisis leksikal, atau dengan cara lain pengimbas, yang menukarnya menjadi aliran token;

- penghurai (parser) membina pokok sintaks abstrak daripadanya;

— penganalisis semantik terurai maklumat semantik dan menyemak ralat nod pokok;

- akibatnya, graf semantik dibina. Istilah ini difahami sebagai pokok sintaks abstrak dengan pautan yang mantap dan sifat tambahan;

- penjana kod perantaraan membina graf aliran (tuple dikumpulkan ke dalam blok utama);

- Pengoptimum bebas mesin melakukan pengoptimuman tempatan dan global, tetapi kebanyakannya kekal dalam rangka kerja subrutin, sambil memudahkan pengiraan dan mengurangkan kod berlebihan. Hasilnya hendaklah graf aliran yang diubah suai;

— untuk memautkan blok asas ke dalam kod garis lurus dengan pemindahan kawalan, penjana kod sasaran digunakan. Ia mencipta fail objek dalam pemasang dengan daftar visual, mungkin tidak begitu cekap;

- Penyambung pengoptimum yang bergantung kepada mesin digunakan untuk memperuntukkan memori antara daftar maya dan melaksanakan penjadualan arahan. Ia juga menukar atur cara yang ditulis dalam pemasang kepada pemasang sebenar menggunakan saluran paip.

— subsistem pengesanan ralat dan pengurus jadual simbol digunakan;

- pengimbasan dan analisis leksikal. Pengimbas digunakan untuk menukar strim aksara kod sumber kepada aliran token, mengalih keluar ulasan, ruang dan mengembangkan makro. Selalunya, pengimbas menghadapi masalah sedemikian, sama ada untuk mengambil kira lekukan, kes, komen bersarang.

Ralat yang mungkin berlaku semasa pengimbasan dipanggil leksikal. Mereka termasuk yang berikut:

- aksara hilang dalam abjad;

— lebihan bilangan aksara dalam baris atau perkataan;

ialah rentetan tidak tertutup literal atau aksara;

- hujung fail dalam ulasan.

Penghuraian atau penghuraian digunakan untuk mengubah jujukan token menjadi pokok sintaks abstrak. Dalam kes ini, setiap nod pokok disimpan sebagai objek dengan medan bernama. Ramai daripada mereka sendiri adalah nod pokok. Tiada kitaran pada peringkat ini. Apabila mencipta penghurai, pertama sekali perlu memberi perhatian kepada tahap kerumitan tatabahasa (LR atau LL) dan mengetahui jika terdapat sebarang peraturan nyahkekaburan. Malah, sesetengah bahasa memerlukan analisis semantik. Ralat yang berlaku pada peringkat ini dipanggil ralat sintaks.

Analisis semantik

Apabila menjalankan analisis semantik, pertama sekali, perlu menyemak peraturan kebolehterimaan dan memautkan bahagian pokok sintaks menjadi satu keseluruhan untuk membentuk graf semantik dengan memasukkan operasi untuk pemutus jenis tersirat, menyelesaikan rujukan nama, dsb. . Adalah jelas bahawa bahasa pengaturcaraan yang berbeza mempunyai set peraturan kebolehterimaan yang berbeza. Apabila menyusun bahasa seperti Java, penyusun mungkin menghadapi ralat berikut:

- pengisytiharan berbilang pembolehubah dalam skop tindakannya;

— pelanggaran peraturan kebolehaksesan;

- kehadiran rujukan kepada nama yang tidak diisytiharkan;

- terlalu besar atau, sebaliknya, bilangan hujah yang tidak mencukupi semasa memanggil kaedah;

- jenis tidak sepadan.

Generasi

Dengan menjana kod perantaraan, graf aliran dihasilkan yang terdiri daripada tupel yang dikumpulkan ke dalam blok asas. Selepas menjana kod, kod mesin sebenar diperolehi. Dalam langkah pertama dalam penyusun tradisional untuk mesin RISC, langkah pertama ialah mencipta pemasang dengan bilangan daftar maya yang tidak terhingga. Ia mungkin tidak akan berlaku untuk mesin CISC.

Bahasa pengaturcaraan boleh dibahagikan kepada disusun dan ditafsirkan.

Atur cara dalam bahasa yang disusun ditukar (disusun) menjadi satu set arahan untuk jenis ini pemproses (kod mesin) dan kemudian ditulis ke dalam modul boleh laku, yang boleh dilancarkan untuk pelaksanaan sebagai program berasingan. Dalam erti kata lain, pengkompil menterjemahkan kod sumber program daripada bahasa pengaturcaraan peringkat tinggi kepada kod binari arahan pemproses.

Jika program ditulis dalam bahasa yang ditafsirkan, maka jurubahasa secara langsung melaksanakan (mentafsir) teks sumber tanpa terjemahan terlebih dahulu. Walau bagaimanapun, program itu kekal bahasa asal dan tidak boleh dijalankan tanpa jurubahasa. Kita boleh mengatakan bahawa pemproses komputer adalah penterjemah kod mesin.

Ringkasnya, pengkompil menterjemahkan kod sumber program ke dalam bahasa mesin sekaligus dan sepenuhnya, sambil mencipta program boleh laksana, dan jurubahasa melaksanakan kod sumber tepat semasa pelaksanaan program.

Pembahagian kepada bahasa yang disusun dan ditafsirkan agak sewenang-wenangnya. Jadi, untuk mana-mana bahasa yang disusun secara tradisional, seperti Pascal, anda boleh menulis penterjemah. Di samping itu, kebanyakan jurubahasa "tulen" moden tidak melaksanakan binaan bahasa secara langsung, tetapi menyusunnya menjadi beberapa perwakilan pertengahan peringkat tinggi (contohnya, dengan dereference berubah dan pengembangan makro).

Untuk mana-mana bahasa yang ditafsirkan, anda boleh mencipta pengkompil - contohnya, bahasa Lisp, yang ditafsirkan pada asalnya, boleh disusun tanpa sebarang sekatan. Kod yang dijana semasa runtime juga boleh disusun secara dinamik semasa runtime.

Sebagai peraturan, program yang disusun berjalan lebih cepat dan tidak memerlukan program tambahan untuk dilaksanakan, kerana ia telah diterjemahkan ke dalam bahasa mesin. Pada masa yang sama, dengan setiap perubahan dalam teks program, penyusunan semulanya diperlukan, yang menimbulkan kesukaran dalam pembangunan. Di samping itu, atur cara yang disusun hanya boleh dijalankan pada jenis komputer yang sama, dan biasanya di bawah sistem pengendalian yang sama, yang mana pengkompil telah direka bentuk. Untuk mencipta fail boleh laku untuk mesin jenis yang berbeza, kompilasi baharu diperlukan.

Bahasa yang ditafsirkan mempunyai beberapa khusus ciri-ciri tambahan(lihat di atas), sebagai tambahan, program pada mereka boleh dijalankan serta-merta selepas perubahan, yang memudahkan pembangunan. Program bahasa yang ditafsirkan selalunya boleh dijalankan pada pelbagai jenis mesin dan sistem pengendalian tanpa usaha tambahan.

Walau bagaimanapun, program yang ditafsir berjalan dengan ketara lebih perlahan daripada program yang disusun, dan ia tidak boleh dijalankan tanpa program penterjemah tambahan.

Sesetengah bahasa, seperti Java dan C#, termasuk di antara disusun dan ditafsirkan. Iaitu, program ini tidak disusun ke dalam bahasa mesin, tetapi ke dalam kod bebas mesin peringkat rendah, bytecode. Bytecode kemudiannya dilaksanakan oleh mesin maya. Untuk melaksanakan kod bait, tafsiran biasanya digunakan, walaupun beberapa bahagiannya boleh diterjemahkan ke dalam kod mesin secara langsung semasa pelaksanaan program menggunakan kompilasi Just-in-time (JIT) untuk mempercepatkan atur cara. Untuk Java, bytecode dilaksanakan oleh Java Virtual Machine (JVM), untuk C# - oleh Common Language Runtime.

Pendekatan ini, dalam erti kata lain, membolehkan anda menggunakan kelebihan kedua-dua jurubahasa dan penyusun. Sebutan juga harus dibuat tentang bahasa Forth yang asal, yang mempunyai jurubahasa dan penyusun.

Memandangkan teks yang ditulis dalam bahasa pengaturcaraan tidak dapat difahami oleh komputer, ia diperlukan untuk menterjemahkannya ke dalam kod mesin. Terjemahan program sedemikian dari bahasa pengaturcaraan ke bahasa kod mesin dipanggil terjemahan, dan ia dilakukan oleh program khas - penterjemah.

Penterjemah - program perkhidmatan A yang menukar program sumber yang disediakan dalam bahasa pengaturcaraan input kepada program kerja yang disediakan dalam bahasa objek.

Pada masa ini, penyusun dibahagikan kepada tiga kumpulan utama: penghimpun, penyusun, dan jurubahasa.

Assembler ialah utiliti sistem yang menukar binaan simbolik kepada arahan bahasa mesin. Ciri khusus pemasang ialah mereka secara literal menterjemah satu arahan simbolik ke dalam satu arahan mesin. Oleh itu, bahasa himpunan (juga dipanggil autokod) direka untuk memudahkan persepsi set arahan komputer dan mempercepatkan pengaturcaraan dalam set arahan ini. Adalah lebih mudah bagi seorang pengaturcara untuk mengingati penunjuk mnemonik arahan mesin daripada kod binari mereka.

Pada masa yang sama, bahasa himpunan, sebagai tambahan kepada analog arahan mesin, mengandungi banyak arahan tambahan yang memudahkan, khususnya, pengurusan sumber komputer, menulis serpihan berulang, dan membina program multimodule. Oleh itu, ekspresi bahasa adalah lebih kaya daripada bahasa pengekodan simbolik, yang sangat meningkatkan kecekapan pengaturcaraan.

Pengkompil ialah program utiliti yang menterjemah ke dalam bahasa mesin program yang ditulis dalam bahasa pengaturcaraan sumber. Sama seperti penghimpun, pengkompil menukar atur cara daripada satu bahasa ke bahasa lain (paling kerap, kepada bahasa komputer tertentu). Walau bagaimanapun, arahan bahasa sumber berbeza dengan ketara dalam organisasi dan kuasa daripada arahan bahasa mesin. Terdapat bahasa di mana satu arahan bahasa sumber diterjemahkan ke dalam 7-10 arahan mesin. Walau bagaimanapun, terdapat juga bahasa di mana setiap arahan boleh sepadan dengan 100 atau lebih arahan mesin (contohnya, Prolog). Di samping itu, dalam bahasa sumber, penaipan data yang ketat sering digunakan, yang dijalankan melalui penerangan awal mereka. Pengaturcaraan mungkin tidak bergantung pada pengekodan algoritma, tetapi pada pemikiran yang teliti tentang struktur data atau kelas. Proses penterjemahan daripada bahasa tersebut biasanya dipanggil kompilasi, dan bahasa sumber biasanya dirujuk sebagai bahasa pengaturcaraan peringkat tinggi (atau bahasa peringkat tinggi). Abstraksi bahasa pengaturcaraan daripada sistem arahan komputer telah membawa kepada penciptaan bebas pelbagai bahasa berorientasikan penyelesaian. tugasan tertentu. Bahasa muncul untuk pengiraan saintifik, pengiraan ekonomi, akses kepada pangkalan data, dan lain-lain.

Jurubahasa ialah program atau peranti yang melaksanakan terjemahan pengendali demi pengendali dan pelaksanaan program sumber. Tidak seperti pengkompil, penterjemah tidak menghasilkan program bahasa mesin sebagai output. Setelah mengenali arahan bahasa sumber, ia segera melaksanakannya. Kedua-dua penyusun dan jurubahasa menggunakan kaedah yang sama untuk menghuraikan kod sumber program. Tetapi jurubahasa membenarkan anda untuk mula memproses data selepas menulis walaupun satu arahan. Ini menjadikan proses pembangunan dan penyahpepijatan program lebih fleksibel. Di samping itu, ketiadaan kod mesin output memungkinkan untuk tidak "menyampah" peranti luaran dengan fail tambahan, dan jurubahasa itu sendiri boleh dengan mudah disesuaikan dengan mana-mana seni bina mesin, setelah membangunkannya sekali sahaja dalam bahasa pengaturcaraan yang digunakan secara meluas. Oleh itu, bahasa yang ditafsirkan seperti Java Script, VB Script telah tersebar luas. Kelemahan jurubahasa adalah kelajuan rendah pelaksanaan program. Biasanya, program yang ditafsirkan berjalan 50 hingga 100 kali lebih perlahan daripada program yang ditulis dalam kod mesin.

Emulator ialah program atau perisian dan alat perkakasan yang menyediakan keupayaan untuk melaksanakan program pada komputer tertentu tanpa pengaturcaraan semula, menggunakan kod atau kaedah untuk melaksanakan operasi yang berbeza daripada komputer ini. Emulator adalah serupa dengan penterjemah kerana ia melaksanakan secara langsung atur cara yang ditulis dalam beberapa bahasa. Walau bagaimanapun, selalunya ia adalah bahasa mesin atau kod perantaraan. Kedua-duanya mewakili arahan dalam kod binari yang boleh dilaksanakan serta-merta selepas mengenali opcode. Tidak seperti program teks, ia tidak diperlukan untuk mengenali struktur program, untuk memilih operan.

Emulator digunakan agak kerap untuk pelbagai tujuan. Contohnya, apabila membangunkan sistem pengkomputeran baharu, emulator pertama kali dicipta yang menjalankan program yang sedang dibangunkan untuk komputer yang belum wujud. Ini membolehkan set arahan dinilai dan perisian asas dibangunkan sebelum perkakasan yang sepadan dicipta.

Selalunya, emulator digunakan untuk menjalankan program lama pada komputer baharu. Biasanya, komputer yang lebih baharu adalah lebih pantas dan mempunyai peranti yang lebih baik. Ini membolehkan anda meniru program lama dengan lebih cekap daripada menjalankannya pada komputer lama.

Transcoder - program atau peranti pengaturcaraan, menterjemah program yang ditulis dalam bahasa mesin satu komputer kepada program yang ditulis dalam bahasa mesin komputer lain. Jika emulator adalah analog penterjemah yang kurang pintar, maka transcoder bertindak dalam kapasiti yang sama berhubung dengan pengkompil. Begitu juga, kod mesin sumber (dan biasanya binari) atau perwakilan perantaraan ditukar kepada kod lain yang serupa dalam satu arahan dan tanpa sebarang analisis umum struktur program sumber. Transkoder berguna apabila mengalihkan atur cara dari satu seni bina komputer ke yang lain. Ia juga boleh digunakan untuk membina semula teks program bahasa peringkat tinggi daripada kod binari yang tersedia.

Makropemproses ialah program yang menggantikan satu jujukan aksara dengan yang lain. Ia adalah sejenis penyusun. Ia menjana teks output dengan pemprosesan sisipan khas terdapat dalam teks sumber. Sisipan ini dibuat dengan cara yang istimewa dan tergolong dalam binaan bahasa, dipanggil bahasa makro. Makropemproses sering digunakan sebagai alat tambah kepada bahasa pengaturcaraan, meningkatkan fungsi sistem pengaturcaraan. Hampir mana-mana pemasang mengandungi makropemproses, yang meningkatkan kecekapan membangunkan program mesin. Sistem pengaturcaraan sedemikian biasanya dirujuk sebagai pemasang makro.

Makropemproses juga digunakan dengan bahasa peringkat tinggi. Mereka meningkatkan fungsi bahasa seperti PL/1, C, C++. Makropemproses terutamanya digunakan secara meluas dalam C dan C++, menjadikannya lebih mudah untuk menulis atur cara. Makropemproses meningkatkan kecekapan pengaturcaraan tanpa mengubah sintaks dan semantik bahasa.

Sintaks - satu set peraturan bahasa tertentu yang menentukan pembentukan unsur-unsurnya. Dalam erti kata lain, ia adalah satu set peraturan untuk pembentukan urutan watak yang bermakna secara semantik dalam bahasa tertentu. Sintaks ditentukan menggunakan peraturan yang menerangkan konsep bahasa tertentu. Contoh konsep ialah: pembolehubah, ungkapan, pengendali, prosedur. Urutan konsep dan penggunaannya yang dibenarkan dalam peraturan menentukan struktur yang betul secara sintaksis yang membentuk atur cara. Ia adalah hierarki objek, bukan cara mereka berinteraksi antara satu sama lain, yang ditakrifkan melalui sintaks. Sebagai contoh, pengendali boleh berlaku hanya dalam prosedur, manakala ungkapan dalam pengendali, pembolehubah boleh terdiri daripada nama dan indeks pilihan, dan sebagainya. Sintaks tidak berkaitan dengan fenomena sedemikian dalam program sebagai "melompat ke label yang tidak wujud" atau "pembolehubah dengan nama yang diberikan tidak ditakrifkan". Inilah yang dilakukan oleh semantik.

Semantik - peraturan dan syarat yang menentukan hubungan antara unsur bahasa dan makna semantiknya, serta tafsiran makna bermakna binaan sintaksis bahasa. Objek bahasa pengaturcaraan bukan sahaja diletakkan di dalam teks mengikut hierarki tertentu, tetapi juga saling berkaitan melalui konsep lain yang membentuk pelbagai persatuan. Sebagai contoh, pembolehubah yang sintaksnya mentakrifkan lokasi yang sah hanya dalam pengisytiharan dan beberapa pernyataan mempunyai jenis tertentu, boleh digunakan dengan set operasi yang terhad, mempunyai alamat, saiz, dan mesti diisytiharkan sebelum digunakan dalam atur cara.

Parser ialah komponen pengkompil yang menyemak penyataan sumber untuk pematuhan dengan peraturan sintaks dan semantik bahasa pengaturcaraan tertentu. Walaupun namanya, penganalisis menyemak kedua-dua sintaks dan semantik. Ia terdiri daripada beberapa blok, setiap satunya menyelesaikan masalahnya sendiri. Ia akan dipertimbangkan dengan lebih terperinci apabila menerangkan struktur penterjemah. pengaturcaraan bahasa penyusun penterjemah

Mana-mana penterjemah melaksanakan tugas utama berikut:

  • - menganalisis program penyiaran, khususnya, menentukan sama ada ia mengandungi ralat sintaksis;
  • - menjana program keluaran (ia sering dipanggil program objek) dalam bahasa arahan mesin;
  • - memperuntukkan ingatan untuk atur cara objek.1.1 Jurubahasa

Satu kelebihan yang sering disebut dalam pelaksanaan penterjemah ialah ia membenarkan "mod segera". Mod segera membolehkan anda meminta komputer tugasan seperti PRINT 3.14159*3/2.1 dan mengembalikan jawapan kepada anda sebaik sahaja anda menekan ENTER (ini membolehkan anda menggunakan komputer $3,000 sebagai kalkulator $10). Selain itu, jurubahasa mempunyai atribut khas yang memudahkan penyahpepijatan. Anda boleh, sebagai contoh, mengganggu pemprosesan program penterjemah, memaparkan kandungan pembolehubah tertentu, meluncur melalui program, dan kemudian meneruskan pelaksanaan.

Perkara yang paling disukai oleh pengaturcara tentang jurubahasa ialah keupayaan untuk mendapatkan respons yang cepat. Tidak perlu kompilasi di sini, kerana jurubahasa sentiasa bersedia untuk campur tangan dalam program anda. Masukkan RUN dan hasilnya adalah milik anda sendiri peluang terakhir muncul pada skrin.

Walau bagaimanapun, bahasa penterjemah mempunyai kelemahan. Adalah perlu, sebagai contoh, untuk mempunyai salinan penterjemah dalam ingatan pada setiap masa, manakala banyak ciri jurubahasa, dan oleh itu ciri-cirinya, mungkin tidak diperlukan untuk pelaksanaan program tertentu.

Kelemahan halus jurubahasa ialah mereka cenderung untuk tidak menggalakkan gaya pengaturcaraan yang baik. Oleh kerana komen dan butiran lain yang boleh diformalkan mengambil banyak memori program, orang ramai cenderung untuk tidak menggunakannya. Syaitan kurang marah daripada pengaturcara penterjemah ASAS yang cuba memasukkan program 120K ke dalam memori 60K. tetapi yang paling teruk, jurubahasa bergerak perlahan.

Mereka menghabiskan terlalu banyak masa untuk memikirkan apa yang perlu dilakukan dan bukannya melakukan perkara sebenar. Pada pelaksanaan pengendali program, jurubahasa mesti terlebih dahulu mengimbas setiap pernyataan untuk membaca kandungannya (apa yang orang ini minta saya lakukan?) dan kemudian melaksanakan operasi yang diminta. Pernyataan dalam gelung diimbas terlalu banyak.

Pertimbangkan atur cara: pada jurubahasa BASIC 10 UNTUK N=1 HINGGA 1000 20 CETAK N,SQR(N) 30 SETERUSNYA N pada peralihan pertama melalui program ini, Jurubahasa ASAS mesti meneka maksud baris 20:

  • 1. tukarkan pembolehubah berangka N kepada rentetan
  • 2. hantar rentetan ke skrin
  • 3. beralih ke kawasan cetakan seterusnya
  • 4. mengira Punca kuasa dua daripada N
  • 5. tukarkan hasil kepada rentetan
  • 6. hantar rentetan ke skrin

Pada pas kedua gelung, semua tekaan ini diulang lagi, kerana semua hasil kajian rentetan ini beberapa milisaat yang lalu telah dilupakan sepenuhnya. Dan seterusnya dalam semua 998 pas seterusnya. Jelas sekali, jika anda boleh memisahkan fasa pengimbasan/pemahaman daripada fasa pelaksanaan, anda akan mempunyai program yang lebih pantas. Dan untuk itulah penyusun.

Matlamat dan objektif disiplin. Konsep dan definisi asas. Ciri-ciri umum bahasa pengaturcaraan dan penterjemah. Struktur umum penterjemah. Varian interaksi blok penterjemah.

Matlamat dan objektif disiplin

Pada masa ini, bahasa buatan yang menggunakan perwakilan teks untuk menerangkan kawasan subjek digunakan secara meluas bukan sahaja dalam pengaturcaraan, tetapi juga di kawasan lain. Dengan bantuan mereka, struktur semua jenis dokumen, dunia maya tiga dimensi, antara muka pengguna grafik dan banyak objek lain yang digunakan dalam model dan dalam dunia nyata diterangkan. Agar huraian tekstual ini disusun dengan betul dan kemudiannya dikenali dan ditafsirkan dengan betul, kaedah khas analisis dan transformasinya digunakan. Kaedah ini berdasarkan teori bahasa dan tatabahasa formal, serta teori automata. Sistem perisian yang direka untuk menganalisis dan mentafsir teks dipanggil penterjemah.

Walaupun fakta bahawa beribu-ribu bahasa yang berbeza dan penterjemah mereka telah dibangunkan setakat ini, proses mencipta aplikasi baru di kawasan ini tidak berhenti. Ini berkaitan dengan pembangunan teknologi untuk pengeluaran sistem komputer, dan dengan keperluan untuk menyelesaikan masalah yang lebih kompleks. Di samping itu, unsur-unsur teori bahasa dan tatabahasa formal boleh digunakan dalam pelbagai bidang lain, contohnya, apabila menerangkan struktur data, fail, imej, yang dibentangkan bukan dalam teks, tetapi dalam format binari. Kaedah ini juga berguna semasa membangunkan penterjemah anda, walaupun terdapat analog yang sepadan. Perkembangan sedemikian mungkin disebabkan oleh pelbagai sebab, khususnya, batasan fungsi, kekurangan penyetempatan, kecekapan rendah. Sebagai contoh, salah satu perkembangan terkini Microsoft ialah bahasa pengaturcaraan C#, dan salah satu sebab penciptaannya ialah keinginan untuk mengurangkan populariti bahasa pengaturcaraan Java. Terdapat banyak contoh lain di mana membangunkan penterjemah anda sendiri boleh menjadi relevan. Oleh itu, asas teori bahasa dan tatabahasa formal, serta kaedah praktikal untuk membangunkan penterjemah, terletak pada asas pendidikan kejuruteraan dalam sains komputer dan teknologi komputer.

Bahan yang dicadangkan menyentuh asas kaedah pembangunan penterjemah dan mengandungi maklumat yang diperlukan untuk mengkaji logik fungsinya, alat matematik yang digunakan (teori bahasa formal dan tatabahasa formal, bahasa metal). Ia digunakan sebagai sebahagian daripada kursus kuliah semester yang diberikan untuk pelbagai kepakaran di Fakulti Informatik dan Kejuruteraan Komputer Universiti Teknikal Negeri Krasnoyarsk. Semasa menjalankan kerja makmal, kenalan langsung dengan kaedah individu untuk mencipta penterjemah dijalankan.

Tujuan disiplin: untuk memberikan pengetahuan tentang asas-asas teori bahasa dan tatabahasa formal, teori automata, kaedah untuk membangunkan penterjemah.

Untuk mencapai matlamat ini semasa mengajar disiplin, tugas-tugas berikut diselesaikan:

  1. Semasa kursus kuliah, prinsip umum organisasi proses terjemahan dan struktur penterjemah. Asas-asas teori membina penterjemah dipelajari.
  2. Dalam sesi makmal dan semasa kerja bebas penyatuan praktikal pengetahuan teori yang diterima dijalankan: penterjemah untuk bahasa pengaturcaraan mudah sedang dibangunkan.

Konsep dan definisi asas

Kebanyakan definisi yang dipertimbangkan dipinjam daripada [ARNFTS Kamus Pengkomputeran dan Pemprosesan Data Inggeris-Rusia-Jerman-Perancis, 4132 istilah. Di bawah. ed. A.A. Dorodnitsyn. M.: 1978. 416 hlm.) ].

Penterjemah - program utiliti yang menukar program sumber yang disediakan dalam bahasa pengaturcaraan input kepada program kerja yang disediakan dalam bahasa objek.

Takrifan di atas digunakan untuk semua jenis program penyiaran. Walau bagaimanapun, setiap program ini mungkin mempunyai keistimewaan tersendiri dalam organisasi proses terjemahan. Pada masa ini, penyusun dibahagikan kepada tiga kumpulan utama: penghimpun, penyusun, dan jurubahasa.

pemasang - utiliti sistem yang menukar binaan simbolik kepada arahan bahasa mesin. Ciri khusus pemasang ialah mereka secara literal menterjemah satu arahan simbolik ke dalam satu arahan mesin. Oleh itu, bahasa himpunan (juga dipanggil autokod) direka untuk memudahkan persepsi set arahan komputer dan mempercepatkan pengaturcaraan dalam set arahan ini. Adalah lebih mudah bagi seorang pengaturcara untuk mengingati penunjuk mnemonik arahan mesin daripada kod binari mereka. Oleh itu, keuntungan utama dicapai bukan dengan meningkatkan kuasa arahan individu, tetapi dengan meningkatkan kecekapan persepsi mereka.

Pada masa yang sama, bahasa himpunan, sebagai tambahan kepada analog arahan mesin, mengandungi banyak arahan tambahan yang memudahkan, khususnya, pengurusan sumber komputer, menulis serpihan berulang, dan membina program multimodule. Oleh itu, ekspresi bahasa adalah lebih kaya daripada bahasa pengekodan simbolik, yang sangat meningkatkan kecekapan pengaturcaraan.

Penyusun - ialah program utiliti yang menterjemah ke dalam bahasa mesin program yang ditulis dalam bahasa pengaturcaraan sumber. Sama seperti penghimpun, pengkompil menukar atur cara daripada satu bahasa ke bahasa lain (paling kerap, kepada bahasa komputer tertentu). Walau bagaimanapun, arahan bahasa sumber berbeza dengan ketara dalam organisasi dan kuasa daripada arahan bahasa mesin. Terdapat bahasa di mana satu arahan bahasa sumber diterjemahkan ke dalam 7-10 arahan mesin. Walau bagaimanapun, terdapat juga bahasa di mana setiap arahan boleh sepadan dengan 100 atau lebih arahan mesin (contohnya, Prolog). Di samping itu, dalam bahasa sumber, penaipan data yang ketat sering digunakan, yang dijalankan melalui penerangan awal mereka. Pengaturcaraan mungkin tidak bergantung pada pengekodan algoritma, tetapi pada pemikiran yang teliti tentang struktur data atau kelas. Proses penterjemahan daripada bahasa tersebut biasanya dipanggil kompilasi, dan bahasa sumber biasanya dirujuk sebagai bahasa pengaturcaraan peringkat tinggi (atau bahasa peringkat tinggi). Abstraksi bahasa pengaturcaraan daripada sistem arahan komputer membawa kepada penciptaan bebas pelbagai bahasa yang memberi tumpuan kepada menyelesaikan masalah tertentu. Bahasa muncul untuk pengiraan saintifik, pengiraan ekonomi, akses kepada pangkalan data, dan lain-lain.

Jurubahasa - program atau peranti yang melaksanakan terjemahan operator demi pengendali dan pelaksanaan program asal. Tidak seperti pengkompil, penterjemah tidak menghasilkan program bahasa mesin sebagai output. Setelah mengenali arahan bahasa sumber, ia segera melaksanakannya. Kedua-dua penyusun dan jurubahasa menggunakan kaedah yang sama untuk menghuraikan kod sumber program. Tetapi jurubahasa membenarkan anda untuk mula memproses data selepas menulis walaupun satu arahan. Ini menjadikan proses pembangunan dan penyahpepijatan program lebih fleksibel. Di samping itu, ketiadaan kod mesin output memungkinkan untuk tidak "menyampah" peranti luaran dengan fail tambahan, dan jurubahasa itu sendiri boleh dengan mudah disesuaikan dengan mana-mana seni bina mesin, setelah membangunkannya sekali sahaja dalam bahasa pengaturcaraan yang digunakan secara meluas. Oleh itu, bahasa yang ditafsirkan seperti Java Script, VB Script telah tersebar luas. Kelemahan jurubahasa adalah kelajuan rendah pelaksanaan program. Biasanya, program yang ditafsirkan berjalan 50 hingga 100 kali lebih perlahan daripada program yang ditulis dalam kod mesin.

Emulator - program atau perisian dan alat perkakasan yang membolehkan, tanpa pengaturcaraan semula, untuk melaksanakan pada komputer tertentu program yang menggunakan kod atau kaedah untuk melaksanakan operasi yang berbeza daripada komputer ini. Emulator adalah serupa dengan penterjemah kerana ia melaksanakan secara langsung atur cara yang ditulis dalam beberapa bahasa. Walau bagaimanapun, selalunya ia adalah bahasa mesin atau kod perantaraan. Kedua-duanya mewakili arahan dalam kod binari yang boleh dilaksanakan serta-merta selepas mengenali opcode. Tidak seperti program teks, ia tidak diperlukan untuk mengenali struktur program, untuk memilih operan.

Emulator digunakan agak kerap untuk pelbagai tujuan. Contohnya, apabila membangunkan sistem pengkomputeran baharu, emulator pertama kali dicipta yang menjalankan program yang sedang dibangunkan untuk komputer yang belum wujud. Ini membolehkan set arahan dinilai dan perisian asas dibangunkan sebelum perkakasan yang sepadan dicipta.

Selalunya, emulator digunakan untuk menjalankan program lama pada komputer baharu. Biasanya, komputer yang lebih baharu adalah lebih pantas dan mempunyai peranti yang lebih baik. Ini membolehkan anda meniru program lama dengan lebih cekap daripada menjalankannya pada komputer lama. Contoh pendekatan ini ialah pembangunan emulator komputer rumah ZX Spectrum dengan mikropemproses Z80. Sehingga kini, terdapat peminat untuk bermain di emulator dalam program permainan yang sudah lapuk, tetapi masih tidak kehilangan daya tarikan mereka dahulu. Emulator juga boleh digunakan sebagai lebih analog murah kontemporari sistem komputer, sambil memberikan prestasi yang boleh diterima setara dengan model yang lebih rendah bagi sesetengah keluarga seni bina. Contohnya ialah emulator PC IBM. komputer yang serasi dilaksanakan pada komputer Apple yang lebih berkuasa. Sejumlah emulator yang ditulis untuk IBM PC berjaya menggantikan pelbagai konsol permainan.

Emulator perwakilan perantaraan, seperti jurubahasa, boleh dipindahkan dengan mudah dari satu seni bina komputer ke yang lain, membolehkan penciptaan perisian mudah alih. Sifat inilah yang menentukan kejayaan bahasa pengaturcaraan Java, dari mana program ini diterjemahkan ke dalam kod perantaraan. Melaksanakan kod ini java maya mesin tidak lebih daripada emulator yang menjalankan mana-mana moden sistem operasi.

Transkoder - atur cara atau peranti perisian yang menterjemah program yang ditulis dalam bahasa mesin satu komputer kepada program yang ditulis dalam bahasa mesin komputer lain. Jika emulator adalah analog penterjemah yang kurang pintar, maka transcoder bertindak dalam kapasiti yang sama berhubung dengan pengkompil. Begitu juga, kod mesin sumber (dan biasanya binari) atau perwakilan perantaraan ditukar kepada kod lain yang serupa dalam satu arahan dan tanpa sebarang analisis umum struktur program sumber. Transkoder berguna apabila mengalihkan atur cara dari satu seni bina komputer ke yang lain. Ia juga boleh digunakan untuk membina semula teks program bahasa peringkat tinggi daripada kod binari yang tersedia.

Makropemproses - program yang menggantikan satu urutan aksara dengan yang lain[Brown]. Ia adalah sejenis penyusun. Ia menjana teks output dengan memproses sisipan khas yang terletak dalam teks sumber. Sisipan ini dibuat dengan cara yang istimewa dan tergolong dalam binaan bahasa, dipanggil bahasa makro. Makropemproses sering digunakan sebagai alat tambah kepada bahasa pengaturcaraan, meningkatkan fungsi sistem pengaturcaraan. Hampir mana-mana pemasang mengandungi makropemproses, yang meningkatkan kecekapan membangunkan program mesin. Sistem pengaturcaraan sedemikian biasanya dirujuk sebagai pemasang makro.

Makropemproses juga digunakan dengan bahasa peringkat tinggi. Mereka meningkatkan fungsi bahasa seperti PL/1, C, C++. Makropemproses terutamanya digunakan secara meluas dalam C dan C++, menjadikannya lebih mudah untuk menulis atur cara. Contoh penggunaan meluas pemproses makro ialah perpustakaan kelas Microsoft Foundation Classes (MFC). Melalui sisipan makro, ia melaksanakan peta mesej dan objek program lain. Pada masa yang sama, makropemproses meningkatkan kecekapan pengaturcaraan tanpa mengubah sintaks dan semantik bahasa.

Sintaks - satu set peraturan bahasa tertentu yang menentukan pembentukan unsur-unsurnya. Dengan kata lain, ini satu set peraturan untuk pembentukan urutan watak yang bermakna secara semantik dalam bahasa tertentu. Sintaks ditentukan menggunakan peraturan yang menerangkan konsep bahasa tertentu. Contoh konsep ialah: pembolehubah, ungkapan, pengendali, prosedur. Urutan konsep dan penggunaannya yang dibenarkan dalam peraturan menentukan struktur yang betul secara sintaksis yang membentuk atur cara. Ia adalah hierarki objek, bukan cara mereka berinteraksi antara satu sama lain, yang ditakrifkan melalui sintaks. Sebagai contoh, pengendali boleh berlaku hanya dalam prosedur, manakala ungkapan dalam pengendali, pembolehubah boleh terdiri daripada nama dan indeks pilihan, dan sebagainya. Sintaks tidak berkaitan dengan fenomena sedemikian dalam program sebagai "melompat ke label yang tidak wujud" atau "pembolehubah dengan nama yang diberikan tidak ditakrifkan". Inilah yang dilakukan oleh semantik.

Semantik - peraturan dan syarat yang menentukan hubungan antara unsur bahasa dan makna semantiknya, serta tafsiran makna bermakna binaan sintaksis bahasa.. Objek bahasa pengaturcaraan bukan sahaja diletakkan di dalam teks mengikut hierarki tertentu, tetapi juga saling berkaitan melalui konsep lain yang membentuk pelbagai persatuan. Sebagai contoh, pembolehubah yang sintaksnya mentakrifkan lokasi yang sah hanya dalam pengisytiharan dan beberapa pernyataan, mempunyai jenis tertentu, boleh digunakan dengan set operasi terhad, mempunyai alamat, saiz dan mesti diisytiharkan sebelum digunakan dalam sesuatu program.

Penganalisis sintaksis - komponen pengkompil yang menyemak penyataan sumber untuk pematuhan dengan peraturan sintaks dan semantik bahasa pengaturcaraan yang diberikan. Walaupun namanya, penganalisis menyemak kedua-dua sintaks dan semantik. Ia terdiri daripada beberapa blok, setiap satunya menyelesaikan masalahnya sendiri. Ia akan dipertimbangkan dengan lebih terperinci apabila menerangkan struktur penterjemah.

Ciri Umum Bahasa Pengaturcaraan dan Penterjemah

Bahasa pengaturcaraan agak berbeza antara satu sama lain dalam tujuan, struktur, kerumitan semantik, kaedah pelaksanaan. Ini mengenakan ciri khususnya sendiri pada pembangunan penterjemah tertentu.

Bahasa pengaturcaraan adalah alat untuk menyelesaikan masalah dalam bidang subjek yang berbeza, yang menentukan spesifik organisasi mereka dan perbezaan tujuan. Contohnya termasuk Fortran untuk pengiraan saintifik, C untuk pengaturcaraan sistem, Prolog untuk menerangkan masalah inferens dengan berkesan, dan Lisp untuk pemprosesan senarai rekursif. Contoh-contoh ini boleh diteruskan. Setiap bidang mata pelajaran mempunyai keperluan sendiri untuk organisasi bahasa itu sendiri. Oleh itu, kita boleh perhatikan pelbagai bentuk perwakilan pengendali dan ungkapan, perbezaan dalam set operasi asas, penurunan kecekapan pengaturcaraan apabila menyelesaikan masalah yang tidak berkaitan dengan bidang subjek. Perbezaan bahasa juga tercermin dalam struktur penterjemah. Lisp dan Prolog paling kerap dilaksanakan dalam mod tafsiran kerana ia menggunakan penjanaan jenis data dinamik semasa pengiraan. Penyusun Fortran dicirikan oleh pengoptimuman agresif kod mesin yang terhasil, yang menjadi mungkin disebabkan oleh semantik yang agak mudah bagi pembinaan bahasa - khususnya, kerana ketiadaan mekanisme penamaan pembolehubah alternatif melalui petunjuk atau rujukan. Kehadiran penunjuk dalam bahasa C membuat keperluan khusus Kepada pengedaran dinamik ingatan.

Struktur bahasa mencirikan hubungan hierarki antara konsepnya, yang digambarkan oleh peraturan sintaksis. Bahasa pengaturcaraan boleh sangat berbeza antara satu sama lain dalam organisasi konsep individu dan dalam hubungan antara mereka. Bahasa pengaturcaraan PL/1 membenarkan tatacara dan fungsi bersarang sewenang-wenangnya, manakala dalam C semua fungsi mesti berada pada tahap sarang luar. Bahasa C++ membenarkan pengisytiharan pembolehubah pada mana-mana titik dalam program sebelum penggunaan pertamanya, manakala dalam pembolehubah Pascal mesti ditakrifkan dalam kawasan khas penerangan. PL/1 pergi lebih jauh dalam perkara ini, yang membolehkan pembolehubah diisytiharkan selepas ia digunakan. Atau anda boleh meninggalkan penerangan sama sekali dan ikut peraturan lalai. Bergantung kepada keputusan, penterjemah boleh menganalisis atur cara dalam satu atau lebih pas, yang menjejaskan kelajuan terjemahan.

Semantik bahasa pengaturcaraan berbeza-beza dalam julat yang sangat luas. Mereka berbeza bukan sahaja dalam spesifik pelaksanaan operasi individu, tetapi juga dalam paradigma pengaturcaraan yang menentukan perbezaan asas dalam kaedah membangunkan program. Spesifik pelaksanaan operasi mungkin melibatkan kedua-dua struktur data yang diproses dan peraturan untuk memproses jenis data yang sama. Bahasa seperti PL/1 dan APL menyokong operasi matriks dan vektor. Kebanyakan bahasa berfungsi terutamanya dengan skalar, menyediakan prosedur dan fungsi yang ditulis oleh pengaturcara untuk mengendalikan tatasusunan. Tetapi walaupun semasa menjalankan operasi menambah dua integer, bahasa seperti C dan Pascal boleh berkelakuan berbeza.

Bersama-sama dengan pengaturcaraan prosedur tradisional, juga dipanggil imperatif, terdapat paradigma seperti pengaturcaraan berfungsi, pengaturcaraan logik dan pengaturcaraan berorientasikan objek. Saya berharap paradigma pengaturcaraan prosedur-parametrik yang dicadangkan oleh saya [Legalov2000] juga akan mengambil tempatnya dalam siri ini. Struktur konsep dan objek bahasa sangat bergantung pada paradigma yang dipilih, yang juga mempengaruhi pelaksanaan penterjemah.

Malah bahasa yang sama boleh dilaksanakan dalam beberapa cara. Ini disebabkan oleh fakta bahawa teori tatabahasa formal membenarkan kaedah yang berbeza untuk menghuraikan ayat yang sama. Sehubungan itu, penterjemah cara yang berbeza boleh mendapatkan hasil yang sama (program objek) daripada kod sumber asal.

Walau bagaimanapun, semua bahasa pengaturcaraan mempunyai beberapa ciri dan parameter yang sama. Kesamaan ini juga menentukan prinsip penyusunan penterjemah yang serupa untuk semua bahasa.

  1. Bahasa pengaturcaraan direka untuk memudahkan pengaturcaraan. Oleh itu, pengendali dan struktur data mereka lebih berkuasa daripada dalam bahasa mesin.
  2. Untuk meningkatkan keterlihatan program, bukannya kod berangka, representasi simbolik atau grafik bagi binaan bahasa digunakan, yang lebih mudah untuk persepsi mereka oleh seseorang.
  3. Untuk mana-mana bahasa ditakrifkan:
  • Satu set simbol yang boleh digunakan untuk menulis atur cara yang betul (abjad), elemen asas.
  • Set program yang betul (sintaks).
  • "Maksud" setiap program yang betul (semantik).

Tanpa mengira spesifik bahasa, mana-mana penterjemah boleh dianggap sebagai penukar berfungsi F yang menyediakan pemetaan X kepada Y yang jelas, dengan X ialah atur cara dalam bahasa sumber, Y ialah atur cara dalam bahasa output. Oleh itu, proses terjemahan itu sendiri boleh diwakili secara formal dengan ringkas dan jelas:

Secara formal, masing-masing program yang betul X ialah rentetan aksara daripada beberapa abjad A, ditukar kepada rentetan Y yang sepadan, terdiri daripada aksara daripada abjad B.

bahasa pengaturcaraan seperti yang lain sistem yang kompleks, ditakrifkan melalui hierarki konsep yang mentakrifkan hubungan antara unsur-unsurnya. Konsep-konsep ini berkaitan antara satu sama lain mengikut peraturan sintaksis. Setiap program yang dibina mengikut peraturan ini mempunyai struktur hierarki yang sepadan.

Dalam hal ini, untuk semua bahasa dan program mereka, ciri umum berikut boleh dibezakan tambahan: setiap bahasa mesti mengandungi peraturan yang membenarkan menjana program yang sepadan dengan bahasa ini atau mengiktiraf surat-menyurat antara program bertulis dan bahasa tertentu.

Hubungan antara struktur atur cara dan bahasa pengaturcaraan dipanggil pemetaan sintaksis.

Sebagai contoh, pertimbangkan hubungan antara struktur hierarki dan rentetan aksara yang mentakrifkan ungkapan aritmetik berikut:

Dalam kebanyakan bahasa pengaturcaraan ungkapan yang diberikan mentakrifkan hierarki objek program yang boleh dipaparkan sebagai pokok (Rajah 1.1.):

Bulatan mewakili simbol yang digunakan sebagai binaan asas, dan segi empat tepat mewakili konsep komposit yang mempunyai struktur hierarki dan, mungkin, rekursif. Hierarki ini ditakrifkan dengan bantuan peraturan sintaksis yang ditulis dalam bahasa khas yang dipanggil metalanguage (metalanguage akan dibincangkan dengan lebih terperinci semasa mempelajari tatabahasa formal):

<выражение> ::= <слагаемое> | <выражение> + <слагаемое>

<слагаемое> ::= <множитель> | <слагаемое> * <множитель>

<множитель> ::= <буква> | (<выражение>)

<буква>

Catatan. Tanda "::=" dibaca sebagai "ia". Bar menegak "|" dibaca sebagai "atau".

Jika peraturan ditulis secara berbeza, struktur hierarki juga akan berubah. Contohnya ialah ikut cara entri peraturan:

<выражение> ::= <операнд> | <выражение> + < операнд > | <выражение> * < операнд >

<операнд> ::= <буква> | (<выражение>)

<буква>::= a | b | c | d | i | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z

Akibatnya menghurai ungkapan aritmetik yang sama, struktur hierarki akan dibina, ditunjukkan dalam rajah. 1.2.


Perlu diingatkan bahawa struktur hierarki dalam kes umum mungkin sama sekali tidak berkaitan dengan semantik ungkapan. Dalam kedua-dua kes, keutamaan melaksanakan operasi boleh dilaksanakan mengikut peraturan yang diterima umum, apabila pendaraban mendahului penambahan (atau sebaliknya, semua operasi boleh mempunyai keutamaan yang sama di bawah mana-mana set peraturan). Walau bagaimanapun, struktur pertama secara jelas menyokong pelaksanaan lebih lanjut keutamaan biasa, manakala yang kedua lebih sesuai untuk melaksanakan operasi dengan keutamaan yang sama dan melaksanakannya dari kanan ke kiri.

Proses mencari struktur sintaksis program yang diberikan dipanggil menghurai.

Struktur sintaksis yang betul dalam satu bahasa mungkin tersilap dalam bahasa lain. Contohnya, dalam Forth, ungkapan di atas tidak akan dikenali. Walau bagaimanapun, untuk bahasa ini, ungkapan postfix adalah betul:

Struktur sintaksisnya diterangkan oleh peraturan:

<выражение> ::= <буква> | <операнд> <операнд> <операция>

< операнд > ::= < буква > | < выражение >

< операция > ::= + | *

<буква>::= a | b | c | d | i | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z

Pokok hierarki yang mentakrifkan struktur sintaksis ditunjukkan dalam rajah. 1.3.

Satu lagi ciri ciri semua bahasa ialah semantik mereka. Ia menentukan maksud operasi bahasa, ketepatan operan. Rantaian yang mempunyai struktur sintaksis yang sama dalam bahasa pengaturcaraan yang berbeza mungkin berbeza dalam semantik (yang, sebagai contoh, diperhatikan dalam C ++, Pascal, Asas untuk serpihan ungkapan aritmetik di atas).

Pengetahuan tentang semantik bahasa membolehkan memisahkannya daripada sintaksnya dan menggunakannya untuk menukar kepada bahasa lain (untuk menjana kod).

Perihalan semantik dan pengecaman ketepatannya biasanya merupakan bahagian penterjemah yang paling memakan masa dan banyak, kerana ia adalah perlu untuk menghitung dan menganalisis set kemungkinan gabungan operasi dan operan.

Struktur penterjemah umum

Sifat dan corak umum adalah wujud dalam kedua-dua bahasa pengaturcaraan yang berbeza dan penterjemah daripada bahasa ini. Mereka mempunyai proses yang sama untuk menukar teks sumber. Walaupun fakta bahawa interaksi proses ini boleh diatur dengan cara yang berbeza, adalah mungkin untuk memilih fungsi yang pelaksanaannya membawa kepada hasil yang sama. Kami memanggil fungsi tersebut sebagai fasa proses terjemahan.

Memandangkan persamaan pengkompil dan jurubahasa, mari kita pertimbangkan fasa yang wujud dalam pengkompil. Ia menyerlahkan:

  1. Fasa analisis leksikal.
  2. Fasa penghuraian, terdiri daripada:
  • pengecaman struktur sintaksis;
  • penghuraian semantik, semasa kerja dengan jadual dijalankan, penjanaan perwakilan semantik perantaraan atau model objek bahasa.
  • Fasa penjanaan kod, yang melaksanakan:
    • analisis semantik komponen perwakilan perantaraan atau model objek bahasa;
    • menterjemah perwakilan perantaraan atau model objek kepada kod objek.

    Bersama-sama dengan fasa utama proses terjemahan, fasa tambahan juga mungkin:

      2a. Fasa penyelidikan dan pengoptimuman perwakilan pertengahan, yang terdiri daripada:
    2a.1. analisis ketepatan perwakilan pertengahan;
    2a.2. pengoptimuman perwakilan pertengahan.
      3a. Fasa pengoptimuman kod objek.

    Jurubahasa berbeza kerana fasa penjanaan kod biasanya digantikan dengan fasa emulasi unsur-unsur perwakilan perantaraan atau model objek bahasa. Di samping itu, jurubahasa biasanya tidak mengoptimumkan perwakilan perantaraan, tetapi segera menirunya.

    Di samping itu, adalah mungkin untuk memilih satu proses untuk semua fasa menganalisis dan membetulkan ralat yang wujud dalam kod sumber yang diproses program.

    Struktur umum pengkompil, dengan mengambil kira fasa yang ada di dalamnya, ditunjukkan dalam rajah. 1.4.

    Ia terdiri daripada penganalisis leksikal, penghurai, penjana kod, penganalisis ralat. Dalam penterjemah, bukannya penjana kod, emulator digunakan (Rajah 1.5), yang mana, sebagai tambahan kepada elemen perwakilan perantaraan, data sumber dipindahkan. Output emulator adalah hasil pengiraan.

    Penganalisis leksikal (juga dikenali sebagai pengimbas) membaca rentetan input aksara dan mengumpulkannya ke dalam binaan asas yang dipanggil token. Setiap token mempunyai kelas dan nilai. Biasanya, binaan asas bahasa, sebagai contoh, pengecam, nombor nyata, ulasan, bertindak sebagai calon untuk peranan leksem. Token yang terhasil dihantar ke parser. Pengimbas bukan bahagian wajib penterjemah. Walau bagaimanapun, ia membolehkan untuk meningkatkan kecekapan proses terjemahan. Analisis leksikal dipertimbangkan dengan lebih terperinci dalam topik: "Organisasi analisis leksikal".

    Penghurai menghuraikan atur cara sumber menggunakan token masuk, membina struktur sintaksis program dan melakukan analisis semantik dengan pembentukan model objek bahasa. Model objek mewakili struktur sintaksis yang ditambah dengan hubungan semantik antara konsep sedia ada. Sambungan ini boleh menjadi:

    • rujukan pembolehubah, jenis data dan nama prosedur diletakkan dalam jadual nama;
    • pautan yang menentukan urutan pelaksanaan arahan;
    • pautan yang menentukan sarang unsur model objek bahasa, dan lain-lain.

    Oleh itu, parser ialah unit penterjemah yang agak kompleks. Oleh itu, ia boleh dibahagikan kepada komponen berikut:

    • pengecam;
    • blok analisis semantik;
    • model objek, atau perwakilan perantaraan, yang terdiri daripada jadual nama dan struktur sintaksis.

    Struktur umum penghurai ditunjukkan dalam rajah. 1.6.

    Pengecam menerima rantaian token dan, berdasarkannya, menghuraikannya mengikut peraturan yang digunakan. Token, apabila berjaya menghurai peraturan, diserahkan kepada penganalisis semantik, yang membina jadual nama dan membetulkan serpihan struktur sintaksis. Di samping itu, pautan semantik tambahan ditetapkan antara jadual nama dan struktur sintaksis. Akibatnya, model objek program terbentuk, dibebaskan daripada mengikat kepada sintaks bahasa pengaturcaraan. Selalunya, bukannya struktur sintaksis yang menyalin sepenuhnya hierarki objek bahasa, analog yang dipermudahkan dicipta, yang dipanggil perwakilan perantaraan.

    Penganalisis ralat menerima maklumat tentang ralat yang berlaku dalam pelbagai blok penterjemah. Menggunakan maklumat yang diterima, ia menjana mesej kepada pengguna. Di samping itu, blok ini mungkin cuba membetulkan ralat untuk meneruskan penghuraian selanjutnya. Beliau juga bertanggungjawab untuk menyiapkan program yang betul sekiranya penghantaran selanjutnya tidak dapat diteruskan.

    Penjana kod membina kod mesin objek berdasarkan analisis model objek atau perwakilan perantaraan. Pembinaan kod itu disertakan dengan analisis semantik tambahan yang berkaitan dengan keperluan untuk menukar arahan umum kepada kod untuk komputer tertentu. Pada peringkat analisis sedemikian, kemungkinan transformasi akhirnya ditentukan, dan pilihan yang berkesan. Penjanaan kod itu sendiri ialah pengekodan semula beberapa arahan kepada yang lain.

    Pilihan interaksi untuk blok penterjemah

    Organisasi proses terjemahan, yang menentukan pelaksanaan fasa utama, boleh dijalankan dalam pelbagai cara. Ini ditentukan oleh pelbagai pilihan untuk interaksi blok penterjemah: penganalisis leksikal, penghurai dan penjana kod. Walaupun keputusan akhir yang sama, pelbagai pilihan Interaksi blok penterjemah menyediakan pelbagai pilihan untuk menyimpan data perantaraan. Terdapat dua pilihan utama untuk interaksi blok penterjemah:

    • organisasi berbilang pas, di mana setiap fasa adalah proses bebas yang memindahkan kawalan ke fasa seterusnya hanya selepas selesai pemprosesan lengkap datanya;
    • organisasi laluan tunggal, di mana semua fasa mewakili satu proses dan menghantar data antara satu sama lain dalam serpihan kecil.

    Berdasarkan dua pilihan utama, anda juga boleh membuat pelbagai kombinasi daripadanya.

    Organisasi Multipass Interaksi Blok Penterjemah

    Varian interaksi blok ini, menggunakan pengkompil sebagai contoh, ditunjukkan dalam Rajah 1.7.


    Penganalisis leksikal memproses sepenuhnya teks sumber, membentuk rantaian yang terdiri daripada semua leksem yang diterima pada output. Hanya selepas kawalan itu dipindahkan ke parser. Penghurai menerima rantaian token yang terbentuk dan, berdasarkannya, membentuk perwakilan perantaraan atau model objek. Selepas menerima keseluruhan model objek, ia memberikan kawalan kepada penjana kod. Penjana kod, berdasarkan model objek bahasa, membina kod mesin yang diperlukan

    Kelebihan pendekatan ini termasuk:

    1. Pengasingan fasa individu, yang membolehkan pelaksanaan dan penggunaan bebas mereka.
    2. Kemungkinan menyimpan data yang diperoleh hasil daripada operasi setiap fasa pada peranti storan luaran dan menggunakannya mengikut keperluan.
    3. Kemungkinan pengurangan volum memori capaian rawak, diperlukan untuk operasi penterjemah, disebabkan oleh panggilan berurutan fasa.

    Kelemahan harus dipertimbangkan.

    1. Ketersediaan jumlah yang besar maklumat perantaraan, dari mana masa ini hanya sedikit masa yang diperlukan.
    2. Kelajuan terjemahan yang perlahan disebabkan oleh pelaksanaan berurutan fasa dan penggunaan peranti storan luaran untuk menjimatkan RAM.

    Pendekatan ini boleh menjadi mudah apabila membina penterjemah daripada bahasa pengaturcaraan dengan struktur sintaksis dan semantik yang kompleks (contohnya, PL/I). Dalam situasi sedemikian, sukar untuk menterjemah dalam satu pas, jadi lebih mudah untuk mewakili keputusan pas sebelumnya sebagai data perantaraan tambahan. Perlu diingatkan bahawa struktur semantik dan sintaksis bahasa yang kompleks boleh menyebabkan laluan tambahan yang diperlukan untuk mewujudkan kebergantungan yang diperlukan. Jumlah pas mungkin lebih daripada sepuluh. Bilangan pas juga boleh dipengaruhi oleh penggunaan ciri bahasa tertentu oleh program, seperti mengisytiharkan pembolehubah dan prosedur selepas ia digunakan, menggunakan peraturan pengisytiharan lalai dan sebagainya.

    Organisasi satu laluan interaksi blok penterjemah

    Salah satu pilihan untuk interaksi blok pengkompil dengan organisasi laluan tunggal ditunjukkan dalam Rajah. 1.8.

    Dalam kes ini, proses terjemahan berjalan seperti berikut. Penganalisis leksikal membaca serpihan teks sumber yang diperlukan untuk mendapatkan satu token. Selepas pembentukan leksem, ia memanggil penghurai dan meneruskan leksem yang dicipta kepadanya sebagai parameter. Jika penghurai boleh membina elemen seterusnya bagi perwakilan perantaraan, maka ia berbuat demikian dan menghantar serpihan yang dibina kepada penjana kod. Jika tidak, penghurai mengembalikan kawalan kepada pengimbas, dengan itu menjelaskan bahawa token seterusnya telah diproses dan data baharu diperlukan.

    Penjana kod berfungsi dengan cara yang sama. Berdasarkan serpihan perwakilan perantaraan yang diterima, ia mencipta serpihan kod objek yang sepadan. Selepas itu, kawalan dikembalikan kepada parser.

    Setelah selesai teks sumber dan selesai pemprosesan semua data perantaraan oleh setiap blok, penganalisis leksikal memulakan proses penamatan program.

    Selalunya, penterjemah laluan tunggal menggunakan skema kawalan yang berbeza, di mana penghurai memainkan peranan blok utama (Rajah 1.9).

    Penganalisis leksikal dan penjana kod bertindak sebagai subrutin yang mereka panggil. Sebaik sahaja penghurai memerlukan token lain, ia memanggil pengimbas. Apabila serpihan perwakilan perantaraan diterima, panggilan dibuat kepada penjana kod. Penyelesaian proses terjemahan berlaku selepas menerima dan memproses token terakhir dan dimulakan oleh penghurai.

    Kelebihan skim satu laluan termasuk ketiadaan volum besar data perantaraan, kelajuan pemprosesan yang tinggi disebabkan oleh gabungan fasa dalam satu proses, dan ketiadaan akses kepada peranti storan luaran.

    Kelemahan termasuk: kemustahilan melaksanakan skema terjemahan sedemikian untuk bahasa dengan struktur kompleks dan kekurangan data perantaraan yang boleh digunakan untuk analisis dan pengoptimuman yang kompleks.

    Skim sedemikian sering digunakan untuk bahasa pengaturcaraan yang mudah dalam struktur semantik dan sintaksis, baik dalam penyusun dan jurubahasa. Asas dan Pascal adalah contoh bahasa tersebut. Jurubahasa klasik biasanya dibina mengikut skema laluan tunggal, kerana pelaksanaan langsung dijalankan pada tahap serpihan individu perwakilan perantaraan. Organisasi interaksi blok jurubahasa sedemikian ditunjukkan dalam Rajah. 1.10.

    Interaksi Gabungan Blok Penterjemah

    Gabungan skim terjemahan berbilang laluan dan satu laluan menimbulkan pelbagai pilihan gabungan, kebanyakannya berjaya digunakan. Mari kita lihat sebahagian daripada mereka sebagai contoh.

    Pada rajah. 1.11 menunjukkan rajah interaksi blok penterjemah, yang membahagikan keseluruhan proses kepada dua laluan. Pada pas pertama, perwakilan perantaraan lengkap program dijana, dan pada pas kedua, penjanaan kod dilakukan. Penggunaan skema sedemikian memudahkan untuk memindahkan penterjemah dari satu sistem komputer ke sistem komputer yang lain dengan menulis semula penjana kod.

    Di samping itu, bukannya penjana kod, mudah untuk menyambungkan emulator perwakilan perantaraan, yang secara ringkasnya membolehkan anda membangunkan sistem pengaturcaraan dalam bahasa tertentu yang berorientasikan kepada pelbagai persekitaran pelaksanaan. Contoh organisasi interaksi blok penterjemah sedemikian ditunjukkan dalam Rajah. 1.12.


    Bersama-sama dengan skim yang melibatkan penggantian penjana kod dengan emulator, terdapat penterjemah yang membenarkannya perkongsian. Salah satu daripada skema ini ditunjukkan dalam Rajah. 1.13.

    Proses terjemahan, termasuk penjanaan kod, boleh diselesaikan dalam sebarang bilangan pas (contoh menggunakan terjemahan satu laluan yang dibentangkan sebelum ini dalam ). Walau bagaimanapun, kod objek yang dihasilkan tidak dilaksanakan pada yang sepadan sistem pengkomputeran, tetapi dicontohi pada komputer dengan seni bina yang berbeza. Skim sedemikian digunakan dalam persekitaran yang dibina di sekitar bahasa pengaturcaraan Java. Penterjemah itu sendiri menjana kod mesin maya Java, yang dicontohi dengan cara khas kendiri dan dalam persekitaran pelayar Internet.

    Skim yang dibentangkan boleh mempunyai tafsiran yang lebih luas berhubung dengan mana-mana pengkompil yang menjana kod mesin. Masalahnya ialah kebanyakan komputer moden dilaksanakan menggunakan kawalan mikroprogram. Peranti kawalan program mikro boleh dianggap sebagai program yang meniru kod mesin. Ini membolehkan kita bercakap tentang penggunaan meluas skim terakhir yang dibentangkan.

    Kawal soalan dan tugasan

    1. Namakan perbezaan:
      • penterjemah penyusun;
      • pengkompil daripada penghimpun;
      • transcoder daripada penterjemah;
      • emulator daripada penterjemah;
      • sintaks daripada semantik.
    1. Beritahu kami tentang perkembangan terkini dalam bahasa pengaturcaraan yang anda tahu. Berikan ciri-ciri utama bahasa-bahasa tersebut.
    2. Berikan contoh konkrit penggunaan kaedah terjemahan dalam bidang yang tidak berkaitan dengan bahasa pengaturcaraan.
    3. Berikan contoh khusus bahasa pengaturcaraan yang disusun.
    4. Berikan contoh khusus bahasa pengaturcaraan yang ditafsirkan.
    5. Berikan contoh khusus bahasa pengaturcaraan di mana kedua-dua penyusun dan jurubahasa tersedia.
    6. Kelebihan dan kekurangan utama penyusun.
    7. Kelebihan dan kekurangan utama jurubahasa.
    8. Terangkan perbezaan utama dalam sintaks dua bahasa pengaturcaraan yang anda tahu.
    9. Terangkan perbezaan utama dalam semantik dua bahasa pengaturcaraan yang anda tahu.
    10. Namakan fasa utama proses terjemahan dan tujuannya.
    11. Namakan ciri khusus terjemahan satu laluan.
    12. Namakan ciri khusus terjemahan berbilang laluan.
    13. Berikan contoh kemungkinan gabungan terjemahan satu laluan dan berbilang laluan. Beritahu kami tentang penggunaan praktikal skim ini.

    Hantar kerja baik anda di pangkalan pengetahuan adalah mudah. Gunakan borang di bawah

    Pelajar, pelajar siswazah, saintis muda yang menggunakan pangkalan pengetahuan dalam pengajian dan kerja mereka akan sangat berterima kasih kepada anda.

    Dihoskan di http://www.allbest.ru

    pengenalan

    1.1 Penghuraian atas ke bawah

    1.2 Penghuraian bawah ke atas

    1.2.1 LR(k) - tatabahasa

    1.2.1.1 LR(0) - tatabahasa

    1.2.2 tatabahasa LALR(1).

    2. Perkembangan penterjemah

    2.1 Analisis keperluan

    2.2 Reka bentuk

    2.2.1 Mereka bentuk penganalisis leksikal

    2.2.4 Pelaksanaan perisian parser

    2.3 Pengekodan

    2.4 Pengujian

    Kesimpulan

    Senarai sumber yang digunakan

    Lampiran A. Penyenaraian teks program penterjemah

    Lampiran B. Keputusan Ujian

    Lampiran C. Skema program penterjemah

    pengenalan

    Sudah lama berlalu, sebelum menulis program, adalah perlu untuk memahami dan menghafal lebih daripada sedozen arahan mesin. Seorang pengaturcara moden merumuskan tugasnya dalam bahasa pengaturcaraan peringkat tinggi dan menggunakan bahasa himpunan hanya dalam kes yang luar biasa. Seperti yang diketahui, bahasa algoritma menjadi tersedia kepada pengaturcara hanya selepas penciptaan penterjemah dari bahasa ini.

    Bahasa pengaturcaraan agak berbeza antara satu sama lain dalam tujuan, struktur, kerumitan semantik, kaedah pelaksanaan. Ini mengenakan ciri khususnya sendiri pada pembangunan penterjemah tertentu.

    Bahasa pengaturcaraan adalah alat untuk menyelesaikan masalah dalam bidang subjek yang berbeza, yang menentukan spesifik organisasi mereka dan perbezaan tujuan. Contohnya termasuk Fortran untuk pengiraan saintifik, C untuk pengaturcaraan sistem, Prolog untuk menerangkan masalah inferens dengan berkesan, dan Lisp untuk pemprosesan senarai rekursif. Contoh-contoh ini boleh diteruskan. Setiap bidang mata pelajaran mempunyai keperluan sendiri untuk organisasi bahasa itu sendiri. Oleh itu, kita boleh perhatikan pelbagai bentuk perwakilan operator dan ungkapan, perbezaan dalam set operasi asas, penurunan kecekapan pengaturcaraan apabila menyelesaikan masalah yang tidak berkaitan dengan kawasan subjek. Perbezaan bahasa juga tercermin dalam struktur penterjemah. Lisp dan Prolog paling kerap dilaksanakan dalam mod tafsiran kerana ia menggunakan penjanaan jenis data dinamik semasa pengiraan. Penyusun Fortran dicirikan oleh pengoptimuman agresif kod mesin yang terhasil, yang menjadi mungkin disebabkan oleh semantik yang agak mudah bagi pembinaan bahasa - khususnya, kerana ketiadaan mekanisme penamaan pembolehubah alternatif melalui petunjuk atau rujukan. Kehadiran penunjuk dalam bahasa C mengenakan keperluan khusus pada peruntukan memori dinamik.

    Struktur bahasa mencirikan hubungan hierarki antara konsepnya, yang digambarkan oleh peraturan sintaksis. Bahasa pengaturcaraan boleh sangat berbeza antara satu sama lain dalam organisasi konsep individu dan dalam hubungan antara mereka. Bahasa pengaturcaraan PL/1 membenarkan tatacara dan fungsi bersarang sewenang-wenangnya, manakala dalam C semua fungsi mesti berada pada tahap sarang luar. Bahasa C++ membenarkan pengisytiharan pembolehubah pada mana-mana titik dalam program sebelum penggunaan pertamanya, manakala dalam pembolehubah Pascal mesti ditakrifkan dalam kawasan perisytiharan khas. PL/1 pergi lebih jauh dalam perkara ini, yang membolehkan pembolehubah diisytiharkan selepas ia digunakan. Atau anda boleh meninggalkan penerangan sama sekali dan ikut peraturan lalai. Bergantung pada keputusan yang dibuat, penterjemah boleh menganalisis program dalam satu atau lebih pas, yang mempengaruhi kelajuan terjemahan.

    Semantik bahasa pengaturcaraan berbeza-beza dalam julat yang sangat luas. Mereka berbeza bukan sahaja dalam spesifik pelaksanaan operasi individu, tetapi juga dalam paradigma pengaturcaraan yang menentukan perbezaan asas dalam kaedah membangunkan program. Spesifik pelaksanaan operasi mungkin melibatkan kedua-dua struktur data yang diproses dan peraturan untuk memproses jenis data yang sama. Bahasa seperti PL/1 dan APL menyokong operasi matriks dan vektor. Kebanyakan bahasa berfungsi terutamanya dengan skalar, menyediakan prosedur dan fungsi yang ditulis oleh pengaturcara untuk mengendalikan tatasusunan. Tetapi walaupun semasa menjalankan operasi menambah dua integer, bahasa seperti C dan Pascal boleh berkelakuan berbeza.

    Bersama-sama dengan pengaturcaraan prosedur tradisional, juga dipanggil imperatif, terdapat paradigma seperti pengaturcaraan berfungsi, pengaturcaraan logik, dan pengaturcaraan berorientasikan objek. Struktur konsep dan objek bahasa sangat bergantung pada paradigma yang dipilih, yang juga mempengaruhi pelaksanaan penterjemah.
    Malah bahasa yang sama boleh dilaksanakan dalam beberapa cara. Ini disebabkan oleh fakta bahawa teori tatabahasa formal membenarkan kaedah yang berbeza untuk menghuraikan ayat yang sama. Selaras dengan ini, penyusun dengan cara yang berbeza boleh memperoleh hasil yang sama (program objek) daripada teks sumber asal.
    Walau bagaimanapun, semua bahasa pengaturcaraan mempunyai beberapa ciri dan parameter yang sama. Kesamaan ini juga menentukan prinsip penyusunan penterjemah yang serupa untuk semua bahasa.
    Bahasa pengaturcaraan direka untuk memudahkan pengaturcaraan. Oleh itu, pengendali dan struktur data mereka lebih berkuasa daripada dalam bahasa mesin.
    Untuk meningkatkan keterlihatan program, bukannya kod berangka, representasi simbolik atau grafik bagi binaan bahasa digunakan, yang lebih mudah untuk persepsi mereka oleh seseorang.
    Untuk mana-mana bahasa ditakrifkan:
    - satu set simbol yang boleh digunakan untuk menulis atur cara yang betul (abjad), elemen asas,
    - set program yang betul (sintaks),
    - "maksud" setiap program yang betul (semantik).
    Terlepas dari kekhususan bahasa, mana-mana penterjemah boleh dianggap sebagai penukar berfungsi F yang menyediakan pemetaan X kepada Y yang jelas, dengan X ialah atur cara dalam bahasa sumber, Y ialah atur cara dalam bahasa sasaran. Oleh itu, proses terjemahan itu sendiri boleh diwakili secara formal dengan agak ringkas dan jelas: Y = F(X).
    Secara rasmi, setiap atur cara X yang betul ialah rentetan simbol daripada beberapa abjad A, yang diubah menjadi rentetan Y yang sepadan, terdiri daripada simbol abjad B.
    Bahasa pengaturcaraan, seperti mana-mana sistem yang kompleks, ditakrifkan melalui hierarki konsep yang mentakrifkan hubungan antara unsur-unsurnya. Konsep-konsep ini berkaitan antara satu sama lain mengikut peraturan sintaksis. Setiap program yang dibina mengikut peraturan ini mempunyai struktur hierarki yang sepadan.
    Dalam hal ini, untuk semua bahasa dan program mereka, ciri umum berikut boleh dibezakan tambahan: setiap bahasa mesti mengandungi peraturan yang membenarkan menjana program yang sepadan dengan bahasa ini atau mengiktiraf surat-menyurat antara program bertulis dan bahasa tertentu.

    Satu lagi ciri ciri semua bahasa ialah semantik mereka. Ia menentukan maksud operasi bahasa, ketepatan operan. Rantaian yang mempunyai struktur sintaksis yang sama dalam bahasa pengaturcaraan yang berbeza mungkin berbeza dalam semantik (yang, sebagai contoh, diperhatikan dalam C++, Pascal, Basic). Pengetahuan tentang semantik bahasa membolehkan memisahkannya daripada sintaksnya dan menggunakannya untuk menukar kepada bahasa lain (untuk menjana kod).

    Tujuan kerja kursus ini adalah untuk membangunkan penterjemah latihan dengan dipermudahkan bahasa teks tahap tinggi.

    1. Kaedah penghuraian

    Pertimbangkan kaedah asas analisis tatabahasa.

    1.1 Penghuraian atas ke bawah

    Apabila menghuraikan dari atas ke bawah, kesimpulan perantaraan bergerak di sepanjang pokok ke arah dari akar ke daun. Dalam kes ini, apabila melihat rantai dari kiri ke kanan, kesimpulan kiri secara semula jadi akan diperolehi. Dalam penghuraian deterministik, masalahnya ialah peraturan yang digunakan untuk mengembangkan bukan terminal paling kiri.

    1.1.1 LL(k) - bahasa dan tatabahasa

    Pertimbangkan pokok keluaran dalam proses mendapatkan keluaran kiri rantai. Rantaian perantaraan dalam proses output terdiri daripada rantaian terminal w, paling kiri bukan terminal A, bahagian x yang kurang dicetak:

    -S--

    / \

    / -A-x-\

    / | \

    -w---u----

    Rajah 1

    Untuk meneruskan penghuraian, ia diperlukan untuk menggantikan bukan terminal A mengikut salah satu peraturan borang A:y. Jika penghuraian diperlukan untuk bersifat deterministik (tiada penjejakan ke belakang), peraturan ini mesti dipilih dengan cara yang istimewa. Tatabahasa dikatakan mempunyai sifat LL(k) jika, untuk memilih peraturan, memadai untuk mempertimbangkan hanya wAx dan aksara k pertama bagi rentetan u yang belum dicari. Huruf pertama L (Kiri, kiri) merujuk kepada melihat rentetan input dari kiri ke kanan, yang kedua - ke output kiri yang digunakan.

    Kami mentakrifkan dua set rantai:

    a) PERTAMA(x) - set rentetan terminal yang diterbitkan daripada x, dipendekkan kepada k aksara.

    b) FOLLOW(A) - satu set rentetan terminal dipendekkan kepada k, yang boleh serta-merta mengikut A dalam rentetan keluaran.

    Tatabahasa mempunyai sifat LL(k) jika daripada kewujudan dua rantai inferens kiri:

    S::wAx:wzx::wu

    S::wAx:wtx::wv

    keadaan FIRST(u)=FIRST(v) membayangkan z=t.

    Dalam kes k=1, untuk memilih peraturan untuk A, cukup untuk mengetahui hanya bukan terminal A dan a - aksara pertama rentetan u:

    - pilih peraturan A:x jika a dalam FIRST(x),

    - peraturan A:e harus dipilih jika a disertakan dalam FOLLOW(A).

    LL(k)-property mengenakan sekatan yang agak kuat terhadap tatabahasa. Contohnya, tatabahasa LL(2) S: aS | a tidak mempunyai harta LL(1), kerana PERTAMA(aS)=PERTAMA(a)=a. DALAM kes ini anda boleh menurunkan nilai k menggunakan "pemfaktoran" (merangkumi faktor):

    S:aA

    A: S | e

    Mana-mana LL(k)-tatabahasa adalah unik. Tatabahasa rekursif kiri bukan milik LL(k) untuk mana-mana k. Kadangkala adalah mungkin untuk menukar tatabahasa bukan LL(1) kepada tatabahasa LL(1) yang setara dengan menghapuskan rekursi kiri dan pemfaktoran. Walau bagaimanapun, masalah kewujudan tatabahasa LL(k)-setara untuk tatabahasa bukan LL(k)-sewenang-wenangnya tidak dapat diputuskan.

    1.1.2 Kaedah penurunan rekursif

    Kaedah turunan rekursif tertumpu pada kes-kes apabila pengkompil diprogramkan dalam salah satu bahasa peringkat tinggi, apabila penggunaan prosedur rekursif dibenarkan.

    Idea asas keturunan rekursif ialah setiap nonterminal tatabahasa dikaitkan dengan prosedur yang mengiktiraf sebarang rentetan yang dihasilkan oleh bukan terminal ini. Prosedur ini memanggil satu sama lain apabila diperlukan.

    Keturunan rekursif boleh digunakan untuk mana-mana tatabahasa LL(1). setiap bukan terminal tatabahasa sepadan dengan prosedur yang bermula dengan peralihan kepada label yang dikira dan mengandungi kod yang sepadan dengan setiap peraturan untuk bukan terminal ini. Bagi simbol input yang tergolong dalam set pilihan peraturan yang diberikan, peralihan yang dikira memindahkan kawalan kepada kod yang sepadan dengan peraturan ini. Untuk aksara input yang lain, kawalan beralih kepada rutin pengendalian ralat.

    Kod mana-mana peraturan mengandungi operasi untuk setiap aksara yang disertakan di sebelah kanan peraturan. Operasi disenaraikan dalam susunan simbol muncul dalam peraturan. Selepas operasi terakhir, kod tersebut mengandungi pulangan daripada prosedur.

    Penggunaan turunan rekursif dalam bahasa peringkat tinggi memudahkan program dan nyahpepijat.

    1.2 Penghuraian bawah ke atas

    Mari kita pertimbangkan penghuraian bawah ke atas, di mana kesimpulan perantaraan bergerak di sepanjang pokok ke arah akar. Jika anda membaca aksara rentetan dari kiri ke kanan, maka pokok parse akan kelihatan seperti ini:

    -S--

    / \

    /-x-\

    / | \

    --w--b--u-

    Rajah 2

    Output perantaraan mempunyai bentuk xbu, di mana x ialah rantaian terminal dan bukan terminal dari mana bahagian imbasan rantai terminal w adalah output, bu ialah bahagian tidak diimbas pada rantai terminal, b ialah aksara seterusnya. Untuk meneruskan penghuraian, anda boleh sama ada menambah aksara b pada bahagian rantai yang diimbas (lakukan apa yang dipanggil "anjakan"), atau pilih di hujung x rantaian z (x=yz) yang satu daripada tatabahasa peraturan B:z boleh digunakan pada z dan menggantikan x pada rantai yB (melakukan apa yang dipanggil "konvolusi"):

    -S-- -S--

    / \ / \

    /-x-b- \ /yB- \

    / | \ / | \

    --w--b--u- --w--b--u-

    Rajah 3 - Selepas syif Rajah 4 - Selepas lilitan

    Jika lilitan digunakan hanya pada aksara terakhir x, maka kita akan mendapat kesimpulan yang betul bagi rantai itu. Penghuraian ini dipanggil LR, di mana simbol L (Kiri, kiri) merujuk kepada melihat rantai dari kiri ke kanan, dan R (Kanan, kanan) merujuk kepada output yang terhasil.

    Urutan operasi syif dan kontrak adalah penting. Oleh itu, penghuraian deterministik memerlukan anda memilih antara anjakan dan penguncupan (dan peraturan lilitan yang berbeza) pada setiap saat.

    1.2.1 LR(k) - tatabahasa

    Jika, semasa penghuraian LR, adalah mungkin untuk membuat keputusan anjakan/penguncupan deterministik dengan hanya mempertimbangkan rentetan x dan aksara k pertama bahagian yang tidak diimbas bagi rentetan input u (aksara k ini dipanggil rentetan lanjutan), tatabahasa dikatakan mempunyai LR(k)-property.

    -S--

    / \

    /-x-\

    --w----u--

    Rajah 5

    Perbezaan antara tatabahasa LL(k)- dan LR(k)-dari segi pokok terbitan:

    -S-

    / | \

    /A\

    / / \ \

    -w---v---u-

    Rajah 6

    Dalam kes LL(k)-tatabahasa, seseorang boleh secara unik menentukan peraturan yang digunakan pada A dengan w dan simbol k pertama vu, dan dalam kes LR(k)-tatabahasa, oleh w,v dan k pertama simbol u. Hujah longgar ini menunjukkan bahawa LL(k)-languages< LR(k)-языки (при k > 0).

    1.2.1.1 LR(0) - tatabahasa

    Pertimbangkan dahulu tatabahasa termudah kelas ini - LR(0). Apabila menghuraikan rentetan dalam bahasa LR(0), anda tidak perlu menggunakan rantai utama sama sekali - pilihan antara anjakan dan penguncupan dibuat berdasarkan rentetan x. Oleh kerana ia hanya berubah dari hujung kanan semasa penghuraian, ia dipanggil tindanan. Kami akan menganggap bahawa tiada aksara yang tidak berguna dalam tatabahasa dan aksara awal tidak berlaku di bahagian yang betul dalam peraturan - maka konvolusi kepada aksara awal menandakan kejayaan menyelesaikan penghuraian. Mari cuba huraikan set rangkaian terminal dan bukan terminal yang muncul pada tindanan semasa semua penghuraian LR (dengan kata lain, inferens yang betul daripada tatabahasa).

    Kami mentakrifkan set berikut:

    L(A:v) - konteks kiri peraturan A:v - set keadaan tindanan, sejurus sebelum keruntuhan v menjadi A semasa semua penghuraian LR berjaya. Jelas sekali, setiap rentetan dalam L(A:v) berakhir dengan v. Jika ekor v semua rantai tersebut terputus, maka kita mendapat set rantai yang berlaku di sebelah kiri A dalam proses semua inferens kanan yang berjaya. Nyatakan set ini L(A) - konteks kiri bagi bukan terminal A.

    Mari kita bina tatabahasa untuk set L(A). Terminal dan bukan terminal tatabahasa asal akan menjadi terminal tatabahasa baharu; bukan terminal tatabahasa baharu akan dilambangkan ,... - nilai mereka akan menjadi konteks kiri bukan terminal tatabahasa asal. Jika S ialah simbol awal tatabahasa asal, maka tatabahasa konteks kiri akan mengandungi peraturan : e - konteks kiri S mengandungi rentetan kosong Untuk setiap peraturan tatabahasa asal, cth. A: B C d E

    dan tambahkan peraturan pada tatabahasa baharu:

    : - L(B) termasuk L(A)

    : B - L(C) termasuk L(A) B

    : B C d - L(E) termasuk L(A) B C d

    Tatabahasa yang terhasil mempunyai jenis istimewa(tatabahasa sedemikian dipanggil linear kiri), oleh itu set konteks kiri

    - adalah biasa. Berikutan daripada ini bahawa keahlian rentetan dalam konteks kiri beberapa bukan terminal boleh dikira secara induktif menggunakan automaton terhingga, mengimbas rentetan dari kiri ke kanan. Mari kita huraikan proses ini secara membina.

    Mari kita panggil LR(0)-situasi peraturan tatabahasa dengan satu kedudukan bertanda antara simbol sebelah kanan peraturan. Contohnya, untuk tatabahasa S:A; A:aAA; A:b terdapat LR(0)-situasi berikut: S:_A; S:A_; A:_aAA; A:a_AA; A:aA_A; A:aAA_; A:_b; A:b_. (kedudukan ditunjukkan dengan garis bawah).

    Kami akan mengatakan bahawa rantai x adalah konsisten dengan situasi А:b_c jika x=ab dan a kepunyaan L(A). (Dengan kata lain, inferens LR boleh diteruskan x_... = ab_...:: abc_...:: aA_...:: S_.) Dalam istilah ini, L(A:b) ialah set bagi rentetan yang sepadan dengan situasi A:b_, L(A)

    - rantaian selaras dengan situasi A:_b untuk sebarang peraturan A:b.

    Biarkan V(u) ialah set situasi yang konsisten dengan u. Mari kita tunjukkan bahawa fungsi V ialah induktif.

    Jika set V(u) termasuk situasi A:b_cd, maka situasi A:bc_d tergolong dalam V(uc). (c - terminal atau bukan terminal; b, d - jujukan (mungkin kosong) terminal dan bukan terminal). Tiada situasi lain seperti A:b_d, dengan b tidak kosong dalam V(uc). Ia kekal untuk menambah situasi dalam bentuk C:_... kepada V(uc) untuk setiap C bukan terminal yang konteks kirinya mengandungi uc. Jika situasi A:..._C... (C-nonterminal) tergolong dalam set V(uc), maka uc tergolong dalam L(C) dan V(uc) termasuk situasi dalam bentuk C:_... untuk semua peraturan tatabahasa C-.

    V(e) mengandungi situasi S:_... (aksara S-awal), serta situasi A:_... jika bukan terminal A berlaku serta-merta selepas _ dalam situasi yang sudah termasuk dalam V(e) .

    Akhir sekali, kami bersedia untuk mentakrifkan tatabahasa LR(0). Biarkan u menjadi kandungan tindanan semasa penghuraian LR, dan biarkan V(u) ialah set situasi LR(0) yang selaras dengan u. Jika V(u) mengandungi situasi dalam bentuk A:x_ (jujukan x bagi terminal dan bukan terminal), maka u tergolong dalam L(A:x) dan x boleh dilipat menjadi A. Jika V(u) mengandungi situasi A:..._a. .. (a-terminal), maka syif dibenarkan. Seseorang bercakap tentang konflik anjakan-kurangkan jika kedua-dua anjakan dan penguncupan dibenarkan untuk rentetan u yang sama. Seseorang bercakap tentang konflik lipatan lipatan jika lipatan dibenarkan mengikut peraturan yang berbeza.

    Tatabahasa dipanggil LR(0) jika tiada konflik lipatan anjakan atau gulung ke bawah untuk semua keadaan tindanan dalam proses inferens LR.

    1.2.1.2 LR(k) - tatabahasa

    Hanya keadaan tindanan digunakan dalam penghuraian LR(0) untuk memilih antara beralih atau menguncup. Penghuraian LR(k) juga mengambil kira aksara k-pertama bagi bahagian rentetan input yang tidak kelihatan (yang dipanggil pra-rentetan). Untuk mewajarkan kaedah, seseorang harus mengulangi hujah-hujah bahagian sebelumnya dengan teliti, membuat perubahan pada definisi.

    Kami juga akan memasukkan rantaian awal dalam konteks kiri peraturan. Jika terbitan yang betul menggunakan terbitan wAu: wvu, maka pasangan wv,FIRSTk(u) adalah milik Lk(A:v), dan pasangan w,FIRSTk(u) milik Lk(A). Set konteks kiri, seperti dalam kes LR(0), boleh dikira menggunakan aruhan pada rantai kiri. Mari kita panggil LR(k)-situasi pasangan: peraturan tatabahasa dengan kedudukan bertanda dan rantaian lanjutan panjang paling banyak k. Kami akan memisahkan peraturan daripada rantaian pendahuluan dengan garis menegak.

    Kami akan mengatakan bahawa rantai x konsisten dengan situasi A:b_c|t jika terdapat LR-output: x_yz = ab_yz:: abc_z:: aA_z:: S_, dan FIRSTk(z)=t. Peraturan untuk pengiraan induktif set keadaan Vk adalah seperti berikut:

    Vk(e) mengandungi situasi S:_a|e untuk semua peraturan S:a, dengan S ialah simbol awal. Untuk setiap situasi A:_Ba|u daripada Vk(e), setiap peraturan B:b, dan rantai x kepunyaan FIRSTk(au), situasi B:_b|x mesti ditambah kepada Vk(e).

    Jika situasi A:b_cd|u memasuki Vк(w), maka situasi A:bc_d|u akan menjadi milik Vk(wc). Untuk setiap situasi A:b_Cd|u daripada Vk(wc), setiap peraturan C:f, dan rantai x kepunyaan FIRSTk(du), kita mesti menambah situasi C:_f|x kepada Vk(wc).

    Kami menggunakan set keadaan LR(k) yang dibina untuk menyelesaikan masalah anjakan-konvolusi. Biarkan u menjadi kandungan tindanan dan x menjadi rantai pendahuluan. Jelas sekali, lilitan A:b boleh dilakukan jika Vk(u) mengandungi situasi A:b_|x. Memutuskan sama ada anjakan boleh diterima memerlukan ketepatan jika tatabahasa mengandungi e-peraturan. Dalam situasi A:b_c|t (c tidak kosong), anjakan adalah mungkin jika c bermula dari terminal dan x milik FIRSTk(ct). Secara tidak rasmi, anda boleh menolak aksara paling kiri di sebelah kanan peraturan ke tindanan, menyediakan lilitan seterusnya. Jika c bermula daripada bukan terminal (keadaan kelihatan seperti A:b_Cd|t), kemudian menolak simbol ke dalam tindanan, menyediakan lipatan dalam C, adalah mungkin hanya jika C tidak menjana rentetan kosong. Contohnya, dalam keadaan V(e)= S:_A|e; A:_AaAb|e,a, A:_|e,a apabila memperoleh rantai terminal daripada A, pada beberapa langkah ia diperlukan untuk menggunakan peraturan A:e kepada bukan terminal A yang terletak di hujung kiri rantai.

    Mari kita takrifkan set EFFk(x) yang terdiri daripada semua elemen set FIRSTk(x) yang terbitannya tidak menggantikan nonterminal di hujung kiri x (jika ada) dengan rentetan kosong. Dalam istilah ini, anjakan boleh diterima jika set Vk(u) mengandungi situasi А:b_c|t, c tidak kosong dan x milik EFFk(ct).

    Tatabahasa dipanggil LR(k)-tatabahasa jika tiada keadaan LR(k) mengandungi dua situasi A:b_|u dan B:c_d|v supaya u tergolong dalam EFFk(dv). Pasangan sedemikian sepadan dengan konflik lipatan lipatan jika d kosong, dan konflik lipatan anjakan jika d tidak kosong.

    Dalam praktiknya, tatabahasa LR(k) tidak digunakan untuk k>1. Terdapat dua sebab untuk ini. Pertama: bilangan negeri LR(k) yang sangat besar. Kedua, bagi mana-mana bahasa yang ditakrifkan oleh tatabahasa LR(k), wujud tatabahasa LR(1); tambahan pula, terdapat LR(1)-tatabahasa untuk mana-mana bahasa CF yang menentukan.

    Bilangan LR(1)-keadaan untuk praktikal tatabahasa yang menarik juga sangat besar. Tatabahasa sedemikian jarang mempunyai sifat LR(0). Dalam amalan, kaedah perantaraan antara LR(0) dan LR(1) lebih biasa digunakan, dikenali sebagai dan LALR(1).

    1.2.2 tatabahasa LALR(1).

    Kedua-dua kaedah ini adalah berdasarkan idea yang sama. Mari kita bina satu set kanonik LR(0)-keadaan tatabahasa. Jika set ini tidak mengandungi konflik, maka penghurai LR(0) boleh digunakan. Jika tidak, kami akan cuba menyelesaikan konflik yang timbul dengan mempertimbangkan pra-rentetan aksara tunggal. Dalam erti kata lain, mari kita cuba membina parser LR(1) dengan set keadaan LR(0).

    Kaedah LALR(1) (Pandang Ke Hadapan) adalah seperti berikut. Mari kita perkenalkan hubungan kesetaraan pada set LR(1)-situasi: kita akan mempertimbangkan dua situasi setara jika ia berbeza hanya dalam rantaian awal. Sebagai contoh, situasi A:Aa_Ab|e dan A:Aa_Ab|a adalah setara. Mari kita bina satu set kanonik LR(1)-keadaan dan satukan keadaan yang terdiri daripada satu set situasi setara.

    Jika set keadaan yang terhasil tidak mengandungi konflik LR(1), dan oleh itu membolehkan kita membina penghurai LR(1), maka tatabahasa dikatakan mempunyai sifat LALR(1).

    2. Perkembangan penterjemah

    2.1 Analisis keperluan

    Dalam kerja kursus ini, adalah perlu untuk membangunkan penterjemah latihan dalam bentuk jurubahasa daripada bahasa yang ditakrifkan oleh tatabahasa formal yang sepadan. Terdapat empat peringkat utama dalam pembangunan jurubahasa:

    Mereka bentuk penganalisis leksikal;

    Mereka bentuk mesin majalah;

    Pelaksanaan perisian penghurai;

    Pembangunan modul tafsiran.

    Pembangunan akan dijalankan menggunakan operasi sistem Windows XP dihidupkan komputer peribadi IBM PC dengan pemproses Intel Pentium IV.

    Berdasarkan trend pembangunan perisian Bahasa pengaturcaraan C# dalam Visual Studio 2010 telah dipilih untuk melaksanakan penterjemah latihan.

    2.2 Reka bentuk

    2.1.1 Mereka bentuk penganalisis leksikal

    Leksikal analisis termasuk pengimbasan program terjemahan (sumber) dan pengecaman leksem yang membentuk ayat teks sumber. Token termasuk, khususnya, kata kunci, tanda operasi, pengecam, pemalar, aksara khas, dsb.

    Hasil kerja penganalisis leksikal (pengimbas) ialah urutan token, dan setiap token biasanya diwakili oleh beberapa kod dengan panjang tetap (contohnya, integer), serta pengeluaran mesej tentang sintaksis (leksikal ) ralat, jika ada. Jika leksem itu, sebagai contoh, kata kunci, maka kodnya memberikan keseluruhannya maklumat yang diperlukan. Dalam kes, sebagai contoh, pengecam, nama pengecam yang diiktiraf juga diperlukan, yang biasanya direkodkan dalam jadual pengecam, teratur, sebagai peraturan, menggunakan senarai. Jadual yang serupa diperlukan untuk pemalar.

    Leksem boleh diterangkan oleh dua ciri utama. Salah satu daripadanya ialah kepunyaan leksem kepada kelas tertentu (pembolehubah, pemalar, operasi, dll.). Atribut kedua mentakrifkan elemen khusus kelas ini.

    Jenis jadual simbol tertentu (struktur data) tidak berkaitan dengan lexer atau parser. Kedua-duanya hanya perlu menyediakan keupayaan untuk mendapatkan indeks yang mengenal pasti secara unik, contohnya, pembolehubah yang diberikan dan mengembalikan nilai indeks untuk menambah maklumat tentang nama pembolehubah yang diberikan dalam jadual simbol.

    Melihat jadual pengecam melaksanakan dua fungsi utama:

    a) menulis nama baharu pada jadual apabila memproses pengisytiharan pembolehubah;

    b) cari nama yang direkodkan sebelum ini dalam jadual.

    Ini memungkinkan untuk mengesan situasi yang salah seperti perihalan berbilang pembolehubah dan kehadiran pembolehubah yang tidak diisytiharkan.

    Pembangunan penganalisis leksikal sebahagiannya terdiri daripada pemodelan pelbagai automata untuk mengenal pasti pengecam, pemalar, perkataan terpelihara, dsb. Jika token jenis yang berbeza bermula dengan watak yang sama atau urutan aksara yang sama, mungkin perlu untuk menggabungkan pengiktirafan mereka.

    Dengan menjalankan penganalisis leksikal, kami memecahkan program kami kepada token, selepas itu setiap token melepasi semakan panjang (token tidak boleh lebih daripada 11 aksara). Setelah berjaya melepasi peringkat ini, kami menyemak ketepatan lokasi token (kata kunci var, begin, end, for, to, do, end_for). Kemudian kami menganalisis token pembolehubah - ia tidak sepatutnya mengandungi nombor dalam perihalannya dan diulang. hidup langkah terakhir semak ejaan token (kata kunci, pengecam yang tidak diketahui). Jika sekurang-kurangnya satu daripada semakan melemparkan ralat, penganalisis leksikal mencetak ralat.

    Skema program kerja penganalisis leksikal diberikan dalam Lampiran B dalam Rajah B.1.

    2.2.2 Mereka bentuk majalah automatik

    Mari kita takrifkan tatabahasa berikut:

    G: (Vt, Va, I, R),

    di mana Vt ialah set simbol terminal, Va ialah set simbol bukan terminal, I ialah keadaan awal tatabahasa, R ialah set peraturan tatabahasa.

    Untuk tatabahasa ini, kami mentakrifkan set simbol terminal dan bukan terminal:

    Mari kita susun peraturan untuk tatabahasa G kita dan bentangkannya dalam Jadual 1.

    Jadual 1 - Peraturan tatabahasa

    nombor peraturan

    Bahagian kiri peraturan

    Bahagian kanan peraturan

    f ID = EX t EX d LE n;

    Sambungan jadual 1.

    nombor peraturan

    Bahagian kiri peraturan

    Bahagian kanan peraturan

    Penamaan leksem, terjemahan leksem kepada kod dan senarai sebutan tatabahasa masing-masing diberikan dalam jadual 2, 3, 4.

    Jadual 2 - Notasi leksem

    Notasi Lexeme

    kata kunci "mulakan" (permulaan perihalan tindakan)

    kata kunci "tamat" (akhir perihalan tindakan)

    kata kunci "var" (pengisytiharan pembolehubah)

    kata kunci "baca" (penyata kemasukan data)

    kata kunci "tulis" (pernyataan output data)

    kata kunci "untuk" (penyataan gelung)

    kata kunci "kepada"

    kata kunci "buat"

    kata kunci "end_case" (akhir penyataan gelung)

    jenis pembolehubah "integer"

    operasi tambah

    operasi tolak

    operasi darab

    aksara pemisah ":"

    aksara pemisah ";"

    aksara pemisah "("

    watak pemisah ")"

    aksara pemisah ","

    Notasi Lexeme

    aksara pemisah "="

    Jadual 3 - Terjemahan leksem kepada kod

    <цифра>

    <буква>

    Jadual 4 - Senarai simbol tatabahasa

    Jawatan

    Penjelasan

    Program

    Penerangan pengiraan

    Penerangan pembolehubah

    Senarai pembolehubah

    Operator

    Tugasan

    Ungkapan

    subungkapan

    Operasi Binari

    Operasi unary

    Senarai tugasan

    Pengecam

    berterusan

    Mari kita bina pengecam menaik yang menentukan.

    Pertimbangkan perhubungan berikut untuk membina penyelesai bawah ke atas yang menentukan:

    a) Jika terdapat simbol kumpulan B sehingga rentetan AB dimasukkan dalam beberapa peraturan tatabahasa dan terdapat simbol xPERV "(B), maka kita akan menganggap bahawa antara simbol x dan A hubungan x SELEPAS A ditakrifkan.

    b) Jika dalam tatabahasa tertentu terdapat peraturan B-\u003e bAb A, BV a, maka antara A dan x hubungan A CONVERT x ditentukan.

    Semua tatabahasa kita tetap sama, iaitu:

    G: (Vt, Va, I, R),

    dan peraturan tatabahasa D diberikan dalam Jadual 5.

    Jadual 5 - Peraturan tatabahasa

    nombor peraturan

    Bahagian kiri peraturan

    Bahagian kanan peraturan

    f ID = EX t EX d LE n;?

    Sambungan jadual 5.

    nombor peraturan

    Bahagian kiri peraturan

    Bahagian kanan peraturan

    di mana? - penanda untuk hujung rantai.

    Mari kita tentukan beberapa kes:

    a) ID terdiri daripada satu set huruf abjad Latin, iaitu, kita akan menganggap bahawa u = ( a, b, c, d, e, f, g, h, i, j, k, l, m , n, o, p,q,r,s, t, u, v, w, x, y, z)

    b) Pemalar CO terdiri daripada nombor, iaitu, kita akan menganggap bahawa k = (0,1,2,3,4,5,6,7,8,9)

    Agar tatabahasa kami menjadi strategi keutamaan bercampur, syarat berikut mesti dipenuhi:

    a) Ketiadaan e-peraturan

    b) Adakah terdapat peraturan di bawahnya x SELEPAS A? A TUKAR x = ?

    c) A -> olehYg

    dan adalah perlu bahawa DALAM SELEPAS x? DALAM TUKAR x = ?

    iaitu dalam tatabahasa mereka akan dilakukan DALAM SELEPAS x atau A SELEPAS x, di mana x ialah simbol-predikat bagi rantai b.

    a) PERV "(PG) \u003d (PG?)

    PRIM"(RG) = PRIM(DE) = (RG, v,:, i,;)

    PRIM" (AL) = PRIM (b LE e)= (AL, b, e)

    PERV" (DE) = PERV (v LV: i;) = (DE, v,:, i,;)

    PERV" (LV) = PERV (ID, LV) = ( LV, ID )

    PERV" (OP) =(OP, ID, CO)

    PERV" (EQ) = PERV(ID = EX;) = (EQ, =,;)

    PERV" (EX) = (EX, SB, -)

    PERV" (BO) =(B0, +,*,-)

    PERTAMA" (SB) = PERTAMA((EX)SB) ? PERTAMA(OP) ? PERTAMA(VO)=(SB, (,), OP, BO);

    PERV" (LE) = PERV(EQ) = (LE, (,), =,;, f, t, d, n, w, r)

    PERV" (UO) = (UO,-)

    PERV" (ID)= PERV" (u) = (u)

    PERV" (CO) = PERV" (k) = (k)PERV" (e) =( e)

    PERV" (b) =( b)

    PERV" (e) =( e)

    PERV" (v) =( v)

    PERV" (w) =( w)

    PERV" (r) =( r)

    PERV" (i) =( i)

    PERV" (f) =( f)

    PERV" (d) = (d)

    PERV" (n) =( n)

    PERV" (c) =( c)

    PERV" (+) =( +)

    PERV" (*) =( *)

    PERV" (-) =(-)

    PERV" (,) =(,)

    PERV" (;) =(;)

    PERV" (:) =(:)

    PERV" (=) = ( = )

    PERV" (() =( ()

    PERV" ()) =() )

    PERV" (u) =(u)

    PERV" (k) = (k)

    b) SETERUSNYA `(AL) = (?)?SETERUSNYA"(PG)=(?,b,e)

    SETERUSNYA ` (DE) = (?)?PRIM"(AL)= (?, b, e )

    SETERUSNYA ` (LV) = (?)?PRIM"(:)= (?,:)

    SETERUSNYA ` (OP) = (?)?PRIM"(SB)= (?,;,), d, t, +, -, *)

    SETERUSNYA ` (EQ) = (?)?PERTAMA"(LE)=(?, (,),;, f, =, t, d, n,w,r )

    SETERUSNYA ` (EX) = (?)?PRIM"(t)?PRIM"(d)?PRIM"(;)?PRIM"())=(?, t,d,;,))

    SETERUSNYA ` (BO) = (?)?PERTAMA"(SB)= (?, (,), OP, BO)

    SETERUSNYA ` (UO) = (?)?PRIM"(SB)= (?, (,), OP, BO)

    SETERUSNYA ` (SB) = (?)?SETERUSNYA"(EX)= (?, t,d,;,), +, *, -)

    SETERUSNYA ` (LE) = (?) ?PRIM"(e) ?PRIM"(n) = (?, e, n)

    SETERUSNYA `(ID)=(?)? SETERUSNYA" (OP) ? PERTAMA" (=) =(?,;,), d, t, +, -, *, =)

    SETERUSNYA `(CO) = (?)? SETERUSNYA" (OP)= (?,;,), d, t, +, -, *, =)

    SETERUSNYA ` (b) =(?)?PRIM"(LE)= (?, u, =,;)

    SETERUSNYA ` (e) =(?)?SETERUSNYA"(AL)= (?, b)

    SETERUSNYA ` (v) =(?)?PRIM"(LV)= (?, u )

    SETERUSNYA ` (w) =(?)?PRIM"(()= (?, ()

    SETERUSNYA ` (r) =(?)?PRIM"(() = (?, ()

    SETERUSNYA ` (i) =(?)?PRIM"(;)= (?,; )

    SETERUSNYA ` (f) =(?)?PRIM"(ID) = (?, u)

    SETERUSNYA ` (d) =(?)?PRIM"(LE)= (?, u, =,;)

    SETERUSNYA ` (n) =(?)?PRIM"(i) = (?, i )

    SETERUSNYA ` (+) =(?)?SETERUSNYA"(DALAM) = (?, +,*,-)

    SETERUSNYA ` (-) =(?)?SETERUSNYA"(DALAM) = (?, +,*,-)

    SETERUSNYA ` (*) =(?)?SETERUSNYA"(IN) = (?, +,*,-)

    SETERUSNYA ` (;) =(?)?NEXT" (DE)?NEXT `(LE1)?NEXT" (EQ) = (?, b, e, l, u )

    SETERUSNYA ` (:) =(?)?PRIM"(i)= (?, i )

    SETERUSNYA ` (=) = (?)?PERTAMA"(EX) = (? (,), u, k, +, -, *)

    SETERUSNYA ` (() =(?)?PRIM"(DE)= (?, v,:, i,;)

    SETERUSNYA ` ()) =(?)? PERV"(;) = (?,; )

    SETERUSNYA ` (,) =(?)? PERV"(LV) = (?, u)

    SETERUSNYA `(u)=(?)? PERV" (ID)= ( u, ?)

    SETERUSNYA `(k)=(?)? PERV (CO)= (?, k)

    c) PG -> DE AL

    AL SELEPAS DE = (b,e) SELEPAS DE = ((b DE), (e DE) )

    e SELEPAS LE = ((e LE))

    LE SELEPAS b = ((,), =,;, f, t, d, n, w, r) SELEPAS b = (((b), ()b), (=b), (;b), ( f b), (t b), (d b), (n b), (w b), (r b))

    ;SELEPAS i = ((; i))

    i SELEPAS: = ( (i:) )

    : SELEPAS LV = ( (: LV) )

    LV SELEPAS v = ( (ID, v) )

    LV SELEPAS, = ((ID,))

    SELEPAS ID = ((,u))

    LE SELEPAS EQ = ((,), =,;, f, t, d, n, w, r ) SELEPAS EQ = (((EQ), () EQ), (= EQ), (; EQ), ( f EQ), (t EQ), (d EQ), (n EQ), (w EQ), (r EQ))

    LE -> r (DE);

    ; SELEPAS) = ((;)))

    ) SELEPAS DE = (((DE))

    DE SELEPAS (= (= ((v)), (:)), (i)), (;)), (e)))

    (SELEPAS r = (((r))

    LE -> w (DE);

    ; SELEPAS) = ((;)))

    ) DE TERAKHIR = (((DE))

    DE SELEPAS (= ((v)), (:)), (i)), (;)), (e)))

    (SELEPAS w = (((w)))

    LE -> f ID = EX t EX d LE n;

    ; SELEPAS n = ((;n))

    n SELEPAS LE = ( (n, LE))

    LE SELEPAS d = ( ((,), =,;, f, t, d, n, w, r)) ? SELEPAS d = (((d), ()d), (;d), (f d), (t d), (d d), (n d), (w d), (r d))

    d SELEPAS EX = ((d, EX))

    EX SELEPAS t = (BO, -) ? SELEPAS t = ((BO t), (- t))

    t SELEPAS EX = ( t EX)

    EX SELEPAS == ((BO, -) ? SELEPAS == ((BO=), (-=))

    SELEPAS ID=((=ID))

    ID SELEPAS f = ((ID f))

    EQ -> ID = EX;

    ; SELEPAS EX = ((; EX )

    BEKAS SELEPAS == (BO, -) ? SELEPAS == ((BO=), (-=))

    SELEPAS u = ( (=u))

    SB SELEPAS UO = ( (,), OP, BO ) SELEPAS UO = (((UO), (OP UO), (BO UO) )

    ) SELEPAS EX = ( ()EX) )

    EX SELEPAS (= (BO, -) ? SELEPAS (= ((BO (), (- ()))

    SB->SB BO SB

    SB SELEPAS BO = ((,), OP, BO) SELEPAS BO = (((BO), ()BO), (OP BO), (BO BO))

    BO SELEPAS SB = (+,*,-) SELEPAS SB = ((+SB), (*SB), (-SB))

    ID SELEPAS u = ((u, u))

    G) PG ->DE AL

    AL ROLL PG = AL ROLL NEXT" (PG) = ((AL ?))

    e ROLL AL = e ROLL NEXT"(AL)= ((eb), (e?))

    =; LIPAT SETERUSNYA"(DE) = ((;b), (;?))

    ALIRAN LV LV = ALIRAN LV SETERUSNYA" (LV) = ((LV:), (LV?))

    ID ROLL LV = ID ROLL NEXT" (LV) = ((ID:), (ID ?))

    ; TUKAR LE=; LIPAT SETERUSNYA" (LE) = ((; e), (;?), (;n))

    LE -> f ID = EX t EX d LE n;

    ; TUKAR LE=; LIPAT SETERUSNYA" (LE) = ((; e), (;?), (;n))

    EQ ROLL LE = EQ ROLL NEXT" (LE) = ((EQ e), (EQ?), (EQ n))

    EQ -> ID = EX;

    ; TUKAR EQ=; LIPAT SETERUSNYA" (EQ) = ((; (), (;)), (;;), (;f), (;?), (;=), (;t), (;d), (; n), (;w), (;r))

    SB ROLL EX = SB ROLL NEXT" (EX) = ((SB t), (SB?), (SB d), (SB)), (SB;), (SB(), (SB=), (SBf ), (SBn), (SBw), (SBr) )

    ) SB ROLL = SB NEXT ROLL" (SB) = (() t), ()?), () d), ())), ();))

    OP ROLL SB = OP ROLL NEXT" (SB) = ((OP t), (OP ?), (OP d), (OP)), (OP;))

    SB->SB BO SB

    SB ROLL SB = SB ROLL NEXT" (SB) = ((SB, t), (SBd), (SB;). (SB)), (SB+), (SB-), (SB*), (SB? ) }

    GULUNG UO = - GULUNG SETERUSNYA" (UO) = ( (-?), (--))

    ROLL BO = + ROLL NEXT" (BO) = ((++), (+?), (+*), (+-))

    * GULUNG BO = * GULUNG SETERUSNYA" (BO) = ((*+), (*?), (**), (*-))

    GULUNG BO = - GULUNG SETERUSNYA" (BO) = ((-+), (-?), (-*), (--))

    ID ROLL OP = ID ROLL NEXT" (OP) = ((ID+), (ID?), (ID*), (ID-))

    CO LIPAT OP = CO LIPAT SETERUSNYA" (OP) = ((CO+), (CO?), (CO*), (CO-), (CO;), (COd), (COt), (CO)))

    ID ROLL ID = ID ROLL NEXT" (ID) = ((ID)), (ID ?), (ID k), (ID+), (ID-), (ID*), (ID=), (IDt) , (IDd)))

    u ROLL ID = l ROLL NEXT" (ID) = ((u)), (u?), (uk), (u+), (u-), (u*), (u=), (ut), (ud)))

    CO ROLL CO = CO ROLL NEXT" (CO) = (CO+), (CO?), (CO*), (CO-), (CO;), (COd), (COt), (CO)))

    k GULUNG CO = k GULUNG SETERUSNYA" (CO) = (k+), (k?), (k*), (k-), (k;), (kd), (kt), (k)))

    Satu situasi konflik ditemui semasa melipat peraturan

    OP ->ID dan ID -> u ID

    Kami memasukkan ID1 -> ID, oleh itu kami menulis semula peraturan ID1 -> ID u

    Oleh itu, kami akan menjalankan operasi lilitan.

    ID1 ROLL ID = ID1 ROLL NEXT" (ID) = ((ID1)), (ID1 ?), (ID1 k), (ID1+), (ID1-), (ID1*), (ID1=), (ID1t) , (ID1d)))

    Bagi setiap pasangan (x, A)? x SELEPAS A kita membina fungsi peralihan yang menentukan tindakan pemindahan ?? (S 0, x, A) \u003d (S 0, A)

    ? (S0, b, DE) = (S0, DEb)

    ? (S0, e, DE) = (S0, DEe)

    ? (S0, e, LE) = (S0, LEe)

    ? (S0,), b) = (S0, b))

    ? (S0,;, b) = (S0, b;)

    ? (S0, (, b) = (S0, b()

    ? (S0, =, b) = (S0, b=)

    ? (S0, f, b) = (S0, bf)

    ? (S0, t, b) = (S0, bt)

    ? (S0, d, b) = (S0, bd)

    ? (S0, n, b) = (S0, bn)

    ? (S0, w, b) = (S0, bw)

    ? (S0, r, b) = (S0, br)

    ? (S0,;, i) = (S0, i;)

    ? (S0, i, :) = (S0, i :)

    ? (S0,:LV) = (S0,LV:)

    ? (S0, ID, v) = (S0, vID)

    ? (S0,ID,) = (S0,ID)

    ? (S0, u) = (S0, u,)

    ? (S0, (, EQ)= (S0, EQ()

    ? (S0,), EQ)= (S0, EQ))

    ? (S0, =, EQ)= (S0, EQ=)

    ? (S0,;, EQ)= (S0, EQ;)

    ? (S0, f, EQ)= (S0, EQf)

    ? (S0, t, EQ)= (S0, EQt)

    ? (S0, d, EQ)= (S0, EQd)

    ? (S0, n, EQ)= (S0, EQn)

    ? (S0, w, EQ)= (S0, EQw)

    ? (S0, r, EQ)= (S0, EQr)

    ? (S0,;,)) = (S0,);)

    ? (S0, (, DE) = (S0, DE()

    ? (S0,v)) = (S0,)v)

    ? (S0,;,)) = (S0,);)

    ? (S0,i,)) = (S0,)i)

    ? (S0,:,)) = (S0,):)

    ? (S0,e,)) = (S0,)e)

    ? (S0, (, r) = (S0, r()

    ? (S0, (, w) = (S0, w()

    ? (S0,;, n) = (S0, n;)

    ? (S0, n, LE) = (S0, LEn)

    ? (S0, (, d) = (S0, d()

    ? (S0,), d) = (S0, d))

    ? (S0,;, d) = (S0, d;)

    ? (S0, f, d) = (S0, df)

    ? (S0, t, d) = (S0, dt)

    ? (S0, d, d) = (S0, dd)

    ? (S0, n, d) = (S0, dn)

    ? (S0, w, d) = (S0, dw)

    ? (S0, r, d) = (S0, dr)

    ? (S0, d, EX) = (S0, EXd)

    ? (S0, BO, t) = (S0, tBO)

    ? (S0, -, t) = (S0, t-)

    ? (S0, t, EX) = (S0, EXt)

    ? (S0, BO, =) = (S0, =BO)

    ? (S0, -, =) = (S0, =-)

    ? (S0, =, ID) = (S0, ID=)

    ? (S0, ID, f) = (S0, fID)

    ? (S0,;, EX) = (S0, EX;)

    ? (S0, =, u) = (S0, u=)

    ? (S0, (, UO) = (S0, UO()

    ? (S0, OP, UO) = (S0, UO OP)

    ? (S0, BO, UO) = (S0, UO BO)

    ? (S0,), EX) = (S0, EX))

    ? (S0, BO, () = (S0, (BO)

    ? (S0, BO, -) = (S0, -BO)

    ? (S0, (, BO) = (S0, BO()

    ? (S0,),BO) = (S0,)BO)

    ? (S0, OP, BO) = (S0, BOOP)

    ? (S0, +, SB) = (S0, SB+)

    ? (S0, *, SB) = (S0, SB*)

    ? (S0, -, SB) = (S0, SB-)

    ? (S0, u, u) = (S0, uu)

    Bagi setiap pasangan (x, A)? Dan CONVULT x membina fungsi peralihan yang mentakrifkan tindakan konvolusi?? * (S 0, x, bA) \u003d (S 0, B), dengan B-> bA

    ? * (S 0 , AL, ?) = (S 0 , PG)

    ? * (S 0 , e, b) = (S 0 , AL)

    ? * (S 0 , n, ?) = (S 0 , AL)

    ? * (S 0 ,;, b) = (S 0 , DE)

    ? * (S 0 ,;, ?) = (S 0 , DE)

    ? * (S 0 ,;, e) = (S 0 , DE)

    ? * (S 0 , LV,:) = (S 0 , LV)

    ? * (S 0 , LV, ?) = (S 0 , LV)

    ? * (S 0 , ID, ?) = (S 0 , LV)

    ? * (S 0 , ID, e) = (S 0 , LV)

    ? * (S 0 ,;, e) = (S 0 , LE)

    ? * (S 0 ,;, ?) = (S 0 , LE)

    ? * (S 0 ,;, n) = (S 0 , LE)

    ? * (S 0 , EQ, n) = (S 0 , LE)

    ? * (S 0 , EQ, e) = (S 0 , LE)

    ? * (S 0 , EQ, ?) = (S 0 , LE)

    ? * (S 0 ,;, e) = (S 0 , LE)

    ? * (S 0 ,;, ?) = (S 0 , LE)

    ? * (S 0 ,;, () = (S 0 , EQ)

    ? * (S 0 ,;,)) = (S 0 , EQ)

    ? * (S 0 ,;, f) = (S 0 , EQ)

    ? * (S 0 ,;, =) = (S 0 , EQ)

    ? * (S 0 ,;, t) = (S 0 , EQ)

    ? * (S 0 ,;, d) = (S 0 , EQ)

    ? * (S 0 ,;, n) = (S 0 , EQ)

    ? * (S 0 ,;, w) = (S 0 , EQ)

    ? * (S 0 ,;, r) = (S 0 , EQ)

    ? * (S 0 , SB, ?) = (S 0 , EX)

    ? * (S 0 , SB, d) = (S 0 , EX)

    ? * (S 0 , SB,)) = (S 0 , EX)

    ? * (S 0 , SB,;) = (S 0 , EX)

    ? * (S 0 , SB, w) = (S 0 , EX)

    ? * (S 0 , SB, r) = (S 0 , EX)

    ? * (S 0 , SB, f) = (S 0 , EX)

    ? * (S 0 , SB, =) = (S 0 , EX)

    ? * (S 0 , SB, t) = (S 0 , EX)

    ? * (S 0 , SB, ?) = (S 0 , SB)

    ? * (S 0 , SB, () = (S 0 , SB)

    ? * (S 0 , SB,)) = (S 0 , SB)

    ? * (S 0 , SB, u) = (S 0 , SB)

    ? * (S 0 , SB, k) = (S 0 , SB)

    ? * (S 0 , SB, +) = (S 0 , SB)

    ? * (S 0 , SB, -) = (S 0 , SB)

    ? * (S 0 , SB, *) = (S 0 , SB)

    ? * (S 0 , SB, e) = (S 0 , SB)

    ? * (S 0 ,), t) = (S 0 , SB)

    ? * (S 0 ,), ?) = (S 0 , SB)

    ? * (S 0 ,), t) = (S 0 , SB)

    (S 0 ,),)) = (S 0 , SB)

    ? * (S 0 ,),;) = (S 0 , SB)

    ? * (S 0 , -, ?) = (S 0 , UO)

    ? * (S 0 , -, -) = (S 0 , UO)

    ? * (S 0 , +, +) = (S 0 , BO)

    ? * (S 0 , +, ?) = (S 0 , BO)

    ? * (S 0 , +, *) = (S 0 , BO)

    ? * (S 0 , -, +) = (S 0 , BO)

    ? * (S 0 , -, ?) = (S 0 , BO)

    ? * (S 0 , -, *) = (S 0 , BO)

    ? * (S 0 , -, -)) = (S 0 , BO)

    ? * (S 0 , *, +) = (S 0 , BO)

    ? * (S 0 , *, ?) = (S 0 , BO)

    ? * (S 0 , *, *) = (S 0 , BO)

    ? * (S 0 , *, -)) = (S 0 , BO)

    ? * (S 0 , u, +) = (S 0 , BO)

    ? * (S 0 , u, ?)= (S 0 , BO)

    ? * (S 0 , u, *) = (S 0 , BO)

    ? * (S 0 , u, -)) = (S 0 , BO)

    ? * (S 0 , k, +) = (S 0 , BO)

    ? * (S 0 , k, ?) = (S 0 , BO)

    ? * (S 0 , k, *) = (S 0 , BO)

    ? * (S 0 , k, -)) = (S 0 , BO)

    ? * (S 0 , CO, ?) = (S 0 , OP)

    ? * (S 0 , CO, +) = (S 0 , OP)

    ? * (S 0 , CO, *) = (S 0 , OP)

    ? * (S 0 , CO, -) = (S 0 , OP)

    ? * (S 0 , CO,;) = (S 0 , OP)

    ? * (S 0 , CO, d) = (S 0 , OP)

    ? * (S 0 , CO, t) = (S 0 , OP)

    ? * (S 0 , ID, -) = (S 0 , OP)

    ? * (S 0 , ID, *) = (S 0 , OP)

    ? * (S 0 , ID, ?) = (S 0 , OP)

    ? * (S 0 , ID, () = (S 0 , OP)

    ? * (S 0 , ID,)) = (S 0 , OP)

    ? * (S 0 , ID, u) = (S 0 , OP)

    ? * (S 0 , ID, k) = (S 0 , OP)

    ? * (S 0 , ID, -) = (S 0 , OP)

    ? * (S 0 , ID, +) = (S 0 , OP)

    ? * (S 0 , u,)) = (S 0 , I OP)

    ? * (S 0 , ID1, *) = (S 0 , ID)

    ? * (S 0 , ID1, ?) = (S 0 , ID)

    ? * (S 0 , ID1, () = (S 0 , ID)

    ? * (S 0 , ID1,)) = (S 0 , ID)

    ? * (S 0 , ID1, u) = (S 0 , ID)

    ? * (S 0 , ID1, k) = (S 0 , ID)

    ? * (S 0 , ID1, -) = (S 0 , ID)

    ? * (S 0 , ID1, +) = (S 0 , ID)

    ? * (S 0 , u,)) = (S 0 , ID)

    ? * (S 0 , u, ?) = (S 0 , BO)

    ? * (S 0 , u, k) = (S 0 , ID)

    ? * (S 0 , u, *)) = (S 0 , ID)

    ? * (S 0 , u, -)) = (S 0 , ID)

    ? * (S 0 , u, +)) = (S 0 , ID)

    ? * (S 0 , u, d)) = (S 0 , ID)

    ? * (S 0 , u, t)) = (S 0 , ID)

    ? * (S 0 , u, =)) = (S 0 , ID)

    ? * (S 0 , CO, ?) = (S 0 , CO)

    ? * (S 0 , CO, +) = (S 0 , CO)

    ? * (S 0 , CO, -) = (S 0 , CO)

    ? * (S 0 , CO, *) = (S 0 , CO)

    ? * (S 0 , CO,;) = (S 0 , CO)

    ? * (S 0 , CO, d) = (S 0 , CO)

    ? * (S 0 , CO, t) = (S 0 , CO)

    ? * (S 0 , CO,)) = (S 0 , CO)

    ? * (S 0 , k, +) = (S 0 , CO)

    ? * (S 0 , k, -) = (S 0 , CO)

    ? * (S 0 , k, *) = (S 0 , CO)

    ? * (S 0 , k,;) = (S 0 , CO)

    ?? * (S 0 , k, d) = (S 0 , CO)

    ? * (S 0 , k, t) = (S 0 , CO)

    ? * (S 0 , k,)) = (S 0 , CO)

    ? * (S 0 , k, () = (S 0 , CO)

    2.2.3 Pelaksanaan perisian parser

    Penghurai (parser) membaca fail token yang dijana oleh penganalisis leksikal, menjalankan analisis tatabahasa, memaparkan mesej tentang ralat sintaks, jika ada, dan mencipta bentuk perantaraan program sumber. Asas untuk pembangunan parser ialah reka bentuk dan pelaksanaan automaton pushdown yang sesuai.

    Untuk penghuraian bawah ke atas untuk penyelesai bawah ke atas yang menentukan, selepas menghantarnya ke jenis yang betul ia diperlukan, menggunakan fungsi AFTER dan CONVERT, untuk mereka bentuk mesin tolak-tarik dengan penerangan terperinci tentang semua peralihan dalam fungsi peralihan.

    Apabila membangunkan automaton pushdown, kami membina fungsi peralihan yang akan menjadi asas penghurai. Semua fungsi peralihan boleh dibahagikan kepada dua jenis:

    Kitaran operasi mesin tolak-tarik tanpa membaca simbol input (kitaran kosong);

    Kitaran automatik tolak-tarik dengan membaca simbol input.

    Apabila melaksanakan penganalisis leksikal, kami membahagikan program kepada token dan menulisnya ke dalam senarai. Kami kemudian memproses senarai ini dalam parser. Kami menghantar program (senarai), simbol awal (PG) dan penanda bawah butang tekan (h0) sebagai input, selepas itu fungsi peralihan yang dikehendaki dipilih dan panggilan rekursif dibuat.

    Skim program kerja parser diberikan dalam Lampiran B dalam Rajah B.2.

    2.2.4 Pembangunan modul tafsiran

    Apabila membangunkan modul tafsiran sebagai bentuk perantaraan program asal bentuk tatatanda postfix yang paling biasa digunakan, yang menjadikannya agak mudah untuk melaksanakan proses melaksanakan (mentafsir) atur cara yang diterjemahkan.

    Mari kita pertimbangkan prinsip asas pembentukan dan pelaksanaan bentuk ungkapan postfix.

    Peraturan asas untuk menukar tatatanda infiks ungkapan kepada postfix adalah seperti berikut.

    Operan baca ditambah pada tatatanda postfix, operasi ditolak ke tindanan.

    Jika operasi di bahagian atas tindanan mempunyai keutamaan yang lebih tinggi (atau sama) daripada operasi yang sedang dibaca, maka operasi daripada tindanan ditambahkan pada entri postfix dan operasi semasa ditolak ke tindanan. Jika tidak (pada keutamaan paling rendah), hanya operasi semasa ditolak ke tindanan.

    Kurungan terbuka yang dibaca ditolak ke timbunan.

    Selepas membaca kurungan penutup, semua operasi sehingga kurungan bukaan pertama dikeluarkan dari tindanan dan ditambah pada rekod postfix, selepas itu kedua-dua kurungan pembukaan dan penutup dibuang, i.e. tidak diletakkan pada rekod postfix atau pada timbunan.

    Selepas keseluruhan ungkapan telah dibaca, baki operasi pada tindanan ditambahkan pada entri postfix.

    Notasi postfix bagi ungkapan membolehkannya dinilai dengan cara berikut.

    Jika token ialah operan, maka ia ditolak ke tindanan. Jika token ialah operasi, maka operasi yang ditentukan dilakukan pada elemen terakhir (elemen terakhir) yang ditolak ke tindanan, dan elemen ini (elemen) digantikan pada tindanan dengan hasil operasi.

    Jika analisis leksikal dan sintaksis telah berjaya lulus, maka kita teruskan ke tafsiran. Mula-mula, kami membuat ayat daripada perkataan, kemudian kami menterjemahkan ungkapan ke dalam tatatanda postfix dan mengira.

    Skim operasi jurubahasa diberikan dalam Lampiran B dalam Rajah B.3.

    2.3 Pengekodan

    Program ini dilaksanakan dalam C# dalam persekitaran Pengaturcaraan visual Studio 2010. Teks program dibentangkan dalam Lampiran A.

    Program ini mempunyai lima kelas. Antara muka pengguna dilaksanakan menggunakan kelas MainForn. Dengan bantuan kelas LexAnalysis, modul analisis leksikal dilaksanakan, SynAnalysis ialah modul penghuraian, Intepreter ialah modul tafsiran, ProgramisciJakPolska ialah kelas tambahan untuk menterjemah ungkapan menjadi terbalik notasi Poland(postfix).

    Tujuan prosedur dan fungsi yang dilaksanakan dalam program diterangkan dalam jadual 6,7,8.

    Jadual 6 - Tujuan prosedur dan fungsi analisis leksikal

    Dokumen Serupa

      Penterjemah ialah program atau cara teknikal yang melaksanakan terjemahan program. Pertimbangan ciri utama pembinaan penganalisis leksikal. Kebiasaan dengan peringkat membangunkan penterjemah daripada subset terhad bahasa peringkat tinggi.

      kertas penggal, ditambah 08/06/2013

      Merekabentuk Penganalisis Leksikal dan Penghuraian pengajaran bahasa. Peraturan penukaran ungkapan boolean dalam POLIZ. Pembentukan triad, pengoptimuman senarai mereka. Struktur logik program. Menguji modul penterjemah-jurubahasa.

      kertas penggal, ditambah 28/05/2013

      Ciri-ciri umum dan penilaian keupayaan bahasa pengaturcaraan C-sharp, persamaan dan perbezaannya daripada C ++ dan Java. Pembangunan dengan bantuan bahasa pengaturcaraan leksikal dan penghurai ini. Penyusunan hamparan.

      kertas penggal, ditambah 06/11/2010

      Mereka bentuk program penganalisis yang terdiri daripada dua bahagian: penganalisis leksikal yang memecahkan teks sumber program kepada token dan mengisi jadual nama; penghurai yang menyemak sama ada teks sepadan dengan tatabahasa yang diberikan.

      kertas penggal, ditambah 06/14/2010

      Menulis program yang melaksanakan analisis leksikal dan sintaksis bahasa pengaturcaraan input, menghasilkan jadual leksem yang menunjukkan jenis dan nilainya, dan juga membina pepohon sintaks; teks bahasa input dimasukkan dari papan kekunci.

      kertas penggal, ditambah 23/02/2012

      Teknik pembangunan dan pelaksanaan separa penterjemah untuk bahasa "C" menggunakan bahasa "C++", yang membahagikan rentetan awal aksara kepada binaan bahasa tidak boleh dibahagikan yang minimum berdasarkan perbendaharaan kata bahasa. Analisis program.

      kertas penggal, ditambah 19/03/2012

      Struktur, klasifikasi dan keperluan untuk pelaksanaan pengkompil. Reka bentuk dan pelaksanaan bahagian menganalisis pengkompil C++. Cara untuk melaksanakan analisis leksikal. Algoritma penghurai. Prinsip pelaksanaan perisian.

      kertas penggal, ditambah 26/01/2013

      Penciptaan penterjemah yang memproses kod program dalam bahasa Pascal dan menghasilkan program C menggunakan operator yang setara. Keanehan spesifikasi luaran dan kerja penganalisis leksikal. Struktur program, memaparkan keputusan pada skrin.

      kertas penggal, ditambah 07/02/2011

      Kaedah analisis tatabahasa. Pembangunan struktur penterjemah pendidikan dalam bahasa pengaturcaraan asas Objek Pascal dalam persekitaran pengaturcaraan visual berorientasikan objek Borland DELPHI 6.0 menggunakan sistem pengendalian Windows XP.

      kertas penggal, ditambah 05/12/2013

      Pelaksanaan perisian aplikasi desktop menggunakan bahasa pengaturcaraan C#. Reka bentuk dan struktur antaramuka pengguna, keperluan untuknya dan penilaian kefungsian. Pembangunan manual pengguna dan penggunaannya.

    BAHAGIAN 7. Terjemahan, penyusunan dan tafsiran

    Program ialah urutan arahan yang direka bentuk untuk dilaksanakan oleh komputer. Pada masa ini, program ditulis dalam bentuk teks yang ditulis ke fail. Teks ini adalah hasil daripada aktiviti pengaturcara dan, walaupun khusus bahasa formal, kekal program untuk pengaturcara.

    Proses mencipta program melibatkan beberapa peringkat. Peringkat pembangunan projek program diikuti dengan peringkat pengaturcaraan. Pada peringkat ini, program ditulis. Pengaturcara melihat teks ini lebih mudah daripada kod binari, kerana pelbagai singkatan dan nama mnemonik mengandungi maklumat tambahan.

    Fail sumber program (juga dipanggil modul sumber) diproses penterjemah , yang menterjemahkan atur cara daripada bahasa pengaturcaraan kepada urutan kod yang boleh difahami oleh mesin.

    Penterjemah - perisian atau perkakasan yang berfungsi penyiaran program tersebut. Program mesin yang menterjemah dari satu bahasa ke bahasa lain dan, khususnya, dari satu bahasa pengaturcaraan ke bahasa lain. Program pemprosesan yang direka untuk menukar atur cara sumber kepada modul objek.

    Penterjemah biasanya juga melakukan diagnostik ralat, menghasilkan kamus pengecam, mencetak teks program, dsb.

    Siaran program - transformasi program yang dibentangkan dalam salah satu bahasa pengaturcaraan kepada program dalam bahasa lain dan, dalam erti kata tertentu, bersamaan dengan yang pertama.

    Bahasa di mana program input dibentangkan dipanggil bahasa asal, dan program itu sendiri kod sumber. Bahasa keluaran dipanggil Bahasa sasaran atau kod objek.

    Jenis-jenis penterjemah

    Penterjemah terbahagi kepada:

    · Alamat. Peranti berfungsi yang menukar alamat maya alamat maya) ke alamat sebenar (eng. alamat ingatan).

    · Dialog. Menyediakan penggunaan bahasa pengaturcaraan dalam mod perkongsian masa.

    · multipass. Menghasilkan modul objek ke atas beberapa paparan program sumber.

    · belakang. Sama seperti relay. Lihat juga: decompiler, disassembler.

    · pas tunggal. Menghasilkan modul objek dalam satu imbasan berurutan program sumber.

    · Mengoptimumkan. Melaksanakan pengoptimuman kod dalam modul objek yang dijana.

    · Berorientasikan Sintaksis (Didorong Secara Sintaksis). Ia menerima sebagai input penerangan tentang sintaks dan semantik bahasa dan teks dalam bahasa yang diterangkan, yang diterjemahkan mengikut penerangan yang ditentukan.

    · ujian. Satu set makro bahasa himpunan yang membolehkan anda menetapkan pelbagai prosedur penyahpepijatan dalam program yang ditulis dalam bahasa himpunan.



    Penterjemah dilaksanakan dalam bentuk penyusun atau jurubahasa . Dari segi melakukan kerja, penyusun dan jurubahasa adalah sangat berbeza.

    Penyusun(Bahasa Inggeris) penyusun- pengkompil, pengumpul) - penterjemah yang menukar atur cara yang disusun dalam bahasa sumber kepada modul objek. Program yang menterjemah teks program bahasa peringkat tinggi kepada program bahasa mesin yang setara.

    · Program yang direka untuk menterjemah bahasa peringkat tinggi kepada kod mutlak atau, kadangkala, ke dalam bahasa himpunan. Maklumat input untuk pengkompil (kod sumber) ialah perihalan algoritma atau program dalam bahasa khusus domain, dan output pengkompil ialah perihalan setara bagi algoritma dalam bahasa berorientasikan mesin (kod objek).

    Kompilasi- terjemahan program yang ditulis dalam bahasa sumber ke dalam modul objek. Dilaksanakan oleh penyusun.

    Susun - siaran program mesin daripada bahasa khusus domain kepada bahasa berorientasikan mesin.

    Pengkompil membaca keseluruhan program sepenuhnya, menterjemahnya dan mencipta versi lengkap program dalam bahasa mesin, yang kemudiannya dilaksanakan.

    Jurubahasa(Bahasa Inggeris) jurubahasa- jurubahasa, jurubahasa) menterjemah dan melaksanakan program baris demi baris. Jurubahasa mengambil pernyataan bahasa seterusnya dari teks program, menganalisis strukturnya, dan kemudian melaksanakannya dengan segera (biasanya, selepas analisis, pernyataan itu diterjemahkan ke dalam beberapa perwakilan perantaraan atau bahkan kod mesin untuk pelaksanaan selanjutnya yang lebih cekap). Hanya selepas penyataan semasa berjaya dilaksanakan, jurubahasa akan beralih ke yang seterusnya. Lebih-lebih lagi, jika pernyataan yang sama dilaksanakan berkali-kali dalam atur cara, jurubahasa akan melaksanakannya seolah-olah ia telah menemuinya buat kali pertama. Akibatnya, program yang memerlukan isipadu yang besar pengiraan akan menjadi perlahan. Di samping itu, untuk menjalankan program pada komputer lain, juga mesti ada jurubahasa di sana - lagipun, tanpa itu, teks hanyalah satu set aksara.



    Dengan cara lain, kita boleh mengatakan bahawa jurubahasa memodelkan beberapa pengiraan mesin maya, untuk yang mana arahan asas bukan perintah pemproses asas, tetapi pengendali bahasa pengaturcaraan.

    Perbezaan antara kompilasi dan tafsiran.

    1. Setelah program disusun, program sumber mahupun pengkompil tidak diperlukan lagi. Pada masa yang sama, program yang sedang diproses oleh jurubahasa mesti sekali lagi pemindahan ke dalam bahasa mesin setiap kali program dijalankan.

    2. Program yang disusun berjalan lebih pantas, tetapi program yang ditafsirkan lebih mudah untuk diperbaiki dan diubah.

    3. Setiap bahasa tertentu tertumpu sama ada pada kompilasi atau tafsiran, bergantung pada tujuan ia dicipta. Sebagai contoh, Pascal biasanya digunakan untuk menyelesaikan masalah yang agak kompleks di mana kelajuan program adalah penting. Oleh itu, bahasa ini biasanya dilaksanakan menggunakan penyusun.

    Di sebelah sana, ASAS telah dicipta sebagai bahasa untuk pengaturcara baru, yang baginya pelaksanaan program baris demi baris mempunyai kelebihan yang tidak dapat dinafikan.

    Hampir semua bahasa pengaturcaraan peringkat rendah dan generasi ketiga, seperti pemasang, C atau Modula-2, boleh dikompilasi dan banyak lagi bahasa peringkat tinggi, seperti Python atau SQL - boleh ditafsir.

    Kadang-kadang untuk satu bahasa ada dan penyusun, dan jurubahasa. Dalam kes ini, anda boleh menggunakan penterjemah untuk membangunkan dan menguji atur cara, dan kemudian menyusun atur cara nyahpepijat untuk mempercepatkan pelaksanaannya. Terdapat interpenetrasi proses terjemahan dan tafsiran: jurubahasa boleh menjadi penyusun (termasuk yang mempunyai kompilasi dinamik), dan penterjemah boleh memerlukan tafsiran untuk pembinaan pengaturcaraan meta (contohnya, makro dalam bahasa himpunan, kompilasi bersyarat dalam C, atau templat dalam C++).

    4. Penyiaran dan tafsiran - proses yang berbeza: terjemahan berurusan dengan terjemahan program dari satu bahasa ke bahasa lain, dan tafsiran bertanggungjawab untuk pelaksanaan program. Walau bagaimanapun, kerana tujuan terjemahan biasanya untuk menyediakan program untuk tafsiran, proses ini biasanya dipertimbangkan bersama.

    Kesimpulan: Kelemahan pengkompil adalah kepayahan menterjemah bahasa pengaturcaraan yang berorientasikan data dan struktur kompleks, selalunya tidak diketahui terlebih dahulu atau berubah secara dinamik semasa operasi program. Kemudian anda perlu memasukkan banyak pemeriksaan tambahan ke dalam kod mesin, menganalisis ketersediaan sumber sistem pengendalian, menangkap dan melepaskannya secara dinamik, membentuk dan memprosesnya dalam memori komputer objek kompleks, yang agak sukar untuk dilaksanakan pada tahap arahan mesin berkod keras, dan hampir mustahil untuk tugas itu.

    Dengan bantuan jurubahasa, sebaliknya, adalah dibenarkan untuk menghentikan program pada bila-bila masa, memeriksa kandungan memori, mengatur dialog dengan pengguna, melakukan transformasi kompleks sewenang-wenangnya dan pada masa yang sama sentiasa memantau keadaan persekitaran perisian dan perkakasan di sekeliling, dengan itu mencapai kebolehpercayaan yang tinggi. Apabila melaksanakan setiap pernyataan, jurubahasa menyemak banyak ciri sistem pengendalian dan, jika perlu, memaklumkan pembangun dengan seberapa terperinci yang mungkin tentang masalah yang timbul. Di samping itu, jurubahasa sangat mudah digunakan sebagai alat untuk pembelajaran pengaturcaraan, kerana ia membolehkan anda memahami prinsip operasi mana-mana pernyataan individu dalam bahasa.


    Proses penyusunan terbahagi kepada beberapa peringkat:

    1. Prapemproses. Program sumber diproses dengan menggantikan makro dan fail pengepala sedia ada.

    2. Analisis leksikal dan sintaksis. Program ini ditukar menjadi rentetan token dan kemudian menjadi perwakilan pokok dalaman.

    3. Pengoptimuman global. Perwakilan dalaman program berulang kali diubah untuk mengurangkan saiz dan masa pelaksanaan program.

    4. Penjanaan kod. Perwakilan dalaman ditukar kepada blok arahan pemproses, yang ditukar kepada teks pemasang atau kod objek.

    5. Perhimpunan. Jika teks pemasangan dijana, ia dipasang untuk mendapatkan kod objek.

    6. Perhimpunan. Penghimpun menggabungkan berbilang fail objek ke dalam fail boleh laku atau pustaka.

    Pada fasa analisis leksikal (LA) program input, yang merupakan aliran aksara, dibahagikan kepada leksem - perkataan mengikut definisi bahasa. Formalisme utama yang mendasari pelaksanaan penganalisis leksikal ialah automata terhingga dan ungkapan biasa. Penganalisis leksikal boleh beroperasi dalam dua mod utama: sama ada sebagai subrutin yang dipanggil oleh penghurai selepas token seterusnya, atau sebagai lulus penuh, menghasilkan fail token. Dalam proses mengekstrak token, LA boleh membina jadual nama dan pemalar secara bebas, dan memberikan nilai untuk setiap token pada kali berikutnya ia diakses. Dalam kes ini, jadual nama dibina dalam fasa berikutnya (contohnya, semasa menghurai).

    Pada peringkat LA, beberapa ralat (paling mudah) dikesan (aksara tidak sah, rakaman nombor yang salah, pengecam, dsb.).

    Mari kita pertimbangkan dengan lebih terperinci peringkat analisis leksikal.

    Tugas utama analisis leksikal - hancurkan teks input, yang terdiri daripada urutan aksara tunggal, menjadi urutan perkataan, atau leksem, i.e. asingkan perkataan ini daripada urutan aksara yang berterusan. Dari sudut pandangan ini, semua aksara urutan input dibahagikan kepada aksara yang tergolong dalam beberapa leksem dan aksara yang memisahkan leksem (pemisah). Dalam sesetengah kes, mungkin tiada pemisah antara token. Sebaliknya, dalam sesetengah bahasa, token mungkin mengandungi aksara yang tidak penting (contohnya, aksara ruang dalam Fortran). Dalam C, nilai pemisah bagi aksara pembatas boleh disekat ("\" pada penghujung baris dalam "...").

    Biasanya semua leksem dibahagikan kepada kelas. Contoh kelas tersebut ialah nombor (integer, oktal, perenambelasan, nyata, dll.), pengecam, rentetan. Kata kunci dan simbol tanda baca (kadangkala dipanggil simbol pembatas) diserlahkan secara berasingan. Biasanya, kata kunci ialah beberapa subset terhingga pengecam. Dalam sesetengah bahasa (contohnya, PL/1) makna leksem mungkin bergantung pada konteksnya dan adalah mustahil untuk menjalankan analisis leksikal secara berasingan daripada sintaksis.

    Dari sudut pandangan fasa analisis selanjutnya, penganalisis leksikal menghasilkan maklumat dua jenis: untuk penganalisis sintaksis, bekerja selepas penganalisis leksikal, maklumat tentang urutan kelas token, pembatas dan kata kunci adalah penting, dan untuk analisis konteks, bekerja selepas sintaksis, maklumat tentang makna khusus leksem individu (pengecam, nombor, dll.) adalah penting.

    Oleh itu, skim umum kerja penganalisis leksikal adalah seperti berikut. Pertama, satu token diperuntukkan (mungkin menggunakan aksara pembatas). Kata kunci dikenali sama ada melalui pemilihan eksplisit terus daripada teks atau pengecam mula-mula diperuntukkan, dan kemudian semakan dibuat untuk melihat sama ada ia tergolong dalam satu set kata kunci.

    Jika leksem yang dipilih ialah pembatas, maka ia (lebih tepat, beberapa cirinya) adalah keluaran hasil daripada analisis leksikal. Jika leksem yang dipilih ialah kata kunci, maka tanda yang sepadan kata kunci. Jika leksem yang dipilih ialah pengecam, atribut pengecam dikembalikan dan pengecam itu sendiri disimpan secara berasingan. Akhir sekali, jika token yang dipilih tergolong dalam mana-mana kelas token yang lain (contohnya, token ialah nombor, rentetan, dsb.), maka atribut kelas yang sepadan dikembalikan dan nilai token disimpan secara berasingan.

    Penganalisis leksikal boleh sama ada fasa terjemahan bebas atau subrutin yang berfungsi pada prinsip "berikan token". Dalam kes pertama (Rajah 3.1, a), output penganalisis ialah fail token, dalam kes kedua (Rajah 3.1, b), token dikeluarkan setiap kali penganalisis diakses (dalam kes ini, sebagai peraturan, atribut kelas token dikembalikan sebagai hasil daripada fungsi "penganalisis leksikal", dan nilai token dihantar melalui pembolehubah global). Dari segi pemprosesan nilai token, penghurai boleh sama ada hanya mengembalikan nilai setiap token, dalam hal ini pembinaan jadual objek (pengecam, rentetan, nombor, dll.) ditangguhkan ke fasa kemudian, atau ia boleh membina jadual objek itu sendiri . Dalam kes ini, penunjuk kepada entri ke jadual yang sepadan diberikan sebagai nilai leksem.

    nasi. 3.1:

    Kerja penganalisis leksikal diberikan oleh beberapa automaton terhingga. Walau bagaimanapun, penerangan langsung tentang mesin negeri adalah menyusahkan dari sudut pandangan praktikal. Oleh itu, untuk menentukan penganalisis leksikal, sebagai peraturan, sama ada ungkapan biasa atau tatabahasa linear kanan digunakan. Ketiga-tiga formalisme (automata terhingga, ungkapan biasa dan tatabahasa linear kanan) mempunyai kuasa ekspresif yang sama. Khususnya, menurut ekspresi biasa atau tatabahasa linear kanan, seseorang boleh membina mesin keadaan yang mengenali bahasa yang sama.

    Tugas utama menghurai - analisis struktur program. Sebagai peraturan, struktur difahami sebagai pokok yang sepadan dengan penghuraian dalam tatabahasa tanpa konteks bagi sesuatu bahasa. Pada masa ini, sama ada analisis LL(1) (dan turunan rekursif variannya) atau analisis LR(1) dan variannya (LR(0), SLR(1), LALR(1) dan lain-lain) paling biasa digunakan. . Penurunan rekursif lebih kerap digunakan apabila pengaturcaraan penghurai secara manual, LR(1) - apabila menggunakan sistem automasi untuk membina parser.

    Hasil penghuraian ialah pokok sintaks dengan pautan ke jadual nama. Proses penghuraian juga mengesan ralat yang berkaitan dengan struktur atur cara.

    Pada peringkat analisis kontekstual kebergantungan antara bahagian program yang tidak boleh diterangkan oleh sintaks bebas konteks didedahkan. Ini terutamanya perhubungan "penggunaan perihalan", khususnya, analisis jenis objek, analisis skop, padanan parameter, label dan lain-lain. Dalam proses analisis kontekstual, jadual simbol dibina, yang boleh dianggap sebagai jadual nama, ditambah dengan maklumat tentang perihalan (sifat) objek.

    Formalisme utama yang digunakan dalam analisis kontekstual ialah tatabahasa atribut. Hasil daripada fasa analisis konteks ialah pepohon program yang dikaitkan. Maklumat tentang objek boleh sama ada tersebar dalam pokok itu sendiri atau tertumpu dalam jadual simbol yang berasingan. Proses analisis kontekstual juga dapat mengesan ralat yang berkaitan dengan penyalahgunaan objek.

    Kemudian program boleh ditukar kepada perwakilan dalaman . Ini dilakukan untuk tujuan pengoptimuman dan/atau kemudahan penjanaan kod. Satu lagi matlamat untuk menukar program kepada perwakilan dalaman ialah keinginan untuk mempunyai penyusun mudah alih. Kemudian hanya fasa terakhir (penjanaan kod) bergantung kepada mesin. Sebagai perwakilan dalaman, notasi awalan atau postfix, graf terarah, tiga kali ganda, empat kali ganda dan lain-lain boleh digunakan.

    Terdapat beberapa fasa pengoptimuman . Pengoptimuman biasanya dibahagikan kepada bergantung kepada mesin dan bebas mesin, tempatan dan global. Sebahagian daripada pengoptimuman bergantung kepada mesin dilakukan semasa fasa penjanaan kod. Pengoptimuman global cuba mengambil kira struktur keseluruhan program, tempatan - hanya serpihan kecil daripadanya. Pengoptimuman global adalah berdasarkan analisis aliran global yang dilakukan pada graf program dan pada asasnya merupakan transformasi graf ini. Dalam kes ini, sifat program seperti analisis antara prosedur, analisis antara modul, analisis kawasan kehidupan pembolehubah, dll. boleh diambil kira.

    Akhirnya, penjanaan kod- fasa terakhir terjemahan. Hasilnya ialah sama ada modul pemasang atau modul objek (atau but). Semasa penjanaan kod, beberapa pengoptimuman tempatan, seperti pengedaran daftar, pilihan lompat jauh atau pendek, dengan mengambil kira kos arahan apabila memilih urutan arahan tertentu. Pelbagai kaedah telah dibangunkan untuk penjanaan kod, seperti jadual keputusan, padanan corak, termasuk pengaturcaraan dinamik, pelbagai kaedah sintaksis.

    Sudah tentu, fasa tertentu penterjemah mungkin sama ada tidak hadir sepenuhnya atau digabungkan. Dalam kes paling mudah bagi penterjemah satu laluan, tiada fasa eksplisit untuk menjana perwakilan perantaraan dan pengoptimuman, fasa selebihnya digabungkan menjadi satu, dan tiada pepohon sintaks yang dibina secara eksplisit.