Lexical analisis atau sering disebut dengan scanner, bertugas sebelum proses syntax analyzer, dan intermediate code dilakukan, dimana tugas dari lexikal analisis adalah mendekomposisi/mengubah program sumber (dalam hal ini berarti "source code ") menjadi bagian - bagian kecil.
adapaun tugas - tugasnya secara mendetail adalah :
- mengidentifikasi semua besaran yang membangun suatu bahasa
- mentranformasikan ke token-token
- menentukan jenis dari token-token
- menangani kesalahan
- menangani tabel simbol
 
Berikut ini adalah source code dari scanner : 
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<conio.h>
typedef struct t1tag
{
    char nm[20];
} t1;
t1 Type[] = {"keyword","operator","identifier","number","string","illegal character",
                 "assignment","paranthesis","end of series","relational operator","array start",
             "array end","separator","separator","Unary Operator","Compiler directive",
             "converter","range"};
t1 Rsrv[] = {"BEGIN","END","IF","THEN","ELSE","DO","FOR","TO","WHILE","REPEAT","UNTIL",
                 "PROCEDURE","FUNCTION","INTEGER","REAL","BYTE","CHAR","TEXT","ARRAY","VAR",
             "RECORD","SET","TYPE","AND","CASE","CONST","DIC","DOWNTO","EXTERNAL","FILE",
             "FORWARD","GOTO","IN","INLINE","INTERUPT","LABEL","MOD","NIL","NOT","OF",
             "OR","PACKED","PROGRAM","WITH","BOOLEAN","INPUT","OUTPUT","WHILE","WRITELN"};
long s = 49;
char oprtr[] = {'.',',',';','=',':','[',']','(',')','-','+','/','*','>','<','$','#','@'};
long t = 18;
typedef struct ttyptg
{
    long no;
   char ctkn[50];
   int typ;
   long lline;
} ttyp;
int isReserved(char tmp[])
{
    long i=0;
   char *str;
   str = strupr( strdup( tmp ));
   while ( (i < s) && ( strcmp(str, Rsrv[i].nm) != 0))
   {
     i++;
   }
   if ( strcmp(str, Rsrv[i].nm) != 0)
   return 1;
return 0;
}
void main(void)
{
    long i,j,ind,zz,N,NN,ln;
   char ch,nxt,instr[1024], tmp[100], FName[256];
   ttyp Token[1024];
   FILE *f;
   printf("Inputkan Nama File : \n");
   scanf("%s", FName);
   f = fopen(FName,"r");
   ln = 0;
   NN = 0;
   while (!feof(f))
   {
       N=0;
       ch = 0;
       while (('\n' != (ch = getc(f))) && (!feof(f)))
       {
          instr[N] = ch;
          N++;
       }
           instr[N] = 0;
           N++;
       //Token contruction here
       ind = 0;
       while (ind < (N - 1))
       {
           ch = instr[ind];
          while (ch ==32)
          {
          ind++;
         ch = instr[ind];
          }
          if (ind <N)
          {
              j=0;
             while ((j<t)&&(ch !=oprtr[j]))
             j++;
          }
         if (ch==oprtr[j])
         {
             zz=0;
            tmp[0] = ch;
            if (ind <N)
            nxt = instr[ind + 1];
            if ((nxt == '>') || (nxt =='='))
            {
                zz++;
               tmp[1] = nxt;
               ind += 2;
               Token[NN].typ = 16;
            }
            else
            ind++;
            switch (ch)
            {
                case ':': if (nxt == '=')
                               Token[NN].typ = 6;
                           else
                           Token[NN].typ = 1;
                            break;
               case '+' :
               case '-' :
               case '*' :
               case '/' : Token[NN].typ = 1; break;
               case '.' : if (nxt != '.') Token[NN].typ = 1; break;
               case ';' : Token[NN].typ = 8; break;
               case ',' : Token[NN].typ = 12; break;
               case '=' :
               case '>' :
               case '<' : Token[NN].typ = 9; break;
               case '[' : Token[NN].typ = 10; break;
               case ']' : Token[NN].typ = 11; break;
               case '(' :
               case ')' : Token[NN].typ = 7; break;
               case '$' : Token[NN].typ = 14; break;
               case '#' : Token[NN].typ = 15; break;
               case '@' : Token[NN].typ = 13; break;
            }
            zz++;
            tmp[zz] = 0;
            Token[NN].no = NN;
            strcpy(Token[NN].ctkn, tmp);
            Token[NN].lline = ln;
            NN++;
         }
         else if (ch == 39)
         {
             zz =0;
            ind++;
            nxt = instr[ind];
            tmp[0] = nxt;
            while (nxt != 39)
            {
                zz++;
               ind++;
               tmp[zz] = nxt = instr[ind];
            }
            tmp[zz] = 0;
            Token[NN].no = NN;
            strcpy(Token[NN].ctkn, tmp);
            Token[NN].typ = 4;
            Token[NN].lline = ln;
            NN++;
            ind++;
         }
         else if (((ch>=65) && (ch <= 90)) || ((ch >=97) && (ch<=122)) || (ch == 95))
         {
             zz= 0;
            tmp[0] = ch;
            nxt = instr[ind + 1];
            zz++;
            while (((nxt >= 65) && (nxt <= 90)) || ((nxt >=97) && (nxt <=122)) || (nxt == 95) || ((nxt >= 48 )&& (nxt <=57)))
            {
                ind++;
               ch = instr[ind];
               tmp[zz] = ch;
               zz++;
               nxt = instr[ind + 1];
            }
            tmp[zz] = 0;
            if (isReserved(tmp) == 0)
                    Token[NN].typ = 0;
                  else
                  Token[NN].typ = 2;
            Token[NN].no = NN;
            strcpy(Token[NN].ctkn, tmp);
            Token[NN].lline = ln;
            NN++;
            ind++;
         }
         else if ((nxt >= 48) &&(ch<=57))
         {
             zz = 0;
            tmp[0] = ch;
            nxt = instr[ind + 1];
            zz++;
                while (((nxt >= 48) &&(nxt <= 57)))
            {
                ind++;
               ch = instr[ind];
               tmp[zz]= ch;
               zz++;
               nxt = instr[ind +1];
            }
            tmp[zz] = 0;
            Token[NN].typ = 3;
            Token[NN].no = NN;
            strcpy(Token[NN].ctkn, tmp);
            Token[NN].lline = ln;
            NN++;
            ind++;
         }
         else
         {
             Token[NN].no = NN;
            Token[NN].ctkn[0] = ch;
            Token[NN].ctkn[1] = 1;
            Token[NN].typ = 5;
            Token[NN].lline = ln;
            NN++;
            ind++;
         } //if
      } //if
   }//while
   ln++;
//}
fclose(f);
f = fopen("Token.txt", "w");
fprintf(f,"\n No line token TIP\n");
fprintf(f,"________________________________________________________________________________\n");
for (i=0;i<NN;i++)
{
    fprintf(f, " %4ld   % 4ld    %30s      %20s\n",
   Token[i].no, Token[i].lline, Token[i].ctkn, Type[Token[i].typ].nm);
}
fclose(f);
}
Kode diatas sudah di test oleh saya sendiri dan bisa berjalan dengan baik.
 
Semoga bermanfaat
sumber : google.co.id
Jumat, 16 Desember 2011
Langganan:
Posting Komentar (Atom)









4 komentar:
kalo dalam bhs c seperti apa ya? perulangannya saya bingung
int main(void)
mas maaf newbie,saya bngung slalu ada eror proj0000.cpp itu
Posting Komentar
Silahkan isi komentar anda disini!!!