首页 > 代码库 > 0929作业

0929作业

1词法分析器的功能 1)输入源程序 2)从左至右地对源程序进行扫描,按照语言的词法规则识别各类单词,并产生相应单词的属性字

2.

单词符号

种别码

单词符号

种别码

begin

1

:

17

if

2

:=

18

then

3

<

20

while

4

<=

21

do

5

<>

22

end

6

>

23

l(l|d)*

10

>=

24

dd*

11

=

25

+

13

;

26

-

14

(

27

*

15

)

28

/

16

#

0

3.用文法描述词法规则

<字母> A a|b|c|……y|z

<数字> 
A→1|2|3|4|5|6|7|8|9
S→A|SA|SA0 
<整数常数>
A→1|2|3|4|5|6|7|8|9
S→A|SA|SA0 
<标识符>
A→a|b|c|……y|z
B→0|1|2|3|4|5|6|7|8|9
S→A|SB
<关键字>
S→if|else|while|do|for|int|char|……
<运算符>
S→+|-|x|/|=|#|<|>|<=|>=|:=
<界符>
S→(|)|,|;|.

 

#include <stdio.h>  #include <string.h>    char prog[80],token[8],ch;  int syn,p,m,n,sum;  char *rwtab[6]={"begin","if","then","while","do","end"};     void scaner(void);    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 string\n");                      //getch();                      return 0;                  break;                                    default:                   printf("( %-10s%5d )\n",token,syn);                  break;              }          }while(syn!=0);      //getch();      return 0; }    void scaner(void)  {        sum=0;            for(m=0;m<8;m++)          token[m++]= NULL;                ch=prog[p++];          m=0;                while((ch== )||(ch==\n))          ch=prog[p++];            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;            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 !:              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;  }

 

0929作业