Saya telah melihat beberapa lexer di berbagai bahasa tingkat yang lebih tinggi ( Python , PHP , Javascript antara lain) dan mereka semua tampaknya menggunakan ekspresi reguler dalam satu bentuk atau lainnya. Walaupun saya yakin regex mungkin adalah cara terbaik untuk melakukan ini, saya bertanya-tanya apakah ada cara untuk mencapai lexing dasar tanpa ekspresi reguler, mungkin semacam penguraian string langsung atau sesuatu.
Jadi ya, apakah mungkin untuk menerapkan semacam lexing dasar dalam bahasa tingkat yang lebih tinggi * tanpa menggunakan ekspresi reguler dalam bentuk apa pun?
* Bahasa tingkat tinggi menjadi hal-hal seperti Perl / PHP / Python / Javascript dll. Saya yakin ada cara untuk melakukannya di C
Jawaban:
Pertama-tama, ada pustaka ekspresi reguler untuk C karena sebelum bahasa "tingkat yang lebih tinggi" ditemukan. Hanya mengatakan, program C tidak podunk seperti beberapa orang tampaknya berpikir.
Bagi kebanyakan tata bahasa, lexing adalah masalah mencari spasi putih dan beberapa karakter lain seperti () [] {}; untuk membagi kata, dan kemudian mencocokkan dengan daftar kata kunci untuk melihat apakah ada yang cocok.
sumber
Anda mungkin tertarik pada "parser tanpa pemindai", yang tidak memiliki langkah tokenization terpisah. Salah satu penjelasan tentang manfaat parser tanpa pemindai diberikan pada awal makalah ini: Filter Disambiguasi untuk Parser LR Parser Generalized . (Ada juga kelemahannya.)
(PEG, yang telah disebutkan dalam jawaban lain, juga dapat digunakan untuk membuat parser tanpa pemindai.)
sumber
Tidak ada yang spesifik tentang ekspresi reguler. Mereka hanya singkatan yang memungkinkan Anda untuk menghasilkan kode lebih mudah, dan implementasi biasanya dikirimkan. Namun, pada dasarnya, lexer adalah FSM dan ekspresi reguler hanyalah salah satu cara untuk mencapai tujuan itu.
sumber
Tentu saja Anda dapat menggunakan parser lain, karena setiap bahasa reguler juga bebas konteks. Pertanyaannya benar-benar turun ke mengapa Anda ingin.
Sebenarnya tidak ada yang lebih sederhana daripada ekspresi reguler (bagaimana Anda bisa meningkatkan O (N)?) Dan mencoba menyederhanakan tidak akan membantu. Anda selalu dapat menggunakan backtracking sederhana seperti yang ditunjukkan Jetti, meskipun saya sarankan untuk menghindarinya jika memungkinkan.
Jika Anda akan menggunakan parser yang lebih canggih untuk lexing maka Anda mungkin tidak memerlukan fase lexing sama sekali. Faktanya, alasan mengapa kita memiliki fase lexing adalah bahwa lebih cepat untuk mengurai token lexed daripada untuk mengurai karakter, bersama dengan itu secara drastis menyederhanakan langkah penguraian kita. Jadi, dengan menggunakan parser yang lebih canggih Anda hanya kehilangan semua manfaat dari lexing di tempat pertama.
sumber
Masuk akal untuk melakukan analisis leksikal dengan ekspresi reguler, atau melewatkan pass ini sama sekali dan melakukan parsing tanpa lexer yang jauh lebih fleksibel dan kuat dengan PEG atau GLR.
sumber