//
Beni Kategorize Etme

Lexical Analyzer and Parser


Bir programlama dili için derleyici geliştirirken, kaynak kodun geçtiği ilk süreç Lexical Analysis sürecedir. Bu aslında bir nevi, “kaynak kod içinde aslında dile hiç ait olmayan bir şeyler var mı?” sorusunu cevaplamaktır.

Lexical Analysis süreci, dilin semantik olarak ya da söz dizimsel olarak incelendiği bir süreç değildir. Örneğin, bir dilin ebnf’i> şu şekilde olsun:

<ranger_program> –>{<ranger_line>} {\n}

<ranger_line> –>{<comment>|<whitespace>} <variable> {<comment>|<whitespace>} <compOperator> {<comment>|<whitespace>} <expr> {<comment>|<whitespace>} <endOfLine> {<comment>|<whitespace>}

<expr> –><leftParanthesis> <expr> <rightParanthesis> |<expr> <arithOperator> <expr> | <variable> | <intConstant>

<variable> –> {<letter>}

<compOperator> –> < | > | <= | >=

<arithOperator> –>+ | – | *

<intConstant> –> [-]{<digit>}

<comment> –> ‘{‘anything’}’

<endOfLine> –> ;

<whitespace> –>blank

<letter> –> a | b | c |…….| z|A|B|…..|Z

<digit> –> 0 | 1 | 2 |…….|9

EBNF’in aslında bu aşamada tek önemi dilde hangi terminallerin yer aldığının tespitidir. Örneğin bu dil için,

var < 5+3; ifadesi söz dizimsel olarak geçerli bir ifadedir ve lexical analyzer çıktısı

variable(var), compOperator(<), intConstant(5), arithOperator(+), intConstant(3), endOfLine(;)

şeklinde olur.

var < (-+67;); ifadesi ise söz dizimsel olarak geçersiz bir ifadedir. Fakat bu lexical analyzer’ın problemi değildir. Lexical analyzer herhangi bir hata vermeden şu çıkıtıyı üretmelidir:

variable(var), compOperator(<), leftParanthesis((), intConstant(-), arithOperator(+), intConstant(67), endOfLine(;), rightParanthesis()), endOfLine(;)

Görüldüğü üzere lexical analyzer’ın tek kaygısı, kaynak koddaki tüm terminallerin dil tarafından tanınıp tanınmadığıdır. Bir de bunun yanında, yorum satırlarının sonlanıp sonlamadığı da parsing aşamasına gelmeden lexical analysis aşamasında belli olur.

https://github.com/sumutcan/LexicalAnalyzer-and-Parser yandaki linkte geçen yıl programlama dilleri dersi için yukarıdaki dile özgü, java ile kodlanmış lexical analyzer ve parser’ı bulabilirsiniz. Dosya yolunu değiştirip denemelerde bulunabilirsiniz. Sevgili arkadaşım Buket ile beraber yapmıştık. Bence bölümde verilen en zevkli ödevlerden birisi her ne kadar uygulaması nispeten biraz daha zor alaşılır olsa da. Şimdilik parser kısmına fazla takılmanıza gerek yok, orada da Recursive Descent Parsing denilen bir teknik kullandık, daha sonra detaylı olarak açıklarım.

Yardımcı olabilmesi dileğiyle, esen kalın.

 

Tartışma

Lexical Analyzer and Parser” için bir yanıt

  1. Güzel paylaşım. Teşekkürler Umutcan.

    Posted by Sertaç EKŞİ | Mart 28, 2012, 1:10 pm

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s

Goodreads

İstatistik

  • 19.507 tıklama
wordpress stat
%d blogcu bunu beğendi: