⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 redown.cpp

📁 在编译原理词法实现中的一个递归下降分析程序,将无左递归的文法符号对应一个函数.
💻 CPP
字号:
#include<iostream.h>
#include<string.h>
#include<stdio.h>
#include<ctype.h>
#include<stack>
using namespace std;

class recurdown
{
public:
  recurdown()
  {    input();
	  init(); 
  }
  void input();
  void init();
  void E()
  {
	  T();E1();
  }
  void E1()
  {
	  AND();T();E1();
  }
  void T()
  {
	  F();T1();
  }
  void T1()
  {
	  MUL();F();T1();
  }
  void F();
  void AND();
  void MUL();
  void get_s();
  void error();
  int priority(char c);
  void output()
  { cout<<r[1];}
private:
  string s,r;
  stack<char> z;
  char sym;
  int n;
};

void recurdown::input()
{
	cout<<"input:"<<endl;
	char s[10];
	cin>>s;
}
void recurdown::init()
{
	while(!z.empty())
		z.pop();
	z.push('#');
	n=0;sym='#';s=r='\0';
}
void recurdown::AND()
{
	if(sym=='+')
		  { get_s();}
	else 
		if(sym=='-')
		{   get_s();}
	       else
			   error();
}

void recurdown::MUL()
{
     if(sym=='*')
	 {get_s();}
	else  if(sym=='/')
		          get_s();
	       else
			   error();
}

void recurdown::F()
{
  if(sym=='(')
  { 
	  get_s(); E();
	  if(sym==')')
		   get_s();
	  else  error();
  }
  else
	if(sym=='i')    
	   {r+=sym;	get_s();}
	else  error();
}

void recurdown::error()
{
  cout<<"Failed Recognization"<<endl;
  exit(1);
}

int recurdown::priority(char c)
{
  switch(c)
  {  
  case '#':return 0;
  case '+':
  case '-':return 1;
  case '*':
  case '/': return 2;
  case '(':
  case ')':return 3;
  }
}

void recurdown::get_s()
{ 
if(n<s.length())
{
	sym=s[n];
   if(sym!='i')
           if(priority(z.top())<priority(sym))
		   { z.push(sym);cout<<sym;}
           else
		   {r+=z.top();z.pop();}

	n++;
}

}


void main()
{
l:
	recurdown y;
	y.get_s();
	y.E();
	y.output();
	char c;
	cout<<"continue [Y/N]? "<<endl;
	cin>>c;
	if(c=='y') goto l;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -