• 大小: 2.05MB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2023-10-29
  • 语言: 其他
  • 标签: 算符优先  

资源简介

(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\link.read.1.tlog

     文件        420  2017-10-30 11:17  算符优先分析1\算符优先分析1\Debug\算符优先分析1.tlog\link.write.1.tlog

     文件       1134  2017-10-30 11:17  算符优先分析1\算符优先分析1\Debug\算符优先分析1.tlog\link.command.1.tlog

     文件        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个文件信息

评论

共有 条评论