• 编译原理第二次试验


    #include<stdio.h> #include<string.h> void Fenxi(char c,char b); void word(char a[]); void number(char a[]); int i; int s=1; main(){     char a[100];     printf("请输入源程序:");     gets(a);     printf("%s",a);     printf(" ");     for(i=0;(a[i]!='')&&(i<100)&&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)         {             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;             }     } }

  • 相关阅读:
    C#扩展方法学习
    如何用PS快速做出3D按钮效果的图片
    比较C#中几种常见的复制字节数组方法的效率[转]
    GUID的学习
    委托与事件的区别
    利用Marshal.AllocHGlobal申请非托管内存,unsafe代码
    JAVASE(十三) 异常处理
    JAVASE(十二) Java常用类: 包装类、String类、StringBuffer类、时间日期API、其他类
    JAVASE(十一) 高级类特性: abstract 、模板模式、interface、内部类、枚举、注解
    面试题: SpringBoot 的自启动原理
  • 原文地址:https://www.cnblogs.com/7763255qw/p/4826977.html
Copyright © 2020-2023  润新知