• 词法分析


    #include <stdio.h>                 
    #include <string.h>               
    #include <conio.h>                
    #include <ctype.h>                 
    char prog[80]={'\0'},token[8];                    
    char ch;
    int syn,n,sum,m,p;                         
    char *rwtab[6]={"begin","if","then","while","do","end"};
    void scaner()
    {
        m=0;
        sum=0;
        for(n=0;n<8;n++)
            token[n]='\0';
        ch=prog[p++];
        while(ch==' ')
            ch=prog[p++];
        if(isalpha(ch))   
        {
            while(isalpha(ch)||isdigit(ch))    
            {
               token[m++]=ch;
               ch=prog[p++];
            }
               token[m++]='\0';
               ch=prog[p--];
               syn=10;
               for(n=0;n<6;n++)
                if(strcmp(token,rwtab[n])==0)   
                {
                    syn=n+1;
                    break;
                }      
           }
                else
            if(isdigit(ch))    
            {
                while(isdigit(ch))    
                {
                sum=sum*10+ch-'0';
                ch=prog[p++];
                }
                ch=prog[p--];
                syn=11;
            }
            else
                switch(ch)
            {
                    case'<':m=0;token[m++]=ch;ch=prog[p++];
                            if(ch=='>')
                            {
                                syn=21;
                                token[m++]=ch;
                            }
                            else if(ch=='=')
                            {
                                syn=22;
                                token[m++]=ch;
                            }
                                else
                                {
                                     syn=20;
                                     ch=prog[p--];
                                }
                            break;
                    case'>':m=0;token[m++]=ch;ch=prog[p++];
                            if(ch=='=')
                            {
                                syn=24;
                                token[m++]=ch;
                            }
                            else
                            {
                                syn=23;
                                ch=prog[p--];
                            }
                            break;
                 case':':m=0;token[m++]=ch;ch=prog[p++];
                         if(ch=='=')
                         {
                             syn=18;
                             token[m++]=ch;
                         }
                         else
                         {
                             syn=17;
                             ch=prog[p--];
                         }
                         break;
                 case'+':syn=13;token[0]=ch;break;
                 case'-':syn=14;token[0]=ch;break;
                 case'*':syn=15;token[0]=ch;break;
                 case'/':syn=16;token[0]=ch;break;
                 case'=':syn=25;token[0]=ch;break;
                 case';':syn=26;token[0]=ch;break;
                 case'(':syn=27;token[0]=ch;break;
                 case')':syn=28;token[0]=ch;break;
                 case'#':syn=0;token[0]=ch;break;
                 default:syn=-1;
    }
    }
    main()
    { 
        p=0;
        printf("\n请输入需要分析的字符串,以#表示结束:");
        do 
        {
               ch=getchar();
               prog[p++]=ch;
         }while(ch!='#');
       p=0;
       do
       {
            scaner();
            switch(syn)
            {
                case 11: printf("(%d,%d)\n",syn,sum);break;
                case -1: printf("\n 出错;\n");break;
                default: printf("(%d,%s)\n",syn,token);
            }
        }while(syn!=0);
        getch();
    }
  • 相关阅读:
    Mac重装系统 [转·整合]
    cocos2d-x使用plugin-x
    iOS启动其他应用程序[转]
    iOS时间的创建
    [转] 同步与异步的概念
    Apache 虚拟主机文档
    结构变量2
    //结构体的基本使用
    指向函数的指针
    返回指针的函数
  • 原文地址:https://www.cnblogs.com/TopHin/p/5925086.html
Copyright © 2020-2023  润新知