Sözcüksel analizörün (Tarayıcı olarak da adlandırılır) çalışmasını görelim.
Örnek bir ifadeyi ele alalım:
INPUT : cout << 3+2+3;
FORMATTING PERFORMED BY SCANNER : {cout}|space|{<<}|space|{3}{+}{2}{+}{3}{;}
gerçek çıktı değil.
TARAYICI, GİRİŞ TÜKENDİ OLANA KADAR KAYNAK PROGRAMI METİNİ İÇİNDEKİ BİR LEXEME İÇİN TEKRAR GÖRÜYOR
Lexeme, gramerde mevcut olan geçerli bir uçbirim dizisini oluşturan bir girdi alt dizesidir. Her sözcük birimi, sonunda açıklanan bir örüntüyü takip eder (okuyucunun sonunda atlayabileceği kısım)
(Önemli bir kural, bir sonraki boşlukla karşılaşılıncaya kadar geçerli bir uçbirim dizisini oluşturan mümkün olan en uzun öneki aramaktır ... aşağıda açıklanmıştır)
LEXEMES:
- cout
- <<
("<" aynı zamanda geçerli terminal dizesi olmasına rağmen, yukarıda belirtilen kural, tarayıcı tarafından döndürülen jetonu oluşturmak için "<<" sözlüğü kalıbını seçmelidir)
- 3
- +
- 2
- ;
TOKENS: Belirteçler, Tarayıcı (geçerli) bir sözcük birimi bulduğu her seferde (Ayrıştırıcı tarafından istendiğinde Tarayıcı tarafından) birer birer iade edilir. Tarayıcı, zaten mevcut değilse, bir sembol tablosu girişi oluşturur (özniteliklere sahip: esas olarak simge kategorisi ve birkaç başka özellik) , bir sözcükbirimi bulduğunda, belirtecini oluşturmak için
'#' bir sembol tablosu girişini belirtir. Anlama kolaylığı açısından yukarıdaki listede sözcük birimi numarasına işaret ettim, ancak teknik olarak sembol tablosundaki gerçek kayıt indeksi olmalıdır.
Aşağıdaki belirteçler, yukarıdaki örnekte belirtilen sırayla tarayıcı tarafından ayrıştırıcıya döndürülür.
<tanımlayıcı, # 1>
<Operatör, # 2>
<Değişmez, # 3>
<Operatör, # 4>
<Değişmez, # 5>
<Operatör, # 4>
<Değişmez, # 3>
<Noktalama Aracı, # 6>
Farkı görebileceğiniz gibi, bir simge, girişin bir alt dizesi olan sözcükbiriminden farklı olarak bir çifttir.
Ve çiftin ilk öğesi simge sınıfı / kategorisidir
Token Sınıfları aşağıda listelenmiştir:
ANAHTAR KELİMELER
TANIMLAYICILAR
LİTERALLER
PUNCTUATORS
OPERATÖRLER
Ve bir şey daha, Tarayıcı beyaz boşlukları algılar, onları yok sayar ve bir boşluk için herhangi bir simge oluşturmaz. Tüm sınırlayıcılar beyaz boşluk değildir; beyaz boşluk, tarayıcılar tarafından amacı doğrultusunda kullanılan bir sınırlayıcı biçimidir. Girişteki Sekmeler, Yeni Satır, Boşluklar, Kaçan Karakterlerin tümü topluca Beyaz Boşluk sınırlayıcıları olarak adlandırılır. Diğer birkaç sınırlayıcı ';' ',' ':' etc, token oluşturan sözcükbirimleri olarak yaygın şekilde tanınmaktadır.
Burada döndürülen toplam simge sayısı 8'dir, ancak sözcükler için yalnızca 6 simge tablosu girişi yapılır. Lexemler de toplamda 8'dir (sözlükeme tanımına bakın)
--- Bu bölümü atlayabilirsiniz
A ***pattern*** is a rule ( say, a regular expression ) that is used to check if a string-of-terminals is valid or not
.
If a substring of input composed only of grammar terminals is
following the rule specified by any of the listed patterns , it is
validated as a lexeme and selected pattern will identify the category
of lexeme, else a lexical error is reported due to either (i) not
following any of the rules or (ii) input consists of a bad
terminal-character not present in grammar itself.
for example :
1. No Pattern Exists : In C++ , "99Id_Var" is grammar-supported string-of-terminals but is not recognised by any of patterns hence lexical error is reported .
2. Bad Input Character : $,@,unicode characters may not be supported as a valid character in few programming languages.`