zoukankan      html  css  js  c++  java
  • 一个词法分析器

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

    代码
      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 }
  • 相关阅读:
    1063. Set Similarity
    A1047. Student List for Course
    A1039. Course List for Student
    最大公约数、素数、分数运算、超长整数计算总结
    A1024. Palindromic Number
    A1023. Have Fun with Numbers
    A1059. Prime Factors
    A1096. Consecutive Factors
    A1078. Hashing
    A1015. Reversible Primes
  • 原文地址:https://www.cnblogs.com/scar/p/1719836.html
Copyright © 2011-2022 走看看