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


        实验内容:

    •  对于给定的文法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("请输入一个表达式'#'结束:
    ");
     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("这是一个正确的表达式!
    ");
     27     else
     28         printf("这是一个错误的表达式!
    ");
     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("缺少右括号!
    ");
     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("缺少右括号!
    ");
     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=='
    '))
    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 }
  • 相关阅读:
    00037_this关键字
    一些Perl例程(全部手打并执行过)
    告别码农生涯
    转载:直面人生的大实话
    iOS sqlite C语言操作
    linux C++ 莫名奇异的段错误(segmentation fault),无法调用其他函数
    iWatch应用开发-oc篇
    Android中的音频处理------SoundPool,MediaRecorder,MediaPlayer以及RingStone总结
    (二)用控制器controller给模型数据赋初始值
    PhoneGap开发的android项目环境搭建简单流程
  • 原文地址:https://www.cnblogs.com/57rongjielong/p/5090120.html
Copyright © 2020-2023  润新知