编译原理词法分析

来源:互联网 发布:ai软件下载中文版 编辑:程序博客网 时间:2024/05/17 23:11

识别码

 

单词符号

种别码 

单词符号

种别码

bgin

1

17

If

2

=

18

Then

3

<

20

wile

4

<>

21

do

5

<=

22

end

6

>

23

lettetletter|digit*

10

>=

24

dight dight*

11

=

25

+

13

26

14

(

27

*

15

)

28

/

16

#

0

 

 

#include <stdio.h>
#include<string.h>
#include<stdlib.h>
char prog[80],token[8],ch;
int syn,p,m,n,sum;
char *rwtab[6]={"begin","if","then","while","do","end"};
scaner();
int main()
{
    p=0;
    printf("\n please input a string(end with '#'):\n");
    do{
     
     scanf("%c",&ch);//是字符型而不是整型
     prog[p++]=ch;
    }while(ch!='#');
    p=0;
    do{
     scaner();
     switch(syn){
      case 11:
         printf("(%-10d %5d)\n",sum,syn);
         break;
      case -1:
         printf("you have input a wrong sentence!\n");
         getchar();
         exit(0);
      default:
         printf("(%-10s %5d)\n",token,syn);
         break;
     }
     }while(syn!=0);
     getchar();
     return 0;
}
   
    scaner()
    {
     sum=0;
     for(m=0;m<8;m++)
     token[m++]='\0';//将数组清空
     ch=prog[p++];
     m=0;
     while((ch==' '||ch=='\n'))
     ch=prog[p++];//ch将指向下一个元素
     
     
     if(((ch<='z')&&(ch>='a')||(ch<='Z')&&(ch>='A')))//这里只能判断第一个元素。
     {
      while(((ch<='z')&&(ch>='a')||(ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))//因此需要一个循环。
      {
          token[m++]=ch;
          ch=prog[p++];
      }
      p--;
      syn=10;//是字母但不是标示符中的符号时,识别码为10.
        for(n=0;n<6;n++)//标示符的识别码
        if(strcmp(token,rwtab[n])==0)
      {
      syn=n+1;
      break;
      }
     }
     
     
     else if((ch>='0')&&(ch<='9'))
     {
      while((ch>='0')&&(ch<='9'))
      {
       sum=sum*10+ch-'0';
       ch=prog[p++];
      }
      p--;
      syn=11;
     }
           else switch(ch)
            {
             case '<':
              token[m++]=ch;
              ch=prog[p++];//判断小于号的下一个元素,看是不是小于等于号。
              if(ch=='=')
              {
              syn=22;
              token[m++]=ch;
              }
              else
              {
               syn=20;
               p--;
              }
              break;
              case '>':
              token[m++]=ch;
              ch=prog[p++];
              if(ch=='=')
              {
               syn=24;
               token[m++]=ch;
               
              }
              else
              {
               syn=23;
               p--;
              }
              break;
              case '+':
              token[m++]=ch;
              ch=prog[p++];
              if(ch=='+')
              {
               syn=17;
               token[m++]=ch;
              }
              else
              {
               syn=13;
               p--;
              }
              break;
              case '-':
              token[m++]=ch;
              ch=prog[p++];
              if(ch=='-')
              {
               syn=29;
               token[m++]=ch;
              }
              else
              {
               syn=14;
               p--;
              }
              break;
              case'!':
              token[m++]=ch;
              ch=prog[p++];
              if(ch=='=')
              {
               syn=21;
               token[m++]=ch;
               
              }
              else
              {
               syn=31;
               p--;
              }
              break;
              case'=':
              token[m++]=ch;
              ch=prog[p++];
              if(ch=='=')
              {
               syn=25;
               token[m++]=ch;
              }
              else
              {
               syn=18;
               p--;
              }
              break;
              case'*':
              syn=15;
              token[m++]=ch;
              break;
              case'/':
              syn=16;
              token[m++]=ch;
              break;
              case'(':
              syn=27;
              token[m++]=ch;
              break;
              case')':
              syn=28;
              token[m++]=ch;
              break;
              case'{':
              syn=5;
              token[m++]=ch;
              break;
              case'}':
              syn=6;
              token[m++]=ch;
              break;
              case';':
              syn=26;
              token[m++]=ch;
              break;
              case'\"'://转义字符。。
              syn=30;
              token[m++]=ch;
              break;
              case'#':
              syn=0;
              token[m++]=ch;
              break;
              case':':
              syn=17;
              token[m++]=ch;
              break;
              default:
              syn=-1;
              break;
       
             }
      token[m++]='\0';
      }

原创粉丝点击