我是靠谱客的博主 专注鸡,最近开发中收集的这篇文章主要介绍编译原理,递归下降分析器分析结果描述程序实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

递归下降分析器

  • 分析结果
  • 描述
  • 程序实现

分析结果

在这里插入图片描述

不合法语义

在这里插入图片描述

描述

含有左递归的表达式文法

E → E + T ∣ T E rightarrow E+T | T EE+TT
T → T ∗ F ∣ F Trightarrow T * F | F TTFF
F → ( E ) ∣ i F rightarrow(E) | i F(E)i

消除左递归后

E → T E ′ E rightarrow TE' ETE
E ′ → + T E ′ ∣ ε E'rightarrow +TE' | varepsilon E+TEε
T → F T ′ T rightarrow FT' TFT
T ′ → ∗ F T ′ ∣ ε T' rightarrow *FT' | varepsilon TFTε
F → ( E ) ∣ i F rightarrow(E) | i F(E)i

程序实现

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <unordered_map>

using namespace std;

string	str;				// 输入表达式
int		start = 0;			// 待读取表达式位置
int		idx = 0;			// 序号
vector<string> st;			// 符号栈

void E();
void E1();
void F();
void T();
void T1();

void input() {
	cout << "输入表达式 -> ";
	getline(cin, str);
	//str = "i*(i+i)";
	cout << endl;
}

void print() {
	cout << "t " << idx << "t ";
	string t("");
	for (auto& e : st) t += e;
	printf("%-10st", t.c_str());
	cout << str.substr(start) << "tt ";
}


void check() {
	printf("t 序号t 符号栈 t 待分析字符串 t 表达式 n");
	
	st.push_back("#");
	st.push_back("E");
	print();
	idx++;
	cout << endl;

	E();

	if (st.back() != "#") cout << "语义不合法" << endl;
	else cout << "语义合法 " << endl;
}

void E() {
	print();					//打印当前步骤信息
	printf("E->TE'n");			
	st.pop_back();
	st.push_back("E`");
	st.push_back("T");
	idx++;					
	T();
	E1();
}

void E1() {
	if (str[start] == '+') {
		print();
		printf("E'->+TE'n");			//输出表达式
		st.pop_back();			
		st.push_back("E`");				
		st.push_back("T");		
		idx++;							
		start++;						
		T();
		E1();
	}
	else {
		print();						
		printf("E'->εn");				
		st.pop_back();
		idx++;
	}
}

void F() {
	if (str[start] == 'i'){				//若待分析字符匹配‘i’
		print();						
		printf("F->in");				
		st.pop_back();
		idx++;							
		start++;						
	}
	else if (str[start] == '('){		//若待分析字符匹配‘(’
		print();						
		printf("F->(E)n");				
		st.pop_back();
		st.push_back("E");
		idx++;							
		start++;						
		E();
		if (str[start] == ')'){			//若待分析字符匹配‘)’
			start++;					
		}
		else{
			printf("没有')'匹配!n");
			return;
		}
	}
	else{
		printf("errorn");
		return;
	}
}

void T() {
	print();					//打印当前步骤信息
	printf("T->FT'n");			//输出表达式
	st.pop_back();
	st.push_back("T`");
	st.push_back("F");
	idx++;						//分析步数+1
	F();
	T1();
}

void T1(){
	if (str[start] == '*'){		//若待分析字符匹配‘*’
		print();						
		printf("T'->*FT'n");			
		st.pop_back();
		st.push_back("T`");
		st.push_back("F");
		idx++;							
		start++;						
		F();
		T1();
	}
	else{
		print();						
		printf("T'->εn");				
		st.pop_back();
		idx++;							
	}
}






最后

以上就是专注鸡为你收集整理的编译原理,递归下降分析器分析结果描述程序实现的全部内容,希望文章能够帮你解决编译原理,递归下降分析器分析结果描述程序实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部