Karena Anda ingin mempelajari cara kerja lexer, saya kira Anda sebenarnya ingin tahu cara kerja lexer generator.
Generator lexer mengambil spesifikasi leksikal, yang merupakan daftar aturan (pasangan regular-ekspresi-token), dan menghasilkan lexer. Lexer yang dihasilkan ini kemudian dapat mengubah string input (karakter) menjadi string token sesuai dengan daftar aturan ini.
Metode yang paling umum digunakan terutama terdiri dari mengubah ekspresi reguler menjadi automata terbatas deterministik (DFA) melalui automata nondeterministic automata (NFA), ditambah beberapa detail.
Panduan terperinci untuk melakukan transformasi ini dapat ditemukan di sini . Perhatikan bahwa saya belum membacanya sendiri, tetapi terlihat cukup bagus. Juga, hampir semua buku tentang konstruksi kompiler akan menampilkan transformasi ini dalam beberapa bab pertama.
Jika Anda tertarik dengan slide kuliah tentang topik ini, tidak ada keraguan jumlah mereka yang tak ada habisnya dari kursus konstruksi kompiler. Dari universitas saya, Anda dapat menemukan slide seperti itu di sini dan di sini .
Ada beberapa hal lagi yang biasanya tidak digunakan dalam lexers atau diperlakukan dalam teks, tetapi tetap sangat berguna:
Pertama, menangani Unicode agak tidak trivial. Masalahnya adalah input ASCII hanya selebar 8 bit, yang berarti Anda dapat dengan mudah memiliki tabel transisi untuk setiap keadaan di DFA, karena mereka hanya memiliki 256 entri. Namun, Unicode, dengan lebar 16 bit (jika Anda menggunakan UTF-16), membutuhkan tabel 64k untuk setiap entri di DFA. Jika Anda memiliki tata bahasa yang rumit, ini mungkin mulai memakan banyak ruang. Mengisi tabel ini juga mulai memakan sedikit waktu.
Atau, Anda dapat membuat pohon interval. Pohon rentang dapat berisi tupel ('a', 'z'), ('A', 'Z') misalnya, yang jauh lebih efisien memori daripada memiliki tabel penuh. Jika Anda mempertahankan interval yang tidak tumpang tindih, Anda dapat menggunakan pohon biner seimbang untuk tujuan ini. Waktu berjalan linear dalam jumlah bit yang Anda butuhkan untuk setiap karakter, jadi O (16) dalam kasus Unicode. Namun, dalam kasus terbaik, biasanya akan sedikit lebih sedikit.
Satu masalah lagi adalah bahwa lexers seperti yang biasa dihasilkan sebenarnya memiliki kinerja kuadratik terburuk. Meskipun perilaku terburuk ini tidak umum terlihat, ini mungkin menggigit Anda. Jika Anda mengalami masalah dan ingin menyelesaikannya, makalah yang menjelaskan cara mencapai waktu linier dapat ditemukan di sini .
Anda mungkin ingin dapat menggambarkan ekspresi reguler dalam bentuk string, seperti yang biasanya muncul. Namun, menguraikan deskripsi ekspresi reguler ini ke dalam NFA (atau mungkin struktur menengah rekursif pertama) adalah sedikit masalah ayam-telur. Untuk menguraikan deskripsi ekspresi reguler, algoritma Shunting Yard sangat cocok. Wikipedia tampaknya memiliki halaman yang luas tentang algoritme .