编译程序实验指导书

上传人:m**** 文档编号:151882172 上传时间:2022-09-14 格式:DOCX 页数:20 大小:262.90KB
收藏 版权申诉 举报 下载
编译程序实验指导书_第1页
第1页 / 共20页
编译程序实验指导书_第2页
第2页 / 共20页
编译程序实验指导书_第3页
第3页 / 共20页
资源描述:

《编译程序实验指导书》由会员分享,可在线阅读,更多相关《编译程序实验指导书(20页珍藏版)》请在装配图网上搜索。

1、编译程序实验指导书理的实验目的:用C语言对一个C语言的子集编制一个一遍扫描的编译程序,以加深对编译原理解,掌握编译程序的实现方法和技术。1词法分析1.1实验目的设计、编制并测试一个词法分析程序,加深对词法分析原理的理解。1.2实验要求121待分析的C语言子集的词法1. 关键字mainifelseintcharforwhile所有的关键字都是小写。2. 专用符号=+-*/35else5/25二37while7)27ID|NUM(表达式)3语法分析程序的算法思想3所示。(1) 主程序示意图如图图3语法分析主程序示意图(2) 递归下降分析程序示意图如图4所示。图4递归下降分析程序示意图出悟处理Itl

2、iu图5语句块分析示意图图6语句串分析示意图statement(语句)函数流程如图7所示;expression(表达式)分析过程如图8所示;term(项)分析过程如图9所示;5678C0ndition(条件)分析过程如图10所示;factor(因子)分析过程如图11所示。调用expression出错处理图7statement函数流程expression语义分析产生中间代码3. 1实验目的通过上机实验,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法。3.2实验要求采用递归下降语法制导翻译法对算术表达式、赋值语句、条件语句、循环语句进行语义分析生成四元式序

3、列。2. 2.1实验的输入和输岀输入是语法分析提供的正确的单词串,输岀是四元式序列。例如,对于语句串i=2*3+4;if(i10)j=3;whilej10k=l;输岀的四元式序列如下:(1) (*,2,3,T1)(2) (+,2,T1,T2)(3) (=,T2,i)(4) (j,i,10,6)5)(j,,7)6)(=,3,j)(j,j,10,9)/(/(j,(=,1,k)8罗)9(聪(9)(11)2.2算法思想1. 设置语义过程(1) .intgen(op,argl,arg2,result)该函数是将四元式(op,argl,arg2,result)送到四元式表中。(2) .char*newte

4、mp()该函数回送一个新的临时变量名,临时变量名产生的顺序为Tl,T2,.(3) .intmerg(pl,p2)该函数将以pl和P2为头指针的两条链合并为一,合并后的链首为返回值。.intbp(p,t)该函数的功能是把P所链接的每个四元式的第四区段都填为to2. 主程序小意图置初值调用scaner调用Irparser打印四元式列表结束图12语义分析主程序示意图3. 函数Irparser在原来语法分析的基础上插入相应的语义动作将输入串翻译成四元式序列。在实验中我们只对表达式、if语句和while语句进行翻译,其具体翻译程序见实验实例。4. 实验实例/*/*文件:globals.h7/*定义分析器

5、需要的一些数据结构、宏等/*本头文件必须在其他文件前引用*/吠*ifndef_GLOBALS_H# define_GLOBALS_Hinelude# inelude# define_SYN_ID# define_SYN_NUM# define_SYN_ID# define_SYN_NUM# include/*单词种别码*/#define_SYN_MAIN1#define_SYN_INT2#define_SYN_CHAR3#define_SYN_IF4#define_SYN_ELSE5#define_SYN_FOR6#defineSYNWHILE7/*以上为关键字的单词种别码*/10/*标识符的

6、单词种别码*/#define_SYN_ASSIGN21/*=*/#define_SYN_PLUS22/*+*/#define_SYN_MINUS23/*-*/#define_SYN_TIMES24/*/#define_SYN_DIVIDE25/*/*/#define_SYN_LPAREN26/*(*/#define_SYN_RPAREN27/*)*/#define_SYN_LEFTBRACKET128/*7#define_SYN_RIGHTBRACKET129/*/#define_SYN_LEFTBRACKET230/*(7#define_SYN_RIGHTBRACKET231/*)7#def

7、ine_SYN_COMMA32/*,7#define_SYN_COLON33/*:*/#define_SYN_SEMICOLON34/*7#define_SYN_LG35/*/#define_SYN_LT36/*V*/#define_SYN_ME37/*=*/#define_SYN_LE38/*=*/#define_SYN_EQ39/*=*/#define_SYN_NE40/*!=*/#defineSYNEND1000/*源程序结束标志720/*整数的单词种别码*/一行允许的字符个数*/#defineMAXLENGTH255/*unionWORDCONTENT(charT1MAXLENGTH;

8、intT2;charT3;/*存放单词内容的联合*/);typedefstructWORD/*单词二元组*/intsyn;unionWORDCONTENTvalue;WORD;#endif/*/*文件:scan.h*/*定义词法分析器的接口7/*#ifndef_SCAN_H#define_SCAN_H/*一个TAB占用的空格数*/#define_TAB_LENGTH4/*关键字结束标记*/#define_KEY_WORD_ENDwaitingforyourexpanding/*函数Scaner得到源程序里的下一个单词符号7voidScaner(void);#endif/*/*文件:scan.c

9、/*分析器的词法扫描部分*/*#includeglobals.h#Includescan.hvoidDo_Tag(char*strSource);voidDo_Digit(char*strSource);voidDo_EndOflag(char*strSource);voidDo_EndOfDigit(char*strSource);voidDo_EndOfEqual(char*strSource);voidDo_EndOfPlus(char*strSource);识别标识符的中间状态7识别数字的中间状态*/识别标识符最后的一个状态7识别数字最后的一个状态7/*=,=*/+*/voidDo_E

10、ndOfSubtraction(char*strSource);/*voidDo_EndOfMultiply(char*strSource);/*voidDo_EndOfDivide(char*strSource);/*voidDo_EndOfLParen(char*strSource);/*voidDo_EndOfRParen(char*strSource);/*voidDo_EndOfLeftBracket1(char*strSource);/*voidDo_EndOfRightBracket1(char*strSource);/*voidDo_EndOfLeftBracket2(char

11、*strSource);/*voidDo_EndOfRightBracket2(char*strSource);/*voidDo_EndOfColon(char*strSource);voidDo_EndOfComma(char*strSource);voidDo_EndOfSemicolon(char*strSource);voidDo_EndOfMore(char*strSource);voidDo_EndOfLess(char*strSource);voidDo_EndOfEnd(char*strSource);-*/7(*/)*/*/*/*1*/:7,*/voidPrintError(

12、intnColumnJntnRow,charchlnput);/*词法分析错误输出*/voidScaner(void)v,v=*/用0作为源程序结束*/*待分析的源程序7/*结果输出文件*/*词法扫描函数*/externchar*strSource;externFILE*fw;intgnColumn,gnRow,gnLocate,gnLocateStart;行列号7下一个字符脚标*/下一个单词开始位置*/WorduWord;扫描出的单词*/*关键字表7char*KEY_WORDS20=main,int,char,if,else,for,while,void,_KEY_WORD_END);int

13、lsDigit(charchlnput)/*判断扫描的字符是否数字*/(if(chlnput=O)return1;elsereturn0;intlsChar(charchlnput)/*判断扫描的字符是否字母7(if(chlnput=a)|(chlnput=A)return1;elsereturn0;)voidDo_Start(char*strSource)/*开始识别最先一个单词7gnLocateStart=gnLocate;switch(strSourcegnLocate)(/*根据第一个字符判断*/caseDo_EndOfPlus(strSource);break;caseDo_EndO

14、fSubtraction(strSource);break;caseDo_EndOfMultiply(strSource);break;case7:Do_EndOfDivide(strSource);break;caseDo_EndOfLParen(strSource);break;caseDo_EndOfRParen(strSource);break;caseDo_EndOfLeftBracket1(strSource);break;caseDo_EndOfRightBracket1(strSource);break;caseDo_EndOfLeftBracket2(strSource);b

15、reak;caseDo_EndOfRightBracket2(strSource);break;caseDo_EndOfColon(strSource);break;caseDo_EndOfComma(strSource);break;caseDo_EndOfSemicolon(strSource);break;caseDo_EndOfMore(strSource);break;caseDo_EndOfLess(strSource);break;caseDo_EndOfEqual(strSource);break;case0:Do_EndOfEnd(strSource);break;defau

16、lt:if(lsChar(strSourcegnLocate)(/*是标识符或关键字*/Do_Tag(strSource);elseif(lsDigit(strSourcegnLocate)(/*可能是整数*/Word.value.T2=strSourcegnLocate-0*;Do_Digit(strSource);else(/*其他符号7if(strSourcegnLocate!=&strSourcegnLocate!=t&strSourcegnLocate!=n&strSourcegnLocate!=r(PrintError(gnColumn,gnRow,strSourcegnLocat

17、e);if(strSourcegnLocate=n|strSourcegnLocate=r)(gnColumn+;gnRow=1;)elseif(strSourcegnLocate=t)(gnColumn+=_TAB_LENGTH;)elsegnRow+;gnLocate+;Do_Start(strSouce);break;return;voidDo_Tag(char*strSource)/*识别标识符的中间状态*/(gnLocate+;gnRow+;if(lsChar(strSourcegnLocate)|lsDigit(strSourcegnLocate)(/*是数字或者字母7Do_7ag

18、(strSource);elseDo_EndOfTag(strSource);return;voidDo_Digit(char*strSource)/*识别整数的中间状态*/(gnLocate+;gnRow+;if(lsDigit(strSourcegnLocate)(/*是数字*/uWord.value.T2=uWord.value.T2*10+strSourcegnLocate-0;/*累加识别的数字*/Do_Digit(strSource);elseDo_EndOfDigit(strSource);return;voidDo_EndOfTag(char*strSource)/*标识符的最

19、后状态*/(intnLoop;uWord.syn=_SYNJD;/*单词种别码缺省为标识符7/*记录标识符*/strncpy(uWord.value.T1,strSource+gnLocateStart,gnLocate-gnLocateStart);uWord.value.T1gnLocate-gnLocateStart=0;nLoop=0;while(strcmp(KEY_WORDSnLoop,_KEy_WORD_END)(/*查关键字表,是否关键字7if(!strcmp(KEY_WORDSnLoop,uWord.value.T1)(/*比较和某关键字相符*/uWord.syn=nLoop

20、+1;/*设置正确的syn*/break;)nLoop+;return;voidDo_EndOfDigit(char*strSource)/*识别数字的最后状态*/(uWord.syn=_SYN_NUM;return;voidDo_EndOfEqual(char*strSource)/*=,=*/(if(strSourcegnLocate+1!=)(/*=*/uWord.syn=_SYN_ASSIGN;uWord.value.T3=strSourcegnLocate;else/*=*/gnLocate+;gnRow+;uWord.syn=_SYN_EQ;strcpy(uWord.value.T

21、1gnLocate+;gnRow+;return;voidDo_EndOfPlus(char*strSource)/*+*/(uWord.syn=_SYN_PLUS;uWord.value.T3=strSourcegnLocate;gnLocate+;gnRow+;return;voidDo_EndOfSubtraction(char*strSource)/*-*/uWord.syn=_SYN_MINUS;uWord.value.T3=strSourcegnLocate;gnLocate+;gnRow+;return;voidDo_EndOfMultply(char*strSource)/*/

22、(uWord.syn=_SYN_TIMES;uWord.value.T3=strSourcegnLocate;gnLocate+;gnRow+;return;voidDo_EndOfDivide(char*strSource)/*/*/(uWord.syn=_SYN_DIVIDE;uWord.value.T3=strSourcegnLocate;gnLocate+;gnRow+;return;voidDo_EndOfLParen(char*strSource)/*(*/(uWord.syn=_SYN_LPAREN;uWord.value.T3=strSourcegnLocate;gnLocat

23、e+;gnRow+;return;voidDo_EndOfRParen(char*strSource)/*(*/(uWord.syn=_SYN_RPAREN;uWord.value.T3=strSourcegnLocate;gnLocate+;gnRow+;return;voidDo_EndOfLeftBracket1(char*strSource)/*/(uWord.syn=_SYN_LEFTBRACKET1;uWord.value.T3=strSourcegnLocate;gnLocate+;gnRow+;return;voidDo_EndOfRightBracket1(char*strS

24、ource)/*/(uWord.syn=_SYN_RIGHTBRACKET1;uWord.value.T3=strSourcegnLocate;gnLocate+;gnRow+;return;voidDo_EndOfLeftBracket2(char*strSource)/*/(uWord.syn=_SYN_LEFTBRACKET2;uWord.value.T3=strSourcegnLocate;gnLocate+;gnRow+;return;voidDo_EndOfRightBracket2(char*strSource)/*/(uWord.syn=_SYN_RIGHTBRACKET2;u

25、Word.value.T3=strSourcegnLocate;gnLocate+;gnRow+;return;voidDo_EndOfColon(char*strSource)/*:*/uWord.syn=_SYN_COLON;uWord.value.T3=strSourcegnLocate;gnLocate+;gnRow+;return;voidDo_EndOfComma(char*strSource)/*,*/(uWord.syn=_SYN_COMMA;uWord.value.T3=strSourcegnLocate;gnLocate+;gnRow+;return;voidDo_EndO

26、fSemicolon(char*strSource)/*;*/(uWord.syn=_SYN_SEMICOLON;uWord.value.T3=strSourcegnLocate;gnLocate+;gnRow+;return;voidDo_EndOfMore(char*strSource)/*,=*/(if(strSourcegnLocate+1!=)(/*/uWord.syn=_SYN_LG;uWord.value.T3=strSourcegnLocate;else/*=*/gnLocate+;gnRow+;uWord.syn=_SYN_ME;strcpy(uWord.value.T1gn

27、Locate+;gnRow+;return;voidDo_EndOfLess(char*strSource)/*,=*/(if(strSourcegnLocate+1!=)(/*/uWord.syn=_SYN_LT;uWord.value.T3=strSourcegnLocate;else/*=*/gnLocate+;gnRow+;uWord.syn=_SYN_LE;strcpy(uWord.value.T1gnLocate+;gnRow+;return;voidDo_EndOfEnd(char*strSource)/*读到0,源程序结束*/(uWord.syn=_SYN_END;uWord.

28、value.T3=strSourcegnLocate;gnLocate+;gnRow+;return;voidPrintWord(WorduWord)/*打印二元组*/(if(uWord.syn=7|uWord.syn=_SYN_LE/*Col:%dtRow:%dtChar:%c,nColumn,nRow,chlnput);return;/*/*文件:semanteme.h*/*定义语法(语义)分析器的接口7/*#ifndef_SEMANTEME_H#define_SEMANTEME_H/*四元组的结构7typedefstructQUADcharopMAXLENGTH;/*操作符*/chara

29、rgvlMAXLENGTH;/*第一个操作数7charargv2MAXLENGTH;charargv2MAXLENGTH;/*第二个操作数7charresultMAXLENGTH;/*运算结果*/JQUATERNION;voidIrparse(void);/*语法语义分析主函数*/#endif/*/*文件:semanteme.c*/*分析器的语法语义扫描部分*/*#includeglobals.h#includescan.h#includesemanteme.hQUATERNION*pQuad;/*存放四元组的元组*/intnSuffix,nNXQ,/*临时变量的编号*/ntc,nfc;ext

30、ernWorduWord;/*扫描得到的单词*/externintgnColumn,gnRow;/*行歹!J号*/FILE*fw;/*打印结果的文件指针*/char*strFileName;/*打印结果的文件名*/char*strSource;/*源程序*/char*Expression(void);char*Rrm(void);char*Factor(void);voidStatement_Block(int*nChain);voidLocateError(intnColumnJntnRow)/*定位语法错误*/(fprintf(fw,nCol:%dtRow:%d,nColumn+1,nRo

31、w);voiderror(char*strError)/*输出扫描发现的错误*/(LocateError(gnColumn,gnRow);fprintf(fw;%sJstrError);return;voidMatch(intsyn,char*strError)/*判断当前识别出的单词是否需要的单词,如果不是则报错,否则扫描下一个单词7if(syn=uWod.syn)Scaner();elseerror(strError);return;voidgen(char*op,char*argv1,char*argv2,char*result)/*生成一个四元式*/(sprintf(pQuadnNXQ

32、.op,op);sprintf(pQuadnNXQ.argv1,argv1);sprintf(pQuadnNXQ.argv2,argv2);sprintf(pQuadnNXQ.result,result);nNXQ+;return;voidPrintQuaternion(void)/*打印一个四元式*/(intnLoop;for(nLoop=1;nLoopnNXQ;nLoop+)(fprintf(fw,n%d:%s,t%s,t%s,nLoop,pQuadnLoop.op,pQuadnLoop.argv1,pQuadnLoop.argv2,pQuadnLoop.result);)char*New

33、temp(void)/*产生一个临时变量*/(char*strTemplD=(char*)malloc(MAXLENGTH);sprintf(strTemplD,T%d,+nSuffix);returnstrlempID;intmerg(intp1,intp2)/*合并p1和p2*/(intp,nResult;if(p2=0)nResult=p1;else(nResult=p=p2;while(atoi(pQuadp.result)(p=atoi(pQuadp.result);sprintf(pQuadp.result,%d,p1);)returnnResult;voidbp(intp,int

34、t)/*将t回填到以p为首的四元式链中7intw,q=p;while(q)(w=atoi(pQuadq.result);sprintf(pQuadq.result,%d,t);q=w;return;char*Expression(void)(charoppMAXLENGTH,*eplace,eplace1MAXLENGTH,eplace2MAXLENGTH;eplace=(char*)malloc(MAXLENGTH);strcpy(eplace1,Term();strcpy(eplace,eplace1);while(uWord.syn=_SYN_PLUS|uWord.syn=_SYN_MI

35、NUS)(/*+-7sprintf(opp,%c,uWord.value.T3);Scaner();strcpy(eplace2,7erm();strcpy(eplace,Newtemp();gen(opp,eplace1,eplace2,eplace);strcpy(eplace1,eplace);return;char*ferm(void)(charopp2,*eplace1,*eplace2,*eplace;eplace=eplace1=Factor();while(uWord.syn=_SYN_TIMES|uWord.syn=_SYN_DIVIDE)(/*/7sprintf(opp,%

36、c,uWord.value.T3);Scaner();eplace2=Factor();eplace=Newtemp();gen(opp,eplace1,eplace2,eplace);eplace1=eplace;returneplace;char*Factor(void)char*eplace=(char*)malloc(MAXLENGTH);if(uWord.syn=_SYNJD|uWord.syn=_SYN_NUM)(/*i7if(uWord.syn=_SYN_ID)sprintf(eplace,%s,uWord.value.T1);elsesprintf(eplace,%d,uWor

37、d.value.T2);Scaner();else(Match(_SYN_LPAREN,”(“);eplace=Expression();Match(_SYN_RPAREN,H)H);returneplace;voidCondition(int*etc,int*efc)(charopp3,*eplace1,*eplace2;charstrlemp4;eplacel=Expression();if(uWord.syn=_SYN_LG)(swich(uWord.syn)(case_SYN_LT:case_SYN_LG:sprintf(opp,%c,uWord.value.T3);break;def

38、ault:sprintf(opp,%s,uWord.value.T1);break;)Scaner();eplace2=Expression();*etc=nNXQ;*efc=nNXQ+1;sprintf(strTemp,j%sJopp);gen(strlemp,eplacel,eplace2,0);elseerror(”关系运算符,voidStatement(int*nChain)/*语句分析函数*/(charstrTempMAXLENGTH,eplaceMAXLENGTH;intnChainTemp,nWQUAD;switch(uWord.syn)(case_SYNJD:strcpy(st

39、rfemp,uWord.value.T1);Scaner();Match(_SYN_ASSIGN,”=”);Strcpy(eplace,Expression();Match(_SYN_SEMICOLON,n;);gen(”=,eplace,”,strRmp);*nChain=O;break;case_SYN_IF:Match(_SYN_IF,);Match(_SYN_LPAREN;();Condition(&ntc,&nfc);bp(ntc,nNXQ);Match(_SYN_RPAREN;);Statement_Block(&nChainTemp);*nChain=merg(nChainTem

40、p,nfc);break;case_SYN_WHILE:Match(_SYN_WHILE,while);nWQUAD=nNXQ;Match(_SYN_LPAREN;();Condition(&ntc,&nfc);bp(ntc,nNXQ);Match(_SYN_RPAREN;);Statement_Block(&nChainTemp);bp(nChainTemp,nWQUAD);sprintf(strTemp,”d”,nWQUAD);f”丄1-gen(”j”,”,”,strTemp);*nChain=nfc;break;return;voidStatement_Sequence(int*nCha

41、in)/*语句串分析函数*/(Statement(nChain);while(uWord.syn=_SYN_ID|uWord.syn=_SYN_IF|uWord.syn=_SYN_WHILE)(/*idifwhile*/bp(*nChain,nNXQ);Statement(nChain);bp(*nChain,nNXQ);return;voidStatement_Block(int*nChain)/*语句块分析函数*/(Match(_SYN_LEFTBRACKET2;();Statement_Sequence(nChain);Match(_SYN_RIGHTBRACKET2,H);voidPa

42、rse(void)(int*nChain;Scaner();Match(_SYN_MAIN,main);Match(_SYN_LPAREN;();Match(_SYN_RPAREN,)n);Statement_Block(&nChain);if(uWord.syn匸_SYN_END)fprintf(fw,A,源程序非正常结束!”);PrintQuaternion();voidIrparse(void)/*语法语义分析主函数*/(pQuad=(QUATERNION*)malloc(strlen(strSource)*sizeof(QUATERNION);nSuffix=O;nfc=ntc=nNXQ=1;fw=fopen(strFileName,w);Parse();fclose(fw);

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!