Skip to content

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.

 

Published inBeni Kategorize Etme

2 Comments

  1. Sertaç EKŞİ Sertaç EKŞİ

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

Leave a Reply