资源简介
(1)根据给定文法,先求出FirstVt和LastVt集合,构造算符优先关系表(要求算符优先关系表 输出到屏幕或者输出到文件);
(2)根据算法和优先关系表分析给定表达式是否是该文法识别的正确的算术表达式(要求输出归约过程)
(3)给定表达式文法为:
G(E’): E’→#E#
E→E+T | T
T→T*F |F
F→(E)|i
(4)分析的句子为:
(i+i)*i和i+i)*i
代码片段和文件信息
/*
*本次实验内容是算符运算分析
实验任务分为一下三部分:
*构造FIRSTVT,LASTVT
*构造算符优先表
*根据输入判断结果
*/
#include
#include
#include
#pragma warning(disable:4996)
using namespace std;
const int maxsize = 10;
const int NUM_VT = 7;
const int NUM_VN = 5;
char WenFa[maxsize][maxsize];//存放从文件中读取的文法
int wenfaNum = 0;//存放文法的个数,初值为0
char VT[NUM_VT] = { ‘+‘‘*‘‘^‘‘i‘‘(‘‘)‘‘#‘ };//枚举所有终结符
char VN[NUM_VN] = { ‘E‘‘T‘‘F‘‘P‘‘S‘ };//,枚举所有的非终结符
int firstVt[NUM_VN][NUM_VT];//存放每个非终结符的FIRSTVT集
int lastVt[NUM_VN][NUM_VT];//存放每个非终结符的LASTVT集
int labelOfCh[maxsize];//保存以ch开头的所有文法的标号
//int firstVt[NUM_VN][NUM_VT];//存放每一个非终结符的FIRSTVT
//int lastVt[NUM_VN][NUM_VT];//存放每一个非终结符的LASTVT
char OGTable[NUM_VT][NUM_VN];//存放算符优先表
//首先读取文法
bool readFromFile(char *str)
{
FILE *fp = fopen(str “r“);
if (fp)
{
while (EOF != fscanf(fp “%s“ WenFa[wenfaNum]))
{
wenfaNum++;
}
fclose(fp);
return true;
}
else
{
printf(“Failed to open the file!\n“);
return false;
}
}
//判断文法字符是否是终结符
int isVt(char ch)
{
for (int i = 0; i < NUM_VT; i++)
{
if (ch == VT[i])
return true;
}
return false;
}
//判断文法字符是否是非终结符
int isVn(char ch)
{
for (int i = 0; i < NUM_VN; i++)
{
if (ch == VN[i])
return true;
}
return false;
}
//将终结符转换为下标
int VnToInt(char ch)
{
switch (ch)
{
case ‘E‘:
return 0;
break;
case ‘T‘:
return 1;
break;
case ‘F‘:
return 2;
break;
case ‘P‘:
return 3;
break;
case ‘S‘:
return 4;
break;
default:
return -1;
}
}
//将终结符转换为下标
int VtToInt(char ch)
{
switch(ch)
{
case ‘+‘:
return 0;
break;
case ‘*‘:
return 1;
break;
case ‘^‘:
return 2;
break;
case ‘i‘:
return 3;
break;
case ‘(‘:
return 4;
break;
case ‘)‘:
return 5;
break;
case ‘#‘:
return 6;
break;
default:
return -1;
}
}
//查找以ch开头文法的下标并保存
int findCh(char ch)
{
int num = 0;
for (int i = 0; i < wenfaNum; i++)
{
if (WenFa[i][0] == ch)
{
labelOfCh[num++] = i;
}
}
return num;//因为num是以0开始计数,所以不需要减1
}
//首先是计算FIRSTVT集,算法如下:
//1)若有产生式P->a...或者P->Qa...
//则a属于FIRSTVT(P)
//2)若有产生式P->Q
//若a属于FIRSTVT(Q)
//则a属于FIRSTVT(P)
//注意算符优先分析的文法右部必须是不包含两个不相邻的非终结符
void getFirstVt(char ch)
{
//首先判断给定的字符是否是非终结符
if (isVn(ch))
{
//获得ch所对应的文法编号,找到以该非终结符开头的文法的下标
int firstNum = VnToInt(ch);
int num = findCh(ch);//num为返回的文法数量下标保存在labelOfCh数组中
//开始求FITSTVT集
for (int i = 0; i < num; i++)
{
char rightFirst = WenFa[labelOfCh[i]][3];
//判断该文法推出的第一个是终结符,则加入FIRSTVT集,如果不是将第二个字符加入FIRSTVT集中
//并且如果该文法的第一个非终结符不是左侧符号的话还需要将该非终结符的FIRSTVT加入当前文法的FITRSTVT集中
if (isVt(rightFirst))
{
firstVt[firstNum][VtToInt(rightFirst)] = 1;
}
//否则该文法的右部第一个不是非终结符
else
{
char rightSecond = WenFa[labelOfCh[i]][4];
if (isVt(rightSecond))
{
firstVt[firstNum][VtToInt(rightSecond)] = 1;
}
if (ch != rightFirst)
{
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 7400 2017-10-29 22:43 算符优先分析1\算符优先分析1\算符优先分析1.vcxproj
文件 956 2017-10-29 22:43 算符优先分析1\算符优先分析1\算符优先分析1.vcxproj.filters
文件 42 2017-10-29 20:23 算符优先分析1\算符优先分析1\Input.txt
文件 68 2017-10-29 20:22 算符优先分析1\算符优先分析1\nick.txt
文件 215 2017-10-30 11:17 算符优先分析1\算符优先分析1\Debug\算符优先分析1.tlog\算符优先分析1.lastbuildstate
文件 16160 2017-10-30 11:17 算符优先分析1\算符优先分析1\Debug\算符优先分析1.tlog\CL.read.1.tlog
文件 464 2017-10-30 11:17 算符优先分析1\算符优先分析1\Debug\算符优先分析1.tlog\CL.write.1.tlog
文件 670 2017-10-30 11:17 算符优先分析1\算符优先分析1\Debug\算符优先分析1.tlog\CL.command.1.tlog
文件 2882 2017-10-30 11:17 算符优先分析1\算符优先分析1\Debug\算符优先分析1.tlog\li
文件 420 2017-10-30 11:17 算符优先分析1\算符优先分析1\Debug\算符优先分析1.tlog\li
文件 1134 2017-10-30 11:17 算符优先分析1\算符优先分析1\Debug\算符优先分析1.tlog\li
文件 429 2017-10-30 11:17 算符优先分析1\算符优先分析1\Debug\算符优先分析1.log
文件 524 2017-10-29 23:33 算符优先分析1\算符优先分析1\Debug\算符优先分析1.Build.CppClean.log
文件 330752 2017-10-30 11:17 算符优先分析1\算符优先分析1\Debug\vc140.idb
文件 348160 2017-10-30 11:17 算符优先分析1\算符优先分析1\Debug\vc140.pdb
文件 56848 2017-10-30 11:17 算符优先分析1\算符优先分析1\Debug\OperatorGrammer.obj
文件 9164 2017-10-30 11:17 算符优先分析1\算符优先分析1\OperatorGrammer.cpp
文件 8478720 2017-10-31 23:33 算符优先分析1\算符优先分析1.VC.db
文件 1339 2017-10-29 22:43 算符优先分析1\算符优先分析1.sln
..A..H. 28160 2017-10-31 23:33 算符优先分析1\.vs\算符优先分析1\v14\.suo
文件 880640 2017-10-30 11:17 算符优先分析1\Debug\算符优先分析1.pdb
文件 338956 2017-10-30 11:17 算符优先分析1\Debug\算符优先分析1.ilk
文件 40960 2017-10-30 11:17 算符优先分析1\Debug\算符优先分析1.exe
目录 0 2017-10-29 22:47 算符优先分析1\算符优先分析1\Debug\算符优先分析1.tlog
目录 0 2017-10-29 21:09 算符优先分析1\.vs\算符优先分析1\v14
目录 0 2017-10-29 22:47 算符优先分析1\算符优先分析1\Debug
目录 0 2017-10-29 21:09 算符优先分析1\.vs\算符优先分析1
目录 0 2017-10-29 21:09 算符优先分析1\算符优先分析1
...D.H. 0 2017-10-29 21:09 算符优先分析1\.vs
目录 0 2017-10-29 22:47 算符优先分析1\Debug
............此处省略4个文件信息
相关资源
- 语法分析算符优先.doc
- 算符优先语法分析程序
- 算符优先分析算法的设计与实现
- 算符优先分析程序
- 算符优先分析算法实验报告
- 编译原理语法分析中的算符优先编译
- 编译原理 算符优先文法 实验报告 代
- 编译原理 算符优先分析程序
- 编译原理课程设计-LL(1)预测分析法
- 语法分析器 算符优先 编译原理实验
- 算符优先分析算法的设计与实现 编译
- 编译原理课设——算符优先分析程序
- 编译原理课程设计报告_算符优先分析
- 算符优先分析程序的设计可趁设计
- 计算器用算符优先实现
- 编译原理算符优先文法实验源码
- 算符优先文法 构造优先表
- 设计一个程序,演示用算符优先法对
- Sample语言编译器(词法分析、正规式
- 编译原理课程设计 算符优先分析文法
- 算符优先分析过程模拟
- 算符优先分析和词法分析器的设计与
- 构造优先表,判断算符优先算法
- 语法分析 算符优先分析程序
- 表达式求值算法-算符优先法
- 算符优先分析 编译原理
- 基于算符优先分析方法的语法制导翻
评论
共有 条评论