编译原理:算符优先分析实验

这篇具有很好参考价值的文章主要介绍了编译原理:算符优先分析实验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是算符优先分析法
算符优先分析法是一种简单、直观的自下而上分析法
算符优先分析法就是仿照算术表达式的四则运算过程而设计的一种语法分析方法。
这种分析方法首先要规定运算符之间(确切地说终结符之间)的优先关系和结合性质,然后借助这种关系,比较相邻运算符的优先级来确定句型的可归约串并进行归约。

分析步骤为:
1、扩展文法
S’ →#S#

2、求FIRSTVT()和LASTVT()集合
firstvt(S)={ a,^,( }
firstvt(T)={ , } ∪ firstvt(S) = {, ,a,^,( }
lastvt(S)= { a,^,) }
lastvt(T) = { , } ∪ lastvt(S) = { , ,a,^,) }

3、求优先关系
3.1 首先找 等于关系(两个vt之间只隔一个vn)
3.2 低于关系(vt在右,vn在左)
3.3 高于关系(vn在左,vt在右)
4、构造优先关系表
5、算符优先分析过程

一、实验目的

运用算符优先语法分析的基本原理实现对于句子的语法分析

二、实验要求

1、文法及待分析符号串由用户输入
2、数据结构可自行设计

三、实验内容

1、任意输入一个文法,判断它是否为简单优先文法
2、如果是,请构造该文法对应的简单优先分析表
3、输入一个字符串,判断它是否为该文法的一个句子。

四、实验代码文章来源地址https://www.toymoban.com/news/detail-463871.html

#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <stack>
#include <iomanip>
#include <cstdlib>

using namespace std;

string V[100][2]; //存储拆分后的文法
int vi = 0; //存储拆分后有多少行
int t = 0;
int s = 0;
int l;
int r;

string FIRSTVT[20][2]; //存储firstvt集
string LASTVT[20][2]; //存储lastvt集
string str; //存储输入文法
string str_a = "#"; // 下堆栈
string str_b; // 剩余输入串
string analysis_table[100][5]; // 文法分析过程

char table[100][100]; // 算符优先关系表

void init_string(string &a) // 删除字符串的第一个元素
{
   
	for (int i = 1; i <= a.length(); ++i)
	{
   
		a[i - 1] = a[i];
	}
}

bool is_CHAR(char c) // 判断是否为大写字母
{
   
	if (c >= 'A' && c <= 'Z')
	{
   
		return true;
	}
	else
	{
   
		return false;
	}
}

bool is_in(int i, string x) // 判断从字符串x从最好一个开始算起连续的i个字符是否含有非大写字母
{
   
	bool flag = false;
	for (int j = 0; j < i; j++)
	{
   
		if (!is_CHAR(x[x.length() - j - 1]))
		{
   
			flag = true;
		}
	}
	return flag;
}

void split(string a) // 拆分文法,使其不含有|
{
   
	for (int i = 3; i < a.length(); ++i)
	{
   
		V[vi][0] = a[0];
		while (a[i] != '|' && i < a.length())
		{
   
			V[vi][1] += a[i];
			i++;
		}
		vi++;
	}
}

void read_file(string file_path) //按行读取文件
{
   
	fstream f;
	f.open(file_path.c_str());
	vector<string> words;
	string line;
	while (getline(f, line))
	{
   
		words.push_back(line);
	}
	cout << "输入文法:" << endl;
	for (int i = 0; i < words.size(); i++)
	{
   
		cout << words[i] << endl;
		split(words[i]);
	}
}

int find_index(char a) //寻找字符a在firstvt或者lastvt中的位置
{
   
	for (int i = 0; i < t; ++i)
	{
   
		if (FIRSTVT[i][0][0] == a)
		{
   
			return i;
		}
	}
	return -1;
}

int find_table_index(char a) //寻找字符a在算符优先关系表中的位置
{
   
	for (int i = 0; i <= s; ++i)
	{
   
		if (table[i][0] == a)
		{
   
			return i;
		}
	}
	return -1;
}

void get_start() //获取非终结符
{
   
	for (int i = 0; i < vi; ++i)
	{
   
		bool flag = true;
		for (int j = 0; j < t; ++j)
		{
   
			if (FIRSTVT[j][0] == V[i][0])
			{
   
				flag = false;
			}
		}
		if (flag)
		{
   
			FIRSTVT[t][0] = V[i][0];
			LASTVT[t][0] = V[i][0];
			t++;
		}
	}
}

void add_firstvt(string b, int a) //判断字符串b是否在序号为a的firstvt中,没有则加入
{
   
	for (int s = 0; s < b.length(); ++s)
	{
   
		bool flag = true;
		char c = b[s];
		if (c <= 'Z' && c >= 'A')
		{
   
			continue;
		}
		for (int i = 0; i < FIRSTVT[a][1].length(); ++i)
		{
   
			if (c == FIRSTVT[a][1][i])
			{
   
				flag = false;
			}
		}
		if (flag)
		{
   
			FIRSTVT[a][1] += c;
		}
	}
}

void add_firstvt(

到了这里,关于编译原理:算符优先分析实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 编译原理实验三:预测分析法语法分析器的设计

    ​ 根据文法编制预测分析法语法分析程序,以便对输入的符号串进行语法分析。通过编写预测分析法语法分析程序掌握预测分析法的基本原理、FIRST和FOLLOW集的计算、预测分析表的构造方法以及语法分析法主控程序的设计。 对于给定的上下文无关文法,编程完成以下功能:

    2024年02月05日
    浏览(55)
  • 【编译原理实验】 -- 词法分析程序设计原理与实现(C语言实现)

    目录 目标任务 设计要求 一、程序功能描述 二、正则文法 三、程序结构描述 四、代码  五、程序测试  测试用例1 测试结果1 测试用例2 测试结果2 以下为正则文法所描述的 C 语言子集单词符号的示例,请补充单词符号:++,--, , , += , -= ,*=, /= ,(逻辑与),||(逻辑或),

    2024年02月02日
    浏览(127)
  • 【编译原理】 实验一:词法分析器的自动实现(Lex词法分析)

    相关代码实操移步视频 https://www.bilibili.com/video/BV13x4y1o7FL 1.借助词法分析工具Flex或Lex完成(参考网络资源) 2.输入:高级语言源代码(如helloworld.c) 3.输出:以二元组表示的单词符号序列。 通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握

    2024年02月08日
    浏览(56)
  • 【编译原理】【C语言】实验三:递归下降分析法

    C语言 实验环境:Visual Studio 2019 author:zoxiii   用高级语言实现递归下降分析程序。使用输入串i*(i+i),输出分析栈中所有内容,并给出分析结果。   自顶向下分析就是从文法的开始符触发并寻找出这样一个推导序列:推导出的句子恰好为输入符号串;或者说,能否从根节

    2023年04月21日
    浏览(40)
  • 编译原理C++单词拼装器&词法分析器实验思路

    本文只涉及功能实现的思路,针对期末复习,不涉及制作操作界面。 实验内容 1. 把C++源代码中的各类单词(记号)进行拼装分类。 C++语言包含了几种类型的单词(记号):标识符,,数(包括整数、浮点数),字符串、注释、特殊符号(分界符)和运算符号等【详细

    2024年04月08日
    浏览(51)
  • 【编译原理】 实验三 LL(1)分析法(LL1分析表的自动生成)

    由于代码较长,csdn对文章总长度有字数限制,想只看完整代码的请移步另一篇博客。 https://blog.csdn.net/qq_46640863/article/details/125705891 理论与习题讲解移步视频 https://www.bilibili.com/video/BV1zu4y1C7SL 1.实现LL(1)分析算法 2.输入:教材中的算术表达式文法;待分析的语句(如i+i*i) 3.输

    2024年02月06日
    浏览(46)
  • 编译原理之LL(1)语法分析实验(附完整C/C++代码与测试)

    先从键盘读入要分析的文法,由程序自动构造FIRST、FOLLOW 集以及SELECT集合,判断是否为LL (1)文法。 分析文法为G[E]: (0)E→ TE’   (1)E’→ +TE’ (2)E’→ε    (3)T→ FT’ (4)T’→ *FT’   (5)T’→ε     (6)F→ (E)    (7)F→a 若符合LL (1)文法,由程序自动构

    2024年02月04日
    浏览(46)
  • HNU-编译原理-实验1-利用FLEX构造C-Minus-f词法分析器

    计科210X 甘晴void 202108010XXX 详细的实验项目文档为 https://gitee.com/coderwym/cminus_compiler-2023-fall/tree/master/Documentations/lab1 学习和掌握词法分析程序的逻辑原理与构造方法。通过 FLEX 进行实践, 构造 C-Minus-f 词法分析器。具体完成过程如下: 学习 C-Minus-f 的词法规则 学习 FLEX 工具使

    2024年01月20日
    浏览(55)
  • 实验四 :OSPF开销、协议优先级及计时器的修改(抓包分析OSPF)

    实验四 :OSPF开销、协议优先级及计时器的修改(抓包分析OSPF) 实验目的: 通过本次实验,掌握配置OSPF协议优先级的方法,掌握配置OSPF开销的方法,掌握配置OSPF Hello timer 的方法,掌握配置OSPFDead timer的方法。 实验环境: 硬件:PC机 软件:windows操作系统,ensp 实验内容: OSPF开

    2024年02月09日
    浏览(44)
  • 编译原理实验二——消除一切文法的左递归(c++实现)

    首先给出书中的算法截图: 第一步:处理产生式的输入 所有产生式使用一个结构体存储: 可以看到,left代表产生式的左部,right代表产生式的右部,而且是一个集合。 例如S-Qc|c,在程序中,left=S,right=Qc,c 输入的结果保存在一个vector的数据结构中,并起名为v 输入函数为: 由

    2024年02月05日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包