编译原理 实验2 自顶向下的语法分析程序

本文档详细介绍了LL(1)文法分析程序的设计与实现,包括读取文法文件、计算非终结符表、First集、Follow集、Select集、预测分析表以及分析句子的过程。程序能够识别给定文法的正确句子,并输出分析过程和结果。通过main.cpp文件,实现了文件读写、文法解析、分析表生成和分析串处理等功能,支持对多个文法产生式和句子的分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 运行结果

(1)测试文法一(输入文件产生式右部与句子全部以单个空格隔开,测试文法必须是LL(1)的):
E->T E’
E’->+ T E’
E’->#
T->F T’
T’->* F T’
T’->#
F->i
F->( E )
测试句子:i + i * i
测试结果如下图所示(由于图太大,分割成几部分展示)。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
(2)测试文法二:
E->T E’
E’->+ E
E’->#
T->F T’
T’->T
T’->#
F->P F’
F’->* F’
F’->#
P->( E )
P->a
P->b
P->^
测试句子:( a ^ b + a ) * b

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以下是分析过程与结果输出到文件的测试。经测试,程序运行的过程和结果(包含计算First集Follow集Select集、构造预测分析表分析表、分析过程等)能正常输出到文件里。
在这里插入图片描述

2 项目代码

只有一个文件main.cpp:

#include<cstdio>
#include<map>
#include<iostream>
#include<fstream>
#include<iomanip>
#include<vector>
#include<set>
#include<string>
using namespace std;
const int wordnumPerLine = 7;
bool writeFile = false;
FILE* grammerFile;
char fname[50],outfname[50],c,reply[50];
string analyzedString;

#define readLine if( fscanf(grammerFile,"%[^\n]%c",theLine,&c)==EOF)	return;
#pragma region 工具函数
inline bool isInVector(vector<string> vec,string val) {
   
	vector<string>::iterator iter = find(vec.begin(), vec.end(), val);
	if (iter == vec.end())
		return false;
	return true;
}
inline set<string> getNoneEmptySet(set<string> s) {
   //得到无空集
	set<string> ans = s;
	set<string>::iterator it = ans.find("#");
	if (it!= ans.end()) {
   
		ans.erase(it);
	}
	return ans;
}
inline bool isNoneTerminal(string x) {
   
	return x.length() > 0 && x[0] >= 'A'&&x[0] <= 'Z';
}
inline vector<string> splitString(string oriString, char splitChar = ' ') {
   
	vector<string> vec;
	oriString += ' ';
	int splitpos;
	while (splitpos = oriString.find(splitChar)!=string::npos) {
   
		vec.push_back(oriString.substr(0, splitpos));
		oriString = oriString.substr(splitpos+1);
	}
	return vec;
}
inline string vectorToString(vector<string> vec,bool reverse = false) {
   
	string ansStr = "";
	if (reverse) {
   
		for (int i = vec.size()-1; i >=0; i--) {
   
			ansStr += vec[i] + " ";
		}
	}
	else {
   
		for (int i = 0; i < vec.size(); i++) {
   
			ansStr += vec[i] + " ";
		}
	}
	return ansStr;
}
#pragma endregion

struct Production{
   
	string left;
	vector<string>right;
	bool isEmpty = false;
	string getRight() {
   
		string ans = "";
		for (int i = 0; i < right.size() - 1; i++)
			ans += right[i] + " ";
		if (!right.empty()) {
   
			ans += right.back();
		}
		return ans;
	}
	string getProduction() {
   
		return left + "->" + getRight();
	}
};

struct Grammer
{
   
	vector<Production> productions;//文法产生式
	vector<string> nonTerminal;//文法非终结符
	vector<string> terminal;//文法终结符
	map<string,set<string> > firstSet;//first集
	map<string,set<string> > followSet;//follow集
	vector<set<string> > select;//第i条产生式的select集
	map<string, bool> canReachEmpty;//非终结符表
	string startSymbol= "";//开始符号
	map<pair<string, string>, int> predictionMap;//非终结符A遇到终结符b时,使用第i条产生式
	friend ostream & operator <<(ostream & os, const Grammer & g);
}grammer;

struct Description
{
   
	string analyzeStr;
	string remainStr;
	string matchStr;
	Description() {
   }
	Description(string analyzeStr, string remainStr) {
   
		this->analyzeStr = analyzeStr;
		this->remainStr = remainStr;
	}
};
struct Sentence
{
   
	vector<string> analyzeStack;
	vector<string> remainString;
	vector<Description > description;
	string sentenceContent;
	void analyzeString() {
   //分析串
		int productionIndex;
		string nAnaStr, nRemStr;
		vector<string> nRight;
		analyzeStack.clear();//原有分析栈清空
		description.clear();//原有描述清空
		remainString = splitString(sentenceContent + " #");//获取剩余输入串(默认以空格隔开)
		analyzeStack.push_back("#");//压入#
		analyzeStack.push_back(grammer.startSymbol);//压入开始符号
		while (true) {
   
			nAnaStr 
### PyCharm 常见问题及解决方案 #### 如何安装 Pydantic PyCharm 插件? 为了在 PyCharm 中使用 Pydantic 提供的功能支持,可以通过插件市场来完成安装。具体操作如下:进入 `File` -> `Settings` -> `Plugins` 页面,在搜索框输入 “Pydantic”,找到对应的插件并点击安装按钮即可[^1]。 #### pip 安装依赖时报错 SyntaxError: invalid syntax 的原因及解决办法 如果在执行命令 `pip install xxx` 时遇到了语法错误提示,则可能是由于 Python 版本不兼容所引起的问题。建议确认当前使用的 Python 版本是否满足目标模块的要求;或者尝试升级 pip 工具到最新版本以获得更好的兼容性支持[^2]。 ```bash python -m pip install --upgrade pip setuptools wheel ``` #### 配置合适的开发环境(针对特定框架) 对于某些深度学习项目而言,可能需要用到像 TensorFlow 或 PyTorch 这样的大型机器学习库。这些库通常只支持指定范围内的 Python 版本号。例如 Torch 1.1.0 要求运行于 Python 3.6 上面。此时应该考虑借助 Conda 创建独立的虚拟环境来进行适配: ```bash conda create -n python36 python=3.6 conda activate python36 ``` 接着再按照官方文档指引完成后续步骤[^3]。 #### 自定义控制台设置优化调试体验 调整 IDE 内部嵌入式终端的行为参数能够显著提升工作效率。前往路径 `Settings/Preferences | Build, Execution, Deployment | Console | Python Console` 下修改 Working Directory 和 Path Mapping 字段值,从而确保本地文件夹结构映射关系正确无误[^4]。 #### 关于多种解释器类型的介绍及其应用场景说明 - **Virtuanenv Environment**: 当存在多套相互冲突的需求场景下特别适用; - **Conda Environment**: 更适合科研工作者群体因为其强大的包管理能力; - **System Interpreter**: 对初学者友好但缺乏隔离机制容易引发混乱状况; - **Pipenv Environment**: 结合了 Pipfile 文件格式统一描述项目的依赖清单信息[^5]。 ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值