Lexer'ların nasıl çalıştığını öğrenmek istediğiniz için, sanırım lexer jeneratörlerinin nasıl çalıştığını bilmek istediğinizi varsayalım.
Bir lexer üreteci, kuralların bir listesi olan (normal ifade-token çiftleri) sözcüksel bir şartname alır ve bir lexer oluşturur. Bu sonuçtaki lexer daha sonra bu kural listesine göre bir girdi (karakter) dizgisini bir belirteç dizgisine dönüştürebilir.
En yaygın olarak kullanılan yöntem, normal bir ifadeyi belirsiz olmayan bir otomata (NFA) ve birkaç ayrıntıyı kullanarak deterministik bir sonlu otomata (DFA) dönüştürmekten oluşur.
Bu dönüşümü yapmak için ayrıntılı bir rehber burada bulunabilir . Kendim okumadığımı unutmayın, ama oldukça iyi görünüyor. Ayrıca, derleyici yapımıyla ilgili hemen hemen her kitap, ilk birkaç bölümde bu dönüşümü sunacaktır.
Eğer konuyla ilgili derslerin ders slaytları ile ilgileniyorsanız, derleyici sayısının derleyici inşaatı derslerinden şüphesiz var. Üniversitemden bu tür slaytları burada ve burada bulabilirsiniz .
Sözlüklerde yaygın olarak kullanılmayan veya metinlerde tedavi edilen, ancak yine de oldukça yararlı olan birkaç şey daha vardır:
İlk olarak, Unicode kullanımı biraz önemsizdir. Sorun, ASCII girişinin sadece 8 bit genişliğidir, bu da DFA'daki her durum için kolayca bir geçiş tablosuna sahip olabileceğiniz anlamına gelir, çünkü bunlar sadece 256 girişe sahiptir. Ancak, Unicode, 16 bit genişliğinde (UTF-16 kullanıyorsanız), DFA'daki her giriş için 64k tablo gerektirir. Karmaşık gramerleriniz varsa, bu biraz yer kaplayabilir. Bu tabloları doldurmak da biraz zaman almaya başlar.
Alternatif olarak, aralıklı ağaçlar oluşturabilirsiniz. Bir aralık ağacında, tuples ('a', 'z'), ('A', 'Z') bulunabilir; Çakışmayan aralıkları koruyorsanız, bu amaçla herhangi bir dengeli ikili ağaç kullanabilirsiniz. Çalışma süresi, her karakter için ihtiyacınız olan bit sayısında doğrusaldır, bu nedenle Unicode durumunda O (16). Ancak, en iyi durumda, genellikle biraz daha az olacaktır.
Bir başka konu, yaygın olarak üretilen lexerların aslında en kötü durumda ikinci dereceden bir performansa sahip olmasıdır. Bu en kötü durum davranışı sık görülmese de, sizi ısırabilir. Problemle karşılaşırsanız ve çözmek istiyorsanız, doğrusal zamanın nasıl elde edileceğini açıklayan bir makale burada bulunabilir .
Muhtemelen normal ifadeleri normal olarak göründükleri gibi dize biçiminde tanımlamak isteyeceksinizdir. Bununla birlikte, bu düzenli ekspresyon açıklamalarını NFA'lara (veya muhtemelen tekrarlayan bir ara yapıya) ayrıştırmak, bir tavuk yumurtası problemidir. Düzenli ifade açıklamalarını ayrıştırmak için, Shunting Yard algoritması çok uygundur. Wikipedia'nın algoritma hakkında kapsamlı bir sayfası var gibi görünüyor .