zoukankan      html  css  js  c++  java
  • 词法分析修改版

    #include<stdio.h>
    #include<string.h>
    void Fenxi(char c,char b);
    void word(char a[]);
    void number(char a[]);
    int i;  //定义全局变量i
    int s=1; //用来记录是否存在非法字符
    main(){
        char a[50];
        printf("请输入源程序:");
        gets(a);
        printf("您要分析的源程序为:");
        printf("%s",a);
        printf("
    ");
        for(i=0;(a[i]!='')&&(i<50)&&s==1;i++)
        {
            if((a[i]>='a' && a[i]<='z')||(a[i]>='A' && a[i]<='Z'))
                word(a);
            else if(a[i]>='0' && a[i]<='9')
                number(a);
            else
                Fenxi(a[i],a[i+1]);
        }
        printf("
    ");
    }
    
    void number(char a[])  //对数字字符进行扫描分析
    {
        char b[50];
        int m,k=0,t;
        m=i;
        while(a[m]>='0' && a[m]<='9')  
        {
            b[k]=a[m];   //用数组b存放数组a中的数字
            k++;
            m++;
        }
        i=m-1;
        printf("(11,");
        for(t=0;t<k;t++)
                printf("%c",b[t]);
        printf(")");
        printf("
    ");
    }
    
    void word(char a[])   //对字母字符进行扫描分析,并识别保留字
    {
        int k=0,m,flag=0,t;
        char b[50];
        char *key[6]={"begin","if","then","while","do","end"};
        m=i;
        while((a[m]>='a'&&a[m]<='z')||(a[m]>='A'&&a[m]<='Z'))  //用数组b存放数组a中的字母
        {
            b[k]=a[m];   
            k++;
            m++;
            b[k]='';
    
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
        }
        i=m-1;
        for(t=0;t<6;t++)
        {
            if(strcmp(b,key[t])==0)  //将数组b与关键字进行比较
            {
                printf("(%d,%s)",t+1,key[t]);  //输出关键字
                flag=1;
                printf("
    ");
            }
        }
        if(flag==0)
        {
            printf("(10,%s)",b);   //输出标识符
            printf("
    ");
        }
    }
    void Fenxi(char c,char b)  //对特殊字符进行扫描分析
    {
        switch(c){
            case ' ':
                break;
            case '+':
                printf("(13,+)
    ");
                break;
            case '-':
                printf("(14,-)
    ");
                break;
            case '*':
                printf("(15,*)
    ");
                break;
            case '/':
                printf("(16,/)
    ");
                break;
            case ':':
                if(b=='=')
                {
                    i++;
                    printf("(18,:=)
    ");
                }
                else
                    printf("(17,:)
    ");
                break;
            case '<':
                if(b=='>')
                {
                    i++;
                    printf("(21,<>)
    ");
                }
                else if(b=='=')
                {
                    i++;
                    printf("(22,<=)
    ");
                }
                else
                    printf("(20,<)
    ");
                break;
            case '>':
                if(b=='=')
                {
                    printf("(24,>=)
    ");
                    i++;
                }
                else
                    printf("(23,>)
    ");
                break;
            case '=':
                printf("(25,=)
    ");
                break;
            case ';':
                printf("(26,;)
    ");
                break;
            case '(':
                printf("(27,()
    ");
                break;
            case ')':
                printf("(28,))
    ");
                break;
            case '#':
                printf("(0,#)
    ");
                break;
            default:
                {
                printf("
    存在字符 '%c',无法继续识别!
    ",c);
                s=0;    //用s=0记录存在非法字符
                break;
                }
        }
    }


    
    
  • 相关阅读:
    CSS margin合并
    最大网络流
    js——this
    js——作用域和闭包
    CSS弹性(flexible)盒子
    CSS盒子模型
    修改html中button显示的文字
    远程唤醒UP Board
    UP Board 串口使用心得
    UP Board 网络设置一本通
  • 原文地址:https://www.cnblogs.com/Ranjer/p/4877905.html
Copyright © 2011-2022 走看看