• 0916 编译原理第二次上机作业


    #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(")");
    }
    
    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++;
            b[k]='';
            m++;                                                                                                                     
        }
        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;
            }
        }
        if(flag==0)
        {
            printf("(10,%s)",b);   //输出标识符
        }
    }
    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("(20,#)");
                break;
            default:
                {
                printf("
    存在字符 '%c',无法继续识别!
    ",c);
                s=0;    //用s=0记录存在非法字符
                break;
                }
        }
    }
  • 相关阅读:
    asp.net 用户页面权限判断
    asp.net Forms表单验证授权
    asp.net 数据绑定
    asp.net 初识
    .net 中ashx文件的应用理解
    记录第一次给linux配置网络,在虚拟机中连接真实网络
    linux 常用命令
    oracle 建分区表,时间自增
    python(9)- python基础知识刷题
    孤荷凌寒自学python第123天区块链037以太坊的 erc20代币07
  • 原文地址:https://www.cnblogs.com/yanwensheng/p/4825806.html
Copyright © 2020-2023  润新知