词法编译器

#include<stdio.h>                  /*定义I/O库所用的某些宏和变量*/
#include<string.h>               /*定义字符串库函数*/
#include<conio.h>                  /*提供有关屏幕窗口操作函数*/
#include<ctype.h>                  /*分类函数*/
char prog[80]={''},
     token[8];                     /*存放构成单词符号的字符串*/
char ch;
int syn,                           /*存放单词字符的种别码*/
      n,
    sum,                           /*存放整数型单词*/
    m,p;                           /*p是缓冲区prog的指针,m是token的指针*/
char *rwtab[6]={"begin","if","then","while","do","end"};
void scaner(){
    m=0;
    sum=0;
    for(n=0;n<8;n++)
        token[n]='';
    ch=prog[p++];
    while(ch==' ')
        ch=prog[p++];
    if(isalpha(ch))    /*ch为字母字符*/
 {
        while(isalpha(ch)||isdigit(ch))    /*ch 为字母字符或者数字字符*/
  {
           token[m++]=ch;
           ch=prog[p++];}
        token[m++]='';
        ch=prog[p--];
        syn=10;
        for(n=0;n<6;n++)
            if(strcmp(token,rwtab[n])==0)    /*字符串的比较*/
   {
                syn=n+1;
                break;}}
    else
        if(isdigit(ch))    /*ch是数字字符*/
  {
            while(isdigit(ch))    /*ch是数字字符*/
   {
                sum=sum*10+ch-'0';
                ch=prog[p++];}
            ch=prog[p--];
            syn=11;}
        else
            switch(ch)
  {
                case'<':m=0;token[m++]=ch;ch=prog[p++];
                        if(ch=='>'){
                            syn=21;
                            token[m++]=ch;}
                        else if(ch=='='){
                            syn=22;
                            token[m++]=ch;}
                            else{
                                 syn=20;
                                 ch=prog[p--];}
                        break;
                case'>':m=0;token[m++]=ch;ch=prog[p++];
                        if(ch=='='){
                            syn=24;
                            token[m++]=ch;}
                        else{
                            syn=23;
                            ch=prog[p--];}
                        break;
             case':':m=0;token[m++]=ch;ch=prog[p++];
                     if(ch=='='){
                         syn=18;
                         token[m++]=ch;}
                     else{
                         syn=17;
                         ch=prog[p--];}
                     break;
             case'+':syn=13;token[0]=ch;break;
             case'-':syn=14;token[0]=ch;break;
             case'*':syn=15;token[0]=ch;break;
             case'/':syn=16;token[0]=ch;break;
             case'=':syn=25;token[0]=ch;break;
             case';':syn=26;token[0]=ch;break;
             case'(':syn=27;token[0]=ch;break;
             case')':syn=28;token[0]=ch;break;
             case'#':syn=0;token[0]=ch;break;
             default:syn=-1;}}
main()
{

p=0;
    printf("please input string: ");
    do {
           ch=getchar();
           prog[p++]=ch;
       }while(ch!='#');
    
p=0;
    do{
        scaner();
        switch(syn){
            case 11: printf("(%d,%d) ",syn,sum);break;
          //  case -1: printf(" ERROR; ");break;
            default: printf("(%d,%s) ",syn,token);
}
}while(syn!=0);
    //getch();
}

原文地址:https://www.cnblogs.com/cch-1007/p/5924460.html