合肥工业大学编译原理实验报告(完整代码版)资料下载.pdf
《合肥工业大学编译原理实验报告(完整代码版)资料下载.pdf》由会员分享,可在线阅读,更多相关《合肥工业大学编译原理实验报告(完整代码版)资料下载.pdf(31页珍藏版)》请在冰豆网上搜索。
)分界符(1,8)a(6,a)标识符(2,1)=(4,=)关系运算符(2,2)3bErrorError(2,4)%ErrorError(2,4))(2,)分界符(2,5);
)分界符(2,6)三、三、实验内容实验内容用VC+/VB/JAVA语言实现对C语言子集的源程序进行词法分析。
通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值;
若遇到错误则显示“Error”,然后跳过错误部分继续显示;
同时进行标识符登记符号表的管理。
以下是实现词法分析设计的主要工作:
(1)从源程序文件中读入字符。
(2)统计行数和列数用于错误单词的定位。
(3)删除空格类字符,包括回车、制表符空格。
(4)按拼写单词,并用(内码,属性)二元式表示。
(属性值token的机内表示)(5)如果发现错误则报告出错7(6)根据需要是否填写标识符表供以后各阶段使用。
四、实验步骤四、实验步骤1、根据流程图编写出各个模块的源程序代码上机调试。
2、编制好源程序后,设计若干用例对系统进行全面的上机测试,并通过所设计的词法分析程序;
直至能够得到完全满意的结果。
3、书写实验报告;
实验报告正文的内容:
功能描述:
该程序具有什么功能?
程序结构描述:
函数调用格式、参数含义、返回值描述、函数功能;
函数之间的调用关系图。
详细的算法描述(程序总体执行流程图)。
给出软件的测试方法和测试结果。
实验总结(设计的特点、不足、收获与体会)。
五、实验五、实验截图截图先创建salaryfile.txt文件输入Ifi=0thenn+;
六、六、核心代码核心代码#include#include#include#includeusingnamespacestd;
constchar*salaryfile=salaryfile.txt;
constintmax=40;
stringidmax=do,end,for,if,printf,scanf,then,while;
/关键关键字表字表stringsmax=,;
(,),+,-,*,/,=,;
/分界符表分界符表算数运算符表算数运算符表关系运算符表关系运算符表stringkmax;
/标识符标识符stringcimax;
/常数常数intfjfpoint=5;
/分界符表尾分界符表尾intmathpoint=9;
/算数运算符表尾算数运算符表尾intcipointer=0;
/常数表尾常数表尾intidpointer=0;
/关键字表尾关键字表尾intkpointer=0;
/标识符表尾标识符表尾intfjf;
/0不是分界符不是分界符1是是introwy=1;
/识别输入行位置识别输入行位置introwx=1;
/识别输入列位置识别输入列位置intoutkey=0;
/打印控制打印控制0为数字后有字母为数字后有字母其他可以其他可以voidsearcht(inti,stringm)/根据已识别的首字母识别字符串根据已识别的首字母识别字符串/coutentersearcht!
endl;
intx;
if(i=0)/首字符是字母识别关键字首字符是字母识别关键字/coutaword!
for(x=0;
xmax;
x+)if(idx=m)cout(1,idx)关键字关键字(rowy,rowx)endl;
break;
if(x=max)/不是关键字再识别标识符不是关键字再识别标识符for(x=0;
x+)if(kx=m)cout(6,m)标识符标识符(rowy,rowx)endl;
if(x=max)/标识符表没有时插入标识符标识符表没有时插入标识符cout(6,m)标识符标识符(rowy,rowx)endl;
kkpointer=m;
kpointer+;
if(i=1)/识别常数识别常数/coutanumber!
x+)if(cix=m)cout(5,x)endl;
if(x=max)cout(5,m)常数常数(rowy,rowx)endl;
cicipointer=m;
cipointer+;
if(i=2)/识别识别分界符分界符算数运算符算数运算符关系运算符关系运算符/coutasignal!
x+)if(sx=m)break;
/x-;
if(x5&
x10)if(outkey=1)cout(3,sx)算数运算符算数运算符(rowy,rowx)9&
xmax-1)if(outkey=1)cout(4,sx)关系运算符关系运算符(rowy,rowx)endl;
outkey=0;
fjf=0;
if(x=max)if(outkey=1)coutErrorError(rowy,rowx)=48&
t64&
t96&
t123)searcht(0,sn);
elsesearcht(2,sn);
voidsplit(strings)/分割字符串分割字符串/coutsendl;
stringnowmax;
stringsn;
intnowpointer=0;
inti=0;
intsign=2;
/非法数字标志非法数字标志intdiannumber=0;
/数中点的个数数中点的个数for(x=0;
x64&
sx96&
sx=48&
sx0&
sx=46&
sign=1)/判断数字后跟字母还是字母后有数字判断数字后跟字母还是字母后有数字if(i=0)if(sx=48&
sx0)/coutsni=iendl;
coutsn;
if(sign=0)/数字后有字母的情况数字后有字母的情况coutErrorError(rowy,rowx)endl;
else/字母开头的字符串字母开头的字符串/couttrue0&
(sx-164&
sx-196&
sx-1=48&
sx-10)/coutsni=iendl;
if(sign=0)coutErrorError(rowy,rowx)endl;
else/couttrue64&
sx+196&
sx+1=48&
sx+1=57)/如果后面是数字或字母如果后面是数字或字母sn=s.substr(x-i+1,i);
/coutsn运算符运算符i=iendl;
coutsn64&
sx-10)sn=s.substr(x-i,i);
outkey=1;
wordlook(sn0,sn);
rowx+;
i=0;
coutsx(2,sx)分界符分界符(rowy,rowx)endl;
/*if(ll=;
)rowy+;
rowx=1;
*/;
intmain()intx;
stringinstring;
/读入一行读入一行stringsn;
/*getline(cin,sn);
/string带空格输入带空格输入coutsn=48&
tnoskipws;
if(!
inputfile)coutnofileppword)/按照空格分割字符串按照空格分割字符串split(ppword);
/*intbegin=0;
/去掉字符串的所有空格去掉字符串的所有空格begin=pp.find(,begin);
/查找空格在查找空格在str中第一次出现的位置中第一次出现的位置while(begin!
=-1)/表示字符串中存在空格表示字符串中存在空格pp.replace(begin,1,);
/用空串替用空串替换换str中中从从begin开始开始的的1个字符个字符begin=pp.find(,begin);
/查找空格在替换后查找空格在替换后的的str中第一次出现的中第一次出现的位置位置*/coutgoodppTG
(2)G-+TG|TG(3)G-(4)T-FS(5)S-*FS|/FS(6)S-(7)F-(E)(8)F-i三、三、实验内容实验内容根据某一文法编制调试LL
(1)分析程序,以便对任意输入的符号串进行分析。
构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序。
分析法的功能是利用LL
(1)控制程序根据显示栈栈顶内容、向前看符号以及LL
(1)分析表,对输入符号串自上而下的分析过程。
2、编制好源程序后,设计若干用例对系统进行全面的上机测试,并通过所设计的LL
(1)分析程序;
写出LL
(1)分析法的思想及写出符合LL
(1)分析法的文法。
详细的算法描述(程序执行流程图)。
五、实验五、实验截图截图六、六、核心代码核心代码#include#includeusingnamespacestd;
stringpp;
/输出字符串输出字符串stringhh=rn;
/换行换行constintmax=50;
intendfumax;
/终止符序号表终止符序号表intendfupointer=8;
charendfurealmax=+,-,*,/,(,i,),#;
intunendfumax;
intunendfupointer=5;
charunendfurealmax=E,G,T,S,F;
stringmakemathmax=E-TG,G-+TG,G-TG,G-$,T-FS,S-*FS,S-/FS,S-$,F-(E),F-i;
/0E-TG,1G-+TG,2G-TG,3G-$,4T-FS,5S-*FS,6S-/FS,7S-$,8F-(E),9F-i/$代表空串代表空串stringbehaviormax=初始化初始化,POP;
intsmarttablemaxmax;
/分析表分析表intcheckendfu(charfu)/查终结符序号查终结符序号intx;
xendfupointer;
x+)if(endfurealx=fu)break;
if(xendfupointer)returnx;
elsereturn-1;
intcheckunendfu(charfu)/查非终结符序号查非终结符序号intx;
xunendfupointer;
x+)if(unendfurealx=fu)break;
if(xunendfupointer)returnx;
stringcheckmakemath(intx)/查产生式表查产生式表r