資源簡介
(1)根據(jù)給定文法,先求出FirstVt和LastVt集合,構(gòu)造算符優(yōu)先關(guān)系表(要求算符優(yōu)先關(guān)系表 輸出到屏幕或者輸出到文件);
(2)根據(jù)算法和優(yōu)先關(guān)系表分析給定表達(dá)式是否是該文法識別的正確的算術(shù)表達(dá)式(要求輸出歸約過程)
(3)給定表達(dá)式文法為:
G(E’): E’→#E#
E→E+T | T
T→T*F |F
F→(E)|i
(4)分析的句子為:
(i+i)*i和i+i)*i

代碼片段和文件信息
/*
*本次實(shí)驗(yàn)內(nèi)容是算符運(yùn)算分析
實(shí)驗(yàn)任務(wù)分為一下三部分:
*構(gòu)造FIRSTVT,LASTVT
*構(gòu)造算符優(yōu)先表
*根據(jù)輸入判斷結(jié)果
*/
#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;//存放文法的個(gè)數(shù),初值為0
char?VT[NUM_VT]?=?{?‘+‘‘*‘‘^‘‘i‘‘(‘‘)‘‘#‘?};//枚舉所有終結(jié)符
char?VN[NUM_VN]?=?{?‘E‘‘T‘‘F‘‘P‘‘S‘?};//,枚舉所有的非終結(jié)符
int?firstVt[NUM_VN][NUM_VT];//存放每個(gè)非終結(jié)符的FIRSTVT集
int?lastVt[NUM_VN][NUM_VT];//存放每個(gè)非終結(jié)符的LASTVT集
int?labelOfCh[maxsize];//保存以ch開頭的所有文法的標(biāo)號
//int?firstVt[NUM_VN][NUM_VT];//存放每一個(gè)非終結(jié)符的FIRSTVT
//int?lastVt[NUM_VN][NUM_VT];//存放每一個(gè)非終結(jié)符的LASTVT
char?OGTable[NUM_VT][NUM_VN];//存放算符優(yōu)先表
//首先讀取文法
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;
}
}
//判斷文法字符是否是終結(jié)符
int?isVt(char?ch)
{
for?(int?i?=?0;?i? {
if?(ch?==?VT[i])
return?true;
}
return?false;
}
//判斷文法字符是否是非終結(jié)符
int?isVn(char?ch)
{
for?(int?i?=?0;?i? {
if?(ch?==?VN[i])
return?true;
}
return?false;
}
//將終結(jié)符轉(zhuǎn)換為下標(biāo)
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;
}
}
//將終結(jié)符轉(zhuǎn)換為下標(biāo)
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開頭文法的下標(biāo)并保存
int?findCh(char?ch)
{
int?num?=?0;
for?(int?i?=?0;?i? {
if?(WenFa[i][0]?==?ch)
{
labelOfCh[num++]?=?i;
}
}
return?num;//因?yàn)閚um是以0開始計(jì)數(shù),所以不需要減1
}
//首先是計(jì)算FIRSTVT集,算法如下:
//1)若有產(chǎn)生式P->a...或者P->Qa...
//則a屬于FIRSTVT(P)
//2)若有產(chǎn)生式P->Q
//若a屬于FIRSTVT(Q)
//則a屬于FIRSTVT(P)
//注意算符優(yōu)先分析的文法右部必須是不包含兩個(gè)不相鄰的非終結(jié)符
void?getFirstVt(char?ch)
{
//首先判斷給定的字符是否是非終結(jié)符
if?(isVn(ch))
{
//獲得ch所對應(yīng)的文法編號,找到以該非終結(jié)符開頭的文法的下標(biāo)
int?firstNum?=?VnToInt(ch);
int?num?=?findCh(ch);//num為返回的文法數(shù)量下標(biāo)保存在labelOfCh數(shù)組中
//開始求FITSTVT集
for?(int?i?=?0;?i? {
char?rightFirst?=?WenFa[labelOfCh[i]][3];
//判斷該文法推出的第一個(gè)是終結(jié)符,則加入FIRSTVT集,如果不是將第二個(gè)字符加入FIRSTVT集中
//并且如果該文法的第一個(gè)非終結(jié)符不是左側(cè)符號的話還需要將該非終結(jié)符的FIRSTVT加入當(dāng)前文法的FITRSTVT集中
if?(isVt(rightFirst))
{
firstVt[firstNum][VtToInt(rightFirst)]?=?1;
}
//否則該文法的右部第一個(gè)不是非終結(jié)符
else
{
char?rightSecond?=?WenFa[labelOfCh[i]][4];
if?(isVt(rightSecond))
{
firstVt[firstNum][VtToInt(rightSecond)]?=?1;
}
if?(ch?!=?rightFirst)
{
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件???????7400??2017-10-29?22:43??算符優(yōu)先分析1\算符優(yōu)先分析1\算符優(yōu)先分析1.vcxproj
?????文件????????956??2017-10-29?22:43??算符優(yōu)先分析1\算符優(yōu)先分析1\算符優(yōu)先分析1.vcxproj.filters
?????文件?????????42??2017-10-29?20:23??算符優(yōu)先分析1\算符優(yōu)先分析1\Input.txt
?????文件?????????68??2017-10-29?20:22??算符優(yōu)先分析1\算符優(yōu)先分析1\nick.txt
?????文件????????215??2017-10-30?11:17??算符優(yōu)先分析1\算符優(yōu)先分析1\Debug\算符優(yōu)先分析1.tlog\算符優(yōu)先分析1.lastbuildstate
?????文件??????16160??2017-10-30?11:17??算符優(yōu)先分析1\算符優(yōu)先分析1\Debug\算符優(yōu)先分析1.tlog\CL.read.1.tlog
?????文件????????464??2017-10-30?11:17??算符優(yōu)先分析1\算符優(yōu)先分析1\Debug\算符優(yōu)先分析1.tlog\CL.write.1.tlog
?????文件????????670??2017-10-30?11:17??算符優(yōu)先分析1\算符優(yōu)先分析1\Debug\算符優(yōu)先分析1.tlog\CL.command.1.tlog
?????文件???????2882??2017-10-30?11:17??算符優(yōu)先分析1\算符優(yōu)先分析1\Debug\算符優(yōu)先分析1.tlog\li
?????文件????????420??2017-10-30?11:17??算符優(yōu)先分析1\算符優(yōu)先分析1\Debug\算符優(yōu)先分析1.tlog\li
?????文件???????1134??2017-10-30?11:17??算符優(yōu)先分析1\算符優(yōu)先分析1\Debug\算符優(yōu)先分析1.tlog\li
?????文件????????429??2017-10-30?11:17??算符優(yōu)先分析1\算符優(yōu)先分析1\Debug\算符優(yōu)先分析1.log
?????文件????????524??2017-10-29?23:33??算符優(yōu)先分析1\算符優(yōu)先分析1\Debug\算符優(yōu)先分析1.Build.CppClean.log
?????文件?????330752??2017-10-30?11:17??算符優(yōu)先分析1\算符優(yōu)先分析1\Debug\vc140.idb
?????文件?????348160??2017-10-30?11:17??算符優(yōu)先分析1\算符優(yōu)先分析1\Debug\vc140.pdb
?????文件??????56848??2017-10-30?11:17??算符優(yōu)先分析1\算符優(yōu)先分析1\Debug\OperatorGrammer.obj
?????文件???????9164??2017-10-30?11:17??算符優(yōu)先分析1\算符優(yōu)先分析1\OperatorGrammer.cpp
?????文件????8478720??2017-10-31?23:33??算符優(yōu)先分析1\算符優(yōu)先分析1.VC.db
?????文件???????1339??2017-10-29?22:43??算符優(yōu)先分析1\算符優(yōu)先分析1.sln
????..A..H.?????28160??2017-10-31?23:33??算符優(yōu)先分析1\.vs\算符優(yōu)先分析1\v14\.suo
?????文件?????880640??2017-10-30?11:17??算符優(yōu)先分析1\Debug\算符優(yōu)先分析1.pdb
?????文件?????338956??2017-10-30?11:17??算符優(yōu)先分析1\Debug\算符優(yōu)先分析1.ilk
?????文件??????40960??2017-10-30?11:17??算符優(yōu)先分析1\Debug\算符優(yōu)先分析1.exe
?????目錄??????????0??2017-10-29?22:47??算符優(yōu)先分析1\算符優(yōu)先分析1\Debug\算符優(yōu)先分析1.tlog
?????目錄??????????0??2017-10-29?21:09??算符優(yōu)先分析1\.vs\算符優(yōu)先分析1\v14
?????目錄??????????0??2017-10-29?22:47??算符優(yōu)先分析1\算符優(yōu)先分析1\Debug
?????目錄??????????0??2017-10-29?21:09??算符優(yōu)先分析1\.vs\算符優(yōu)先分析1
?????目錄??????????0??2017-10-29?21:09??算符優(yōu)先分析1\算符優(yōu)先分析1
????...D.H.?????????0??2017-10-29?21:09??算符優(yōu)先分析1\.vs
?????目錄??????????0??2017-10-29?22:47??算符優(yōu)先分析1\Debug
............此處省略4個(gè)文件信息
評論
共有 條評論