• 词法分析修改版


    #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;
                }
        }
    }


    
    
  • 相关阅读:
    【Lintcode】112.Remove Duplicates from Sorted List
    【Lintcode】087.Remove Node in Binary Search Tree
    【Lintcode】011.Search Range in Binary Search Tree
    【Lintcode】095.Validate Binary Search Tree
    【Lintcode】069.Binary Tree Level Order Traversal
    【Lintcode】088.Lowest Common Ancestor
    【Lintcode】094.Binary Tree Maximum Path Sum
    【算法总结】二叉树
    库(静态库和动态库)
    从尾到头打印链表
  • 原文地址:https://www.cnblogs.com/Ranjer/p/4877905.html
Copyright © 2020-2023  润新知