实验四 递归下降语法分析程序设计

    实验内容:

  •  对于给定的文法G[E] :

E→E+T|E-T|T
T→T*F| T/F|F
F→(E)|i

  •  消除左递归后的文法是:

E→TE'

E'→+TE'|-TE'|∑

T→FT'

T'→*FT'|/FT'|

F→(E)|i

  • 是否是LL(1)文法?
  • select(E→TE')=first(TE')={(,i}
  • select(E'→+TE')=first(+TE')={+}
  • select(E'-TE')=first(-TE')={-}
  • select(E'∑)=follow(E')={),#}
  • select(T→FT')=first(FT')={(,i}
  • select(T'→*FT')=first(*FT')={*}
  • select(T'/FT')=first(/FT')={/}
  • select(T'∑)=follow(T')={+,-,),#)
  • select(F→(E))=first((E))={(}
  • select(F→i)=first(i)={i}

经过对该文法求select集,得知该文法是LL(1)文法

由于之前实验的识别单词的函数scaner()做得不符合此次实验的需求,所以这次做scaner()函数做得有点仓促,并且还有点问题,可是分析表达式大概的函数调用基本都做好了。

希望可以做好scaner()函数。以下是本人这次实验的程序代码:

 

  1 #include<stdio.h>
  2 #include<string.h>
  3 char prog[800],token[20];
  4 char ch;
  5 int sym,syn,p,m,n,sum;
  6 char *rwtab[6]={"begin","if","then","while","do","end"};
  7 void E();
  8 void Ee();
  9 void T();
 10 void Tt();
 11 void F();
 12 void scaner();
 13 void main()
 14 {
 15     p=0;
 16     printf("请输入一个表达式'#'结束:\n");
 17     do
 18     {
 19         ch=getchar();
 20         prog[p++]=ch;
 21     }while(ch!='#');
 22     p=0;
 23     scaner();
 24     E();
 25     if(sym=='#')
 26         printf("这是一个正确的表达式!\n");
 27     else
 28         printf("这是一个错误的表达式!\n");
 29 
 30 
 31 }
 32 void E()
 33 {
 34     T();
 35     Ee();
 36 
 37 }
 38 void Ee()
 39 {
 40     if(sym=='+')
 41     {
 42         scaner();
 43         T();
 44         Ee();
 45     }
 46     else if(sym=='-')
 47     {
 48         scaner();
 49         T();
 50         E();
 51     }
 52     else if(sym!=')')
 53         printf("缺少右括号!\n");
 54 
 55 
 56 }
 57 void T()
 58 {
 59     F();
 60     Tt();
 61 
 62 }
 63 void Tt()
 64 {
 65     if(sym=='*')
 66     {
 67         scaner();
 68         F();
 69         Tt();
 70     }
 71     else if(sym=='/')
 72     {
 73         scaner();
 74         F();
 75         Tt();
 76     }
 77     else 
 78         if(sym=='+'||sym=='-'||sym==')')
 79             return;
 80         else
 81             printf("缺少右括号!\n");
 82 
 83 }
 84 void F()
 85 {
 86     if(sym=='(')
 87     {
 88         E();
 89         scaner();
 90         if(sym==')')
 91             scaner();
 92     }
 93     else if(sym=='i')
 94         scaner();
 95 
 96 }
 97 void scaner()
 98 {
 99 
100  sum=0;   
101  for(m=0;m<8;m++)token[m++]=NULL;    
102  ch=prog[p++];   
103  m=0;      
104  while((ch==' ')||(ch=='\n'))
105      ch=prog[p++];//去掉空格和换行   
106  if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))//识别标识符     
107  {    
108      while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
109      {    
110          token[m++]=ch;        
111          ch=prog[p++];        
112      }
113      p--;   
114      syn=10;
115      for(n=0;n<6;n++)     
116          if(strcmp(token,rwtab[n])==0)         
117          {   
118              syn=n+1;     
119              break;            
120          }
121  }
122  else if((ch>='0')&&(ch<='9'))    
123  {  
124      while((ch>='0')&&(ch<='9'))        
125      { 
126          syn=11;    
127          sum=sum*10+ch-'0';     
128          token[m++]=ch;ch=prog[p++]; 
129              
130      } 
131      p--;
132 
133 
134  }
135 
136 
137 
138 
139 
140 
141 }

 

posted @ 2015-12-31 16:00  57容杰龙  阅读(450)  评论(0编辑  收藏  举报