Makale Özeti

Programlama dili geliştirmek dikkat, zahmet ve ciddi bir alta yapı gerektiren bir iş. Bu yazımızda ve devam edecek diğer yazılarımızda adım adım yeni bir dil nasıl geliştirilir öğrenmeye çalışacağız.

Makale

Biraz garip gelebilir ama bir çok programcı yeni bir programlama dili nasıl geliştirilir bilmemekte. Hatta bazı 'acemi' programcılar yazdıkları kodu derlediklerinde arka planda ne olup bittiği (derleyicinin nasıl çalıştığı )hakkında herhangi bir bilgiye sahip değiller. Gerçi her programcı için dil geliştirme aşamalarını bilmek pek öyle ilgi çekici bir konu değildir. Zira bu konular hem çok karmaşık, hemde birçok kişi için bu konuları bilmek kod yazma açısından hiçbir artı değer sağlamayabilir.

Programlama dili tasarımı konusunda bir dizi yazı yayınlayacağım. İlk olarak basit seviyede bir dilbilgisi kontrölü ile başlacak bu yazı dizisi lexical analyzer, parser geliştirilmesini içeren ileri seviye makalelerle devam edecek.

Farz-ı misal aşağıdaki gibi bir dilbilgisine ( kurallar dizisi, gramer) sahip bir dilimiz olsun.

S → BAb
A → aA | a
B → bB | b

Bu dilbilgisi, bir veya daha fazla 'b' karakteri ile başlayıp, bir veya daha fazla ile 'a' karakteri devam eden ve tek bir 'b' karakteri ile nihayet bulan sözcükleri kabul etmektedir. Bu kurala uyan örnek sözcükler ve bu sözcüklerin türetiliş aşamaları aşağıdaki gibidir:

bab

bbab

bbbab

baaaab

S → BAb

bAb

bab

S → BAb

bBAb

bbAb

bbab

S → BAb

bBAb

bbBAb

bbbAb

bbbab

S → BAb

bAb

baAb

baaAb

baaaAb

baaaab



Şimdi girilen sözüklerin bu dilbilgise ait olup olmadığını kontrol eden bir program geliştirelim:

/*---------------------------------------------------------------------*/
/* This program determines whether the submitted input can be produced */
/* in given grammar or not                                             */
/* Grammar:                                                            */
/* S ->BAb                                                             */
/* B ->bB | b                                                          */
/* A ->aA | a                                                          */
/* Programmed by Ozcan ILIKHAN, March 16,2006                          */
/* EMU - Cmpe 318 Course (Programming Language Design)                 */
/*---------------------------------------------------------------------*/

#include <iostream>
#define BUFSIZE 500
char buf[BUFSIZE];     /* buffer for input string */
int bufp = 0;          /* current position in buf */
 
using namespace std;

int S (); //if rule for S is satisfied return s 1, else return 0.
int B (); //if rule for B is satisfied return s 1, else return 0.
int A (); //if rule for A is satisfied return s 1, else return 0.
 
int main()
{
      cout <<" Grammar:"
             <<"\n S -> BAb "<< "\n B -> bB | b "<<"\n A -> aA | a"<<endl;
      cout << "\nEnter a string to test for given grammar :";
      cin.getline(buf,BUFSIZE);
      if( S() )//if given input is acceptable:
            cout <<" Recognized the sentence: "<< buf<<endl;
      else
            cout << "Failed to recognize the sentence: "<< buf <<endl;
      return 0;
}

int S()
{   //Rule:  S -> BAb
      if( B()==0 || A()==0 )
      //if rule for B or rule for A is not satisfied, given string is not acceptable.
            return 0;
      if( buf[bufp] == 'b' &&  buf[bufp+1] == '\0')
      //if there is only one char acter after a series of char acter 'a'
      //and it is 'b', then input is acceptable
            return 1;
      else return 0;
}

int B()
{     //Rule:  B -> bB | b
      char c;
      if( ( c= buf[bufp] ) == 'b')
      {
            bufp++;
            B();
            return 1;
      }
      return 0;
}

int A()
{
      //Rule:  A -> aA | a
      char c;
      if( ( c = buf[bufp] ) == 'a')
      {
            bufp++;
            A();
            return 1;
      }
      return 0;
}

Bir sonraki yazıda görüşmek dileğiyle...