• 一个词法分析程序


      1 #include <stdio.h>
      2 #include <string.h>
      3 #include<conio.h>
      4 #include <process.h>
      5 char prog[80],token[8],ch;
      6 int syn,p,m,n,sum;
      7 char *rwtab[6]={"begin","if","then","while","do","end"};
      8  scaner();
      9 main()
     10 {p=0;
     11  printf("\n please input a string(end with '#'):/n");
     12  do{
     13     scanf("%c",&ch);
     14     prog[p++]=ch;
     15     }while(ch!='#');
     16  p=0;
     17  do{
     18     scaner();
     19     switch(syn)
     20      {case 11:printf("( %-10d%5d )\n",sum,syn);
     21           break;
     22       case -1:printf("you have input a wrong string\n");
     23           getch();
     24           exit(0);
     25       default: printf("( %-10s%5d )\n",token,syn);
     26           break;
     27       }
     28     }while(syn!=0);
     29     getch();
     30  }
     31 
     32  scaner()
     33  {  sum=0;
     34     for(m=0;m<8;m++)token[m++]=NULL;
     35     ch=prog[p++];
     36     m=0;
     37     while((ch==' ')||(ch=='\n'))ch=prog[p++];
     38     if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
     39       { while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
     40       {token[m++]=ch;
     41        ch=prog[p++];
     42       }
     43       p--;
     44       syn=10;
     45       for(n=0;n<6;n++)
     46     if(strcmp(token,rwtab[n])==0)
     47        { syn=n+1;
     48          break;
     49        }
     50       }
     51     else if((ch>='0')&&(ch<='9'))
     52       { while((ch>='0')&&(ch<='9'))
     53     { sum=sum*10+ch-'0';
     54       ch=prog[p++];
     55     }
     56     p--;
     57     syn=11;
     58       }
     59     else switch(ch)
     60     { case '<':token[m++]=ch;
     61           ch=prog[p++];
     62            if(ch=='=')
     63             {  syn=22;
     64                token[m++]=ch;
     65             }
     66           else
     67             {  syn=20;
     68                p--;
     69             }
     70           break;
     71      case '>':token[m++]=ch;
     72           ch=prog[p++];
     73           if(ch=='=')
     74             { syn=24;
     75               token[m++]=ch;
     76             }
     77           else
     78             { syn=23;
     79               p--;
     80             }
     81           break;
     82      case '+': token[m++]=ch;
     83           ch=prog[p++];
     84           if(ch=='+')
     85             { syn=17;
     86               token[m++]=ch;
     87             }
     88           else
     89             { syn=13;
     90               p--;
     91             }
     92           break;
     93 
     94      case '-':token[m++]=ch;
     95           ch=prog[p++];
     96           if(ch=='-')
     97             { syn=29;
     98               token[m++]=ch;
     99             }
    100           else
    101             { syn=14;
    102               p--;
    103             }
    104           break;
    105 
    106      case '!':ch=prog[p++];
    107           if(ch=='=')
    108            { syn=21;
    109              token[m++]=ch;
    110            }
    111           else
    112           { syn=31;
    113              p--;
    114           }
    115           break;
    116 
    117      case '=':token[m++]=ch;
    118           ch=prog[p++];
    119           if(ch=='=')
    120             { syn=25;
    121               token[m++]=ch;
    122             }
    123           else
    124             { syn=18;
    125               p--;
    126             }
    127           break;
    128      case '*': syn=15;
    129            token[m++]=ch;
    130            break;
    131      case '/': syn=16;
    132            token[m++]=ch;
    133            break;
    134      case '(': syn=27;
    135            token[m++]=ch;
    136            break;
    137      case ')': syn=28;
    138            token[m++]=ch;
    139            break;
    140      case '{': syn=5;
    141            token[m++]=ch;
    142            break;
    143      case '}': syn=6;
    144            token[m++]=ch;
    145            break;
    146      case ';': syn=26;
    147           token[m++]=ch;
    148           break;
    149      case '\"': syn=30;
    150            token[m++]=ch;
    151            break;
    152      case '#': syn=0;
    153            token[m++]=ch;
    154            break;
    155      case ':':syn=17;
    156            token[m++]=ch;
    157            break;
    158     default: syn=-1;
    159          break;
    160        }
    161     token[m++]='\0';
    162     }
  • 相关阅读:
    模板学习系列(一)tuple
    apue读书笔记第十章
    在亚马逊上关于设计模式的一个评论
    编程珠玑笔记第12章习题
    编程珠玑第14章
    C#,.Net经典面试题目及答案
    sql where 1=1和 0=1 的作用(junyuz)
    快速排序算法
    一道面试题(C#实现了超大整数的加减乘法运算)
    数据结构实验之链表一:顺序建立链表
  • 原文地址:https://www.cnblogs.com/cs007/p/5924994.html
Copyright © 2020-2023  润新知