码迷,mamicode.com
首页 > 其他好文 > 详细

0917词法分析

时间:2015-10-14 23:25:25      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:

#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)
            {
                lin[j++]=ch;
                ch=pro[i++];  
            }
            i--;
            lin[j]=‘\0‘;
            syn=11;
        }
    }
    else                                               //判断其它符号
    {
        /////////判断<,<=,<>
        
                
        if(ch==‘<‘)
        {
            lin[j++]=ch;
            ch=pro[i++];
            if (ch==‘=‘)
            {  
                syn=21;
                lin[j++]=ch;
                lin[j]=‘\0‘;
            }
            else if(ch==‘>‘)
            {  
                syn=22;
                lin[j++]=ch;
                lin[j]=‘\0‘;
            }
            else
            {
                syn=20;
                lin[j]=‘\0‘;
                i--;
            }
        }
        ///////////判断>,>=
        else if(ch==‘>‘)
        {
            lin[j++]=ch;
            ch=pro[i++];
            if (ch==‘=‘)
            {
                syn=24;
                lin[j++]=ch;
                lin[j]=‘\0‘;
            }
            else
            {
                syn=23;
                lin[j]=‘\0‘;
                i--;
            }
        }
 ////////////判断 :,:=
        else if(ch==‘:‘)
        {
            lin[j++]=ch;
            ch=pro[i++];
            if (ch==‘=‘)
            {
                syn=18;
                lin[j++]=ch;
                lin[j]=‘\0‘;
            }
            else
            {
                syn=17;
                lin[j]=‘\0‘;
                i--;
            }
        }
  //////////判断其它符号
        else if(ch==‘+‘)
        {
            syn=13;
            lin[j++]=ch;
            lin[j]=‘\0‘;
        }
        else if(ch==‘-‘)
        {
            syn=14;
            lin[j++]=ch;
            lin[j]=‘\0‘;
        }
        else if(ch==‘*‘)
        {
            syn=15;
            lin[j++]=ch;
            lin[j]=‘\0‘;
        }
        else if(ch==‘/‘)
        {
            syn=16;
            lin[j++]=ch;
            lin[j]=‘\0‘;
        }
        else if(ch==‘=‘)
        {
            syn=25;
            lin[j++]=ch;
            lin[j]=‘\0‘;
        }
        else if(ch==‘;‘)
        {
            syn=26;
            lin[j++]=ch;
            lin[j]=‘\0‘;
        }
        else if(ch==‘(‘)
        {
            syn=27;
            lin[j++]=ch;
            lin[j]=‘\0‘;
        }
        else if(ch==‘)‘)
        {
            syn=28;
            lin[j++]=ch;
            lin[j]=‘\0‘;
        }
        else if(ch==‘#‘)
        {
            syn=0;
            lin[j++]=ch;
            lin[j]=‘\0‘;
        }
        else
            syn=-1;      
}
return syn;
}
void read()   //读入数据函数
{
    FILE *fp;
    int k;
    for(k=0;k<max-1;k++)
    {
        scanf(fp,"%c",&pro[k]);
    }
    pro[k]=‘\0‘;
}
void main()

{
   printf( "Please input source code:\n" );
   do{
       ch=getchar();//读入字符串
       pro[i++]=ch;
   }while(ch!=‘#‘);
   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();
}

0917词法分析

标签:

原文地址:http://www.cnblogs.com/xiaochenxi/p/4880902.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!