当前位置:编程学习 > C/C++ >>

编译原理实验2-递归下降分析法

#include <stdio.h>  
#include <string.h>  
#include <stdlib.h>  
char prog[80],token[8];  
char ch;  
int syn=-1,p,t;  
  
void scanner();  
void statement();  
void expression_r();  
void term();  
void factor();  
void getcha()  
{  
    ch=prog[p++];  
}  
  
void getbc()  
{  
    while(prog[p]==' ')  
        p++;  
    getcha();  
}  
  
void concat()  
{  
    token[t++]=ch;  
}  
  
bool letter(char ch)  
{  
    if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))  
        return true;  
    return false;  
}  
  
bool digit(char ch)  
{  
    if(ch>='0'&&ch<='9')  
        return true;  
    return false;  
}  
  
int reserve()  
{  
    token[t++]='\0';  
    if(strcmp(token,"begin")==0) return 1;  
    if(strcmp(token,"end")==0) return 6;  
    if(strcmp(token,"if")==0) return 2;  
    if(strcmp(token,"then")==0) return 3;  
    if(strcmp(token,"else")==0) return 7;  
    if(strcmp(token,"while")==0) return 4;  
    if(strcmp(token,"do")==0) return 5;  
    return 10;  
}  
  
void retract()  
{  
    p--;  
}  
  
  
int dtb()  
{  
    token[t++]='\0';  
    int i=atoi(token);  
    return i;  
}  
  
void Irparse()  
{  
       scanner();  
       statement();  
       while(syn==26)//;  
              {  
                     scanner();  
                     statement();  
              }  
  
}  
void statement()  
{  
       if(syn==10)  
       {  
              scanner();  
              if(syn==18)  
              {  
                     scanner();  
                     expression_r();  
              }  
              else  
              {  
                     printf("语法分析出错! 请检查表达式是否含:=\n");return ;  
              }  
       }  
       else  
       {  
              //printf("语法分析出错!  请检查语句是否正确\n");return 0;  
       }  
}  
  
void expression_r()  
{  
       term();  
       while(syn==13||syn==14)//+ -  
       {  
              scanner();  
              term();  
       }  
}  
  
void term()  
{  
       factor();  
       while(syn==15||syn==16)//* /  
       {  
              scanner();  
              factor();  
       }  
}  
void factor()  
{  
       if(syn==10||syn==11)  
       {  
              scanner();  
       }  
       else if(syn==27)  
       {  
              scanner();  
              expression_r();  
              if(syn==28)  
              {  
                     scanner();  
              }  
              else {printf("语法分析出错! 请检查是否缺少')'\n");return;}  
       }  
       else {printf("语法分析出错! 请检查是否输入非法字符\n");return;}  
}  
  
  
void scanner()  
{  
    t=0;  
    //getcha();  
    getbc();  
    if(letter(ch))  
    {  
        while(letter(ch)||digit(ch))  
        {  
            concat();  
            getcha();  
        }  
        retract();  
        syn=reserve();  
        if(syn==10) syn=10;  
    }  
    else if(digit(ch))  
    {  
        while(digit(ch))  
        {  
            concat()
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,