天天看點

1015詞法分析

#include<stdio.h>

#include<string.h>//strcmp()用于比較兩個字元串

#include<conio.h>//getch()

#define max 200

char pro[max], lin[20];

int  n,i,syn;

char   *word[6]={ "begin", "if" , "then", "while", "do" ,"end" };   // 關鍵字,特殊辨別符

char   ch ;

scaner( )

    int j=0;

    for ( n=0; n<20; n++ ) 

        lin[n]=NULL;                                //臨時數組初始化

    ch=pro[i++];                                    //讀取字元串

    while (ch==' ')                                 //判斷,跳過空字元  

        ch=pro[i++];       //讀取整個單詞

    if  ((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')||(ch>=48&&ch<=57))   //判斷是否是字母或數字

    { 

        if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'))                   //判斷标示符和特殊關鍵字                      

        {

            lin[j++]=ch;

            ch=pro[i++];   //pro[i++]空,關鍵字

            while((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')||(ch>=48&&ch<=57))//判斷辨別符

            { 

                lin[j++]=ch;

                ch=pro[i++];   

            }

            lin[j]='\0';   //結束标志,回車

            i--;

            syn=10;        //單詞種别碼

            for (n=0;n<6 ;n++ )

                if(strcmp(lin,word[n])==0) //查找關鍵字表是否符合

                {      

                    syn=n+1;

                    break ;

                }

        }

        else               //判斷數字

        {  

            while (ch>=48&&ch<=57)

                ch=pro[i++];  

            lin[j]='\0';

            syn=11;

    }

    else           //判斷其它符号

    {

                    //判斷<,<=,<>

        if(ch=='<') 

            ch=pro[i++];

            if (ch=='>')

            {  

                syn=21;

                lin[j]='\0';

            else if(ch=='=')

                syn=22;

            else 

                syn=20;

                i--;

        } 

                   ///判斷>,>=

        else if(ch=='>')

            if (ch=='=')

            {

                syn=24;

                syn=23;

                   //判斷 :,:=

        else if(ch==':')

                syn=18;

                syn=17;

            } 

                  ///判斷其它符号

        else if(ch=='+')

            syn=13; 

            lin[j]='\0';

        else if(ch=='-')

            syn=14; 

        else if(ch=='*')

            syn=15; 

        else if(ch=='/')

            syn=16; 

        else if(ch=='=')

            syn=25; 

        else if(ch==';')

            syn=26; 

        else if(ch=='(')

            syn=27; 

        else if(ch==')')

            syn=28; 

        else if(ch=='#')

            syn=0; 

        else

            syn=-1;      

}

return syn;

void read()   //定義從檔案讀入資料函數

{

    int k;

    for(k=0;k<max-1;k++)

        scanf("%c",&pro[k]);

    pro[k]='\0';

void main()

{      

    int i=0 ;

   printf( "Please input source code:\n" );

   do{

       ch=getchar();//讀入字元串

       pro[i++]=ch;

   }while(ch!='#');//将所讀字元串存入數組pro[],直到遇到#

   i=0;

   do

   {     

       scaner();

       switch(syn)

       { 

       case 11:   printf ("(%d,%s)\n",syn,lin); 

           break;

       case -1:  printf("錯誤符号\n");

           break;     

       default:   printf ("(%d,%s)\n",syn,lin);

       }

   } while (syn!=0);

   getch();