zoukankan      html  css  js  c++  java
  • 0916 编程实验一 词法分析程序

    源程序:

      1 #include<stdio.h>
      2 #include<string.h>
      3 void Fenxi(char c,char b);
      4 void word(char a[]);
      5 void number(char a[]);
      6 int i; 
      7 int s=1; //用来记录是否存在非法字符
      8 main(){
      9 char a[50];
     10 printf("请输入源程序:");
     11 gets(a);
     12 printf("您要分析的源程序为:");
     13 printf("%s",a);
     14 printf("
    ");
     15 for(i=0;(a[i]!='')&&(i<50)&&s==1;i++)
     16 {
     17 if((a[i]>='a' && a[i]<='z')||(a[i]>='A' && a[i]<='Z'))
     18 word(a);
     19 else if(a[i]>='0' && a[i]<='9')
     20 number(a);
     21 else
     22 Fenxi(a[i],a[i+1]);
     23 }
     24 printf("
    ");
     25 }
     26 
     27 void number(char a[]) //对数字字符进行扫描分析
     28 {
     29 char b[50];
     30 int m,k=0,t;
     31 m=i;
     32 while(a[m]>='0' && a[m]<='9') 
     33 {
     34 b[k]=a[m]; //用数组b存放数组a中的数字
     35 k++;
     36 m++;
     37 }
     38 i=m-1;
     39 printf("(11,");
     40 for(t=0;t<k;t++)
     41 printf("%c",b[t]);
     42 printf(")");
     43 }
     44 
     45 void word(char a[]) //对字母字符进行扫描分析,并识别保留字
     46 {
     47 int k=0,m,flag=0,t;
     48 char b[50];
     49 char *key[6]={"begin","if","then","while","do","end"};
     50 m=i;
     51 while((a[m]>='a'&&a[m]<='z')||(a[m]>='A'&&a[m]<='Z')) //用数组b存放数组a中的字母
     52 {
     53 b[k]=a[m]; 
     54 k++;
     55 b[k]='';
     56 m++; 
     57 }
     58 i=m-1;
     59 for(t=0;t<6;t++)
     60 {
     61 if(strcmp(b,key[t])==0) //将数组b与关键字进行比较
     62 {
     63 printf("(%d,%s)",t+1,key[t]); //输出关键字
     64 flag=1;
     65 }
     66 }
     67 if(flag==0)
     68 {
     69 printf("(10,%s)",b); //输出标识符
     70 }
     71 }
     72 void Fenxi(char c,char b) //对特殊字符进行扫描分析
     73 {
     74 switch(c){
     75 case ' ':
     76 break;
     77 case '+':
     78 printf("(13,+)");
     79 break;
     80 case '-':
     81 printf("(14,-)");
     82 break;
     83 case '*':
     84 printf("(15,*)");
     85 break;
     86 case '/':
     87 printf("(16,/)");
     88 break;
     89 case ':':
     90 if(b=='=')
     91 {
     92 i++;
     93 printf("(18,:=)");
     94 }
     95 else
     96 printf("(17,:)");
     97 break;
     98 case '<':
     99 if(b=='>')
    100 {
    101 i++;
    102 printf("(21,<>)");
    103 }
    104 else if(b=='=')
    105 {
    106 i++;
    107 printf("(22,<=)");
    108 }
    109 else
    110 printf("(20,<)");
    111 break;
    112 case '>':
    113 if(b=='=')
    114 {
    115 printf("(24,>=)");
    116 i++;
    117 }
    118 else
    119 printf("(23,>)");
    120 break;
    121 case '=':
    122 printf("(25,=)");
    123 break;
    124 case ';':
    125 printf("(26,;)");
    126 break;
    127 case '(':
    128 printf("(27,()");
    129 break;
    130 case ')':
    131 printf("(28,))");
    132 break;
    133 case '#':
    134 printf("(20,#)");
    135 break;
    136 default:
    137 {
    138 printf("
    存在字符 '%c',无法继续识别!
    ",c);
    139 s=0; //用s=0记录存在非法字符
    140 break;
    141 }
    142 }
    143 }

    运行结果:

     

  • 相关阅读:
    POJ 3630 Phone List | Trie 树
    POJ 3974 Palindrome | 马拉车模板
    POJ 3422 Kaka's Matrix Travels | 最小费用最大流
    POJ 2195 Going Home | 带权二分图匹配
    POJ 3068 "Shortest" pair of paths | 最小费用最大流
    POJ 3686 The Windy's | 最小费用最大流
    洛谷 最小费用最大流 模板 P3381
    POJ 2987 Firing | 最大权闭合团
    POJ 3469 Dual Core CPU | 最小割
    POJ 3281 Dining | 最大流
  • 原文地址:https://www.cnblogs.com/gjpg/p/4813987.html
Copyright © 2011-2022 走看看