Herhangi bir dilde yazılmış bilgisayar programının derlenebilmesi veya yorumlanabilmesi için öncelikle "lexical analysis" denilen aşamadan geçmesi gerekiyor. Bu aşamada program kelimelere veya "token" denilen yapıtaşlarına ayrılıyor.
Programlama dilinin sentaksı, tokenlerin türleri hakkında bilgi verir. Örneğin birçok dilde yer alan bazı token türleri:
ID
Örnek: price calculateRate lastItem
NUM
Örnek: 73 0
REAL
Örnek: 12.5 0.23
COMMA
,
IF
if
Bir lexical analyser (lexer) yazabilmek için herhangi bir programlama dili kullanılabilir. Fakat özellikle "regular expressions" dili bu iş için kullanıma uygun.
Regular Expressions
Dil (language), bir string kümesi olarak tanımlansın. Örneğin Java dili, legal java programı oluşturabilecek tüm string lerin kümesidir. Bu durumda Java dili sonsuz elemana sahip bir küme.
Peki bir dili (belki sonsuz elemana sahip), nasıl sonlu ifadelerle (açıklamalarla) tanımlayabiliriz?
İşte burada "regular expressions" dilini kullanacağız. Bir regular expression, bir string kümesini ifade ediyor.
Alternation:
M ve N regular expression olsun. M | N yeni bir regular expression ifade eder.
Bir stringin M | N kümesinde yer alması için ya M ya da N kümesinde yer alması gerekir.
Örnekler:
a | b {"a", "b"}
1 | 2 | 3 {"1","2","3"}
Concatenation:
M ve N regular expression olsun. M . N yeni bir regular expression ifade eder.
Bir stringin M . N kümesinde yer alması için M veya N 'nin elemanlarından herhangi ikisinin birleştirilmesinden oluşması gerekir.
Örnekler:
a.b {"ab"}
a . (b | c) {"ab", "ac"}
Repetition:
M bir regular expression olsun. M* yeni bir regular expression ifade eder.
Bir stringin M* kümesinde yer alması için M kümesi içerisindeki sıfır veya daha fazla elemanın birleştirilmesinden oluşması gerekir.
Örnekler:
a* {"", "a", "aa", "aaaa", ...}
(a.b)* {"", "ab","abab","ababab", ...}
((a | b) · a)* {"", "aa","ba","aaaa","aaba", "baba","baaa","aabaaababa", ...}
Herhangi bir regular expression, semboller ve yukarıdaki operatörlerle ifade edilebilir. Fakat yararlı bazı kısaltmalar kullanılmaktadır:
MN M . N anlamındadır.
M+ M . M* anlamındadır. (Bir veya daha fazla)
M? Sıfır veya bir tane M
[abcd] a | b | c | d anlamındadır.
[a-d] a | b | c | d anlamındadır.
[a-c1-5] a | b | c | 1 | 2 | 3 | 4 anlamındadır.
Sonuç olarak yukarıda kuralları ifade edilen regular expressions dilini kullanarak, bir string kümesi ifade edebiliriz. Örneğin mümkün olan tüm e-mail adresleri kümesini ifade etmek için yukarıdaki basit kuralları kullanarak bir regular expression yazabiliriz.
Comments