Yorumlayıcı

Bu tasarım desenindeki amaç, özelleşmiş bir bilgisayar dilinin yorumlanmasının gerçekleştirilmesidir. Ana fikir, bu özelleşmiş dilin her bir sembolü için ayrı bir sınıf yaratmaktır. Bu tasarım deseni, veritabanı yönetim sistemlerindeki SQL tarzı dillerin yorumlanmasında kullanılabilir. Bir başka örnek olarak, bilgisayar ağlarındaki iletişim protokollerindeki özel dillerin çözümlenmesinde kullanılabilir.

Örnek :

Örnekte, '+' ( artı ), '-' ( eksi ) ve '%' ( yüzde ) karakterlerinden oluşan bir bilgisayar dilinin yorumlanması gösterilmiştir. Her bir karakter için, ArtıSembol, EksiSembol ve YüzdeSembol sınıfları oluşturulmuştur. Bu sınıflar da Sembol üst arayüz sınıfından türetilmiştir. DilYorumlayıcısı istemci sınıfı, verilen metnin her bir karakterini ayrıştırmıştır. Her bir karakter için ayrı bir sembol karakteri oluşturulup, bu sınıflar bir listeye eklenmiştir. Daha sonra, liste sırayla dolaşılarak, "Sembol" sınıfının "yorumla" yordamı çağırılarak verilen metin yorumlanmıştır.

Örnek Sınıf Çizelgesi :

Örnek Java Kodu : ( Kodlar java 1.6.0.7 ile derlenip, çalıştırılmıştır. )

Sembol.java :

public interface Sembol {

void yorumla();

}

ArtıSembol.java :

public class ArtıSembol implements Sembol {


public void yorumla() {

System.out.println( "+ sembolü yorumlandı.");

}

}

EksiSembol.java :

public class EksiSembol implements Sembol {


public void yorumla() {

System.out.println( "- sembolü yorumlandı.");

}

}

YüzdeSembol.java :

public class YüzdeSembol implements Sembol {


public void yorumla() {

System.out.println( "% sembolü yorumlandı.");

}

}

DilYorumlayıcısı.java :

import java.util.ArrayList;

import java.util.List;


public class DilYorumlayıcısı {


public static void main(String[] args) {

// Yorumlanacak dil.

String metin = "++-%%+-";

List< Sembol > sembolListesi = new ArrayList< Sembol >();


// Metni ayrıştır ve sembol sınıflarını

// listeye ekle.

for ( char c : metin.toCharArray() ) {

if ( c == '+' ) {

sembolListesi.add( new ArtıSembol() );

} else if ( c == '-' ) {

sembolListesi.add( new EksiSembol() );

} else if ( c == '%' ) {

sembolListesi.add( new YüzdeSembol() );

}

}


// Yorumla.

for ( Sembol s : sembolListesi ) {

s.yorumla();

}

}

}