zoukankan      html  css  js  c++  java
  • 词法分析程序(C)

    #include <stdio.h>  
    #include <string.h>  
      
    char string[80],word[8],ch;  
    int type,p,i,n,sum;  
    char keyword[][6]={"begin","if","then","while","do","end"};    //关键字数组
       
    void scaner(void);  
      
    main()  
    {  
        p=0;  
        printf("
    
    请输入一个程序段(以'#'结束):
    ");  
        do{  
                scanf("%c",&ch);  
                string[p++]=ch;  
        }while(ch!='#');  
         printf("单词符号	种别码 
    ");  
        p=0;  
        do{  
                scaner();  
                switch(type)  
                {  
                    case 11:  
                        printf("   %-10d%5d
    ",sum,type);  
                    break;  
                    case -1:  
                        printf("有无法识别的字符
    ");    
                        return 0;  
                    break;       
                    default:   
                    printf("   %-10s%5d 
    ",word,type);  
                    break;  
                }  
            }while(type!=0);  
     }  
      
    void scaner(void)  
    {    
        sum=0;  
        for(i=0;i<8;i++)  
           word[i++]= NULL;  
          
    
        ch=string[p++];  
        i=0;  
              
        while((ch==' ')||(ch=='
    '))  
            ch=string[p++];  
          
        if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))  
         {   
            while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))  
            {  
                word[i++]=ch;  
                ch=string[p++];  
            }
              
         p--; 
         type=10;                     //先将以字母开头的字符识别为标识符
      
            for(n=0;n<6;n++)  
            if(strcmp(word,keyword[n])==0)    //关键字数组比较,相同则表示为关键字,种别码即为下标值加一
            {   
                type=n+1;  
                break;  
            }  
        }                                   
        
        
        else if((ch>='0')&&(ch<='9'))  
         {   
            while((ch>='0')&&(ch<='9'))  
            {  
                sum=sum*10+ch-'0';    //将字符型转化为整形sum
                ch=string[p++];  
            }  
            p--;  
            type=11;  
         }  
    
    
        else                   //else语句内识别除关键字、标识符、数字以外的其他字符
        {  
            switch(ch)  
            {  
            case '+':  
                type=13;  
                word[i++]=ch;          
            break;  
      
            case '-':   
                type=14;
                word[i++]=ch;   
            break; 
            
             case '*':  
                type=15;  
                word[i++]=ch;  
            break;  
      
            case '/':  
                type=16;  
                word[i++]=ch;  
            break;  
    
            case ':':  
                word[i++]=ch;  
                ch=string[p++];  
             if(ch=='=')  
               {  
                   type=18;  
                   word[i++]=ch;  
               }  
                else  
                {   
                    type=18;  
                    p--;  
                }  
            break; 
            
            case '<':  
                word[i++]=ch;  
                ch=string[p++];  
                if(ch=='=')  
                {   
                    type=21;  
                    word[i++]=ch;  
                }  
                else  
                {    
                    type=20;  
                    p--;  
                }  
            break;  
      
            case '>':  
                word[i++]=ch;  
                ch=string[p++];  
                if(ch=='=')  
                {  
                    type=24;  
                    word[i++]=ch;  
                }  
                else  
                {   
                    type=23;  
                    p--;  
                }  
            break;
            
            case '=':  
                    type=25;  
                    word[i++]=ch;  
            break;  
      
            case ';':  
                type=26;  
                word[i++]=ch;  
            break;  
    
            case '(':   
                type=27;  
                word[i++]=ch;  
            break;  
      
            case ')':  
                type=28;  
                word[i++]=ch;  
            break;  
      
            case '#':   
                type=0;  
                word[i++]=ch;  
            break;  
      
            default:  
                type=-1;  
            break;  
            }  
        }  
            word[i++]='';                      //word字符数组变字符串
    }
  • 相关阅读:
    题解【JOI 2020/2021 二次予選】B
    求导公式
    题解【洛谷P6875】[COCI2013-2014#6] KRUŽNICE
    二项式反演小记
    Matrix-Tree 定理小记
    2020ICPC南京D. Degree of Spanning Tree
    Codeforces Round #712 (Div. 1) C. Travelling Salesman Problem
    2021湖南多校对抗赛第四场 I
    2021湖南多校对抗赛第二场 C
    2021湖南多校对抗赛第二场 B
  • 原文地址:https://www.cnblogs.com/Ming-jay/p/5936830.html
Copyright © 2011-2022 走看看