编译原理实验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();v
#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();
			getcha();
		}
		retract();
		syn=11;
	}
	else
		switch(ch)
	{
		case'+': syn=13;token[0]=ch;break;
	    case'-': syn=14;token[0]=ch;break;
        case'*': syn=15;token[0]=ch;break;
		case'/': syn=16;token[0]=ch;break;
		case'<':
			token[0]=ch;
			getcha();
			if(ch=='=') {syn=22;token[1]=ch;}
			else if(ch=='>') {syn=21;token[1]=ch;}
			else
			{retract();
			syn=20;}
			break;
		case'>':
			token[0]=ch;
			getcha();
			if(ch=='=') {syn=24;token[1]=ch;}
			else
			{retract();
			syn=23;}
			break;
		case'=': syn=25;token[0]=ch;break;
		case':':
			token[0]=ch;
			getcha();
			if(ch=='=') {syn=18;token[1]=ch;}
			else
			{retract();
			syn=17;}
			break;
		case';': syn=26;token[0]=ch;break;
		case'(': syn=27;token[0]=ch;break;
		case')': syn=28;token[0]=ch;break;
		case'#': syn=0;token[0]=ch;break;
		default: syn=-1;break;
	}
}

int main()
{
  p=0;
  printf("please input string: \n");
  char c;
  while(1)
  {c=getchar();
   if(c=='\n') break;
   prog[p++]=c;
  }
  p=0;
	  scanner();
   if(syn==1)
              {Irparse();}//begin
       else
              {printf("语法分析出错! 请检查begin关键字\n");return 0;}
    if(syn==6)//end
              {
                     scanner();
                     if(syn==0)
                     {
                            printf("success!\n");
                     }
                     else
                     {printf("语法分析出错! 请检查是否缺少'#'\n");}
              }
       else{printf("语法分析出错! 请检查是否缺少'end'\n");}
    return 0;
}

目录
相关文章
|
7月前
|
算法
2017级《算法设计与分析》--实验1--分治算法-骨牌铺方格
2017级《算法设计与分析》--实验1--分治算法-骨牌铺方格
|
7月前
|
算法
2017级《算法设计与分析》--实验1--分治算法
2017级《算法设计与分析》--实验1--分治算法
|
6月前
|
算法 C++
算法与数据结构高手养成:朴素的贪心法(上)最优化策略
算法与数据结构高手养成:朴素的贪心法(上)最优化策略
43 1
算法与数据结构高手养成:朴素的贪心法(上)最优化策略
|
6月前
|
算法 C++
计算机算法设计与分析 第2章 递归与分治策略 (笔记)
计算机算法设计与分析 第2章 递归与分治策略 (笔记)
|
7月前
|
存储 算法 Java
【算法设计与分析】— —实现最优载的贪心算法
【算法设计与分析】— —实现最优载的贪心算法
|
7月前
|
设计模式 算法 知识图谱
算法设计与分析(贪心法)
【1月更文挑战第1天】在分析问题是否具有最优子结构性质时,通常先设出问题的最优解,给出子问题的解一定是最优的结论。证明思路是:设原问题的最优解导出子问题的解不是最优的,然后在这个假设下可以构造出比原问题的最优解更好的解,从而导致矛盾。(一个问题能够分解成各个子问题来解决,通过各个子问题的最优解能递推到原问题的最优解,此时原问题的最优解一定包含各个子问题的最优解,这是能够采用贪心法来求解问题的关键)贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择获得,即通过一系列的逐步局部最优选择使得最终的选择方案是全局最优的。
125 1
|
7月前
|
算法 NoSQL 容器
1.贪心理论与常见的证明方法
1.贪心理论与常见的证明方法
|
算法 索引 Python
从一道简单算法题里面解释什么叫做 O(1)
从一道简单算法题里面解释什么叫做 O(1)
123 0
|
算法
算法设计与分析/数据结构与算法实验4:添加括号数目问题
算法设计与分析/数据结构与算法实验4:添加括号数目问题
189 0
算法设计与分析/数据结构与算法实验4:添加括号数目问题
|
算法
算法设计与分析/数据结构与算法实验3:矩阵连乘问题
算法设计与分析/数据结构与算法实验3:矩阵连乘问题
196 0
算法设计与分析/数据结构与算法实验3:矩阵连乘问题