• 词法分析程序


        这次的实验是编制一个词法分析程序,要求,输入:源程序的字符串,输出:二元组(种别,单词符号本身)。只要根据字符串的不同性质分组,代入到不同的种别码,然后可以输出了

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    char sum[100],ch,token[100];
    int a=0,zbm,n,i;
    char *keyword[18]={"begin","and","const","long","float","double","void","main","if","else","then","break","int","char","include","for","while","printf"};
    void scaner();
    
    
    void main()
    {
        printf("请输入一段你想测试的单词符号, 以‘#’号作为结束符号 !\n");
        do
        {
            ch=getchar();//输入字符
            sum[a++]=ch;//把字符存到数组里
        }while(ch!='#');//以#为循环条件
        a=0;
        
        do
        {
            scaner();
            printf("<%d,%s>\n",zbm,token);
          
        }while(zbm!=0);
    
        printf("感谢使用该系统\n");
        
        getchar();
        
    }
    void scaner()
    {
        
        
        for(n=0;n<100;n++)
        {token[n]='\0';}
        n=0;
        ch=sum[a++];//全局变量p=0
        while(ch==' '){ch=sum[a++];}//有空格就继续(判断标识符前是否存在空格)
        
        if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
        {
            do{
                token[n++]=ch;
                ch=sum[a++];
            }while((ch>='a'&&ch<='z')||(ch>='a'&&ch<='z')||(ch>='0'&&ch<='9'));
            zbm=21;
            
            for(n=0;n<18;n++)
            {
                if(strcmp(token,keyword[n])==0)//判断英文是否和关键字完全一样
            {
                zbm=n+1;
                
            }
            }
            a--;
        
        }
        else if(ch>='0'&&ch<='9')
        {
            a--;
            do
            {
                token[n++]=sum[a++];
                ch=sum[a];
            }while(ch>='0'&&ch<='9');
            zbm=22;
            
            
            return;
        }
        else
        {
            
        
            switch(ch)
            {
            case '+':zbm=24;token[0]=ch;break;
            case '-':zbm=25;token[0]=ch;break;
            case '*':zbm=26;token[0]=ch;break;
            case '/':zbm=27;token[0]=ch;break;
            case ':':zbm=28;token[0]=ch;
                ch=sum[a++];
                if(ch=='='){token[1]=ch;zbm++;}
                else a--;
                break;
            case '<':zbm=30;token[0]=ch;
                ch=sum[a++];
                if(ch=='='){token[1]=ch;zbm++;}
                else if(ch=='>'){token[1]=ch;zbm=zbm+2;}
                else a--;
                break;
            case '>':zbm=33;token[0]=ch;
                ch=sum[a++];
                if(ch=='='){token[1]=ch;zbm++;}
                else a--;
                break;
            case '=':zbm=35;token[0]=ch;break;
            case ';':zbm=36;token[0]=ch;break;
            case '(':zbm=37;token[0]=ch;break;
            case ')':zbm=38;token[0]=ch;break;
            case '{':zbm=39;token[0]=ch;break;
            case '}':zbm=40;token[0]=ch;break;
            case '!':zbm=41;token[0]=ch;break;
            case '@':zbm=42;token[0]=ch;break;
            case '$':zbm=43;token[0]=ch;break;
            case '%':zbm=44;token[0]=ch;break;
            case '^':zbm=45;token[0]=ch;break;
            case '&':zbm=46;token[0]=ch;break;
            case '#':zbm=0;token[0]=ch;break;
                
            default: printf("词法分析出错! 请检查是否输入非法字符\n");zbm=-1;break;
                
            }
            
    
        }
        
    }

    以下为源代码编译结果

    以下为我编写的种别码

  • 相关阅读:
    15、线程
    17、lambda表达式
    16、sockect
    14、反射(reflect)
    13、集合2
    java 基本类型、包装类、字符串之间的转换
    13、集合1
    12、NIO、AIO、BIO二
    12、NIO、AIO、BIO一
    11、流与文件
  • 原文地址:https://www.cnblogs.com/yjwamao/p/5926303.html
Copyright © 2020-2023  润新知