• 一个词法分析器


    正在学习编译原理,试着写了一个词法分析器

    代码
      1 #include<iostream>
      2 #include<string>
      3 #include <ctype.h>
      4 using namespace std;
      5 void scaner();      //扫描子程序
      6 char getch();       //读入字符函数
      7 char check();       //检查读入字符是否为空格或注释
      8 int synvalue(int n);//求关键字种别码函数
      9 char prog[80],token[8];
     10 char ch;
     11 int syn,p=0,m,n,sum;//p是缓冲区prog指针,m是token指针
     12 char *rwtab[6]={"begin","if","then","while","do","end"};
     13 int main()
     14 {
     15     p=0;
     16     cout<<"please input string:\n";
     17     do
     18     {
     19         ch=cin.get();
     20         prog[p++]=ch;
     21     }while(ch!='#');
     22     p=0;
     23     do
     24     {
     25         scaner();
     26         switch(syn)
     27         {
     28         case 11:cout<<"("<<syn<<","<<sum<<")"<<endl;
     29             break;
     30         case -1:cout<<"have error."<<endl;
     31             break;
     32         case 10:cout<<"("<<syn<<","<<"'"<<token<<"'"<<")"<<endl;
     33             break;
     34         default:cout<<"("<<syn<<","<<token<<")"<<endl;
     35         }
     36     }while(syn!=0);
     37     return 0;
     38 }
     39 void scaner()
     40 {
     41     for(n=0;n<8;n++)
     42         token[n]=NULL;
     43     ch=getch();//读入下一个字符
     44     check();//检查读入字符是否是空格或注释
     45     m=0;
     46     if(isalpha(ch))
     47     {
     48         while(isalpha(ch)||isdigit(ch))
     49         {
     50             token[m++]=ch;
     51             ch=getch();
     52         }
     53         token[m++]='\0';
     54         p--;//回退一个字符
     55         syn=10;
     56         for(n=0;n<6;n++)
     57         {
     58             if(strcmp(token,rwtab[n])==0)
     59             {
     60                 syn=synvalue(n);//返回种别码syn
     61                 break;
     62             }
     63         }
     64     }
     65     else
     66         if(isdigit(ch))
     67         {sum=0;
     68             while(isdigit(ch))
     69             {
     70                 
     71                 sum=sum*10+ch-'0';
     72                 ch=getch();
     73             }
     74             p--;
     75             syn=11;
     76         }
     77     else
     78     switch(ch)
     79     {
     80       case'<': m=0;
     81                token[m++]=ch;
     82                ch=getch();
     83                if(ch=='>')
     84                {
     85                   syn=21;
     86                   token[m++]=ch;
     87                }
     88                else if(ch=='=')
     89                {
     90                   syn=22;
     91                   token[m++]=ch;
     92                }
     93                else 
     94                {
     95                   syn=20;
     96                  p--;
     97                }
     98                break;
     99       case'>':token[m++]=ch;
    100              ch=getch();
    101              if(ch=='=')
    102              {
    103                  syn=24;
    104                 token[m++]=ch; 
    105              }
    106              else
    107              {
    108                  syn=23;
    109                  p--;
    110              }
    111              break;
    112       case':':token[m++]=ch;
    113               ch=getch();
    114               if(ch=='=')
    115               {
    116                   syn=18;
    117                 token[m++]=ch; 
    118               }
    119               else
    120               {
    121                   syn=17;
    122                  p--;
    123               }
    124               break;
    125       case'+':syn=13;token[0]=ch;break;
    126       case'-':syn=14;token[0]=ch;break;
    127       case'*':syn=15;token[0]=ch;break;
    128       case'/':syn=16;token[0]=ch;break;
    129       case'=':syn=25;token[0]=ch;break;
    130       case';':syn=26;token[0]=ch;break;
    131       case'(':syn=27;token[0]=ch;break;
    132       case')':syn=28;token[0]=ch;break;
    133       case'#':syn=0;token[0]=ch;break;
    134       default:syn=-1;
    135           
    136    }
    137 }
    138 
    139 char getch()
    140 {
    141     return prog[p++];
    142 }
    143 int synvalue(int n)
    144 {
    145     return n+1;
    146 }
    147 char check()
    148 {
    149     if(ch==' ')
    150     {
    151         do
    152         {
    153             ch=getch();
    154         }while(ch==' ');
    155     return ch;
    156     }
    157     else if(ch == '/')
    158     {
    159         ch=getch();
    160         if(ch=='*')
    161         {
    162             do
    163             {
    164                 ch=getch();
    165                 while(ch!='*')
    166                     ch=getch();
    167                 ch=getch();
    168                 while(ch=='*')
    169                     ch=getch();
    170             }while(ch!='/');
    171             ch=getch();
    172             return ch;    
    173         }
    174         else
    175         {
    176            p--;
    177            ch='/';
    178            return ch;
    179         }
    180     }
    181     else
    182         return ch;
    183 
    184 }
  • 相关阅读:
    Redis分布式锁实现
    mysql索引命中规则
    spring注解原理
    img 标签访问图片返回403forbidden
    根据注解修改属性的值
    通过反射改变对象的属性
    利用反射获取类或者方法或者字段上的注解的值
    什么时候出现死锁,如何解决?mysql 引擎? 多个like or 查询sql如何优化?什么是常量池?for条件执行顺序
    jvm 基础
    为什么要用jvm .
  • 原文地址:https://www.cnblogs.com/scar/p/1719836.html
Copyright © 2020-2023  润新知