C-Minus词法分析四川大学 编译原理_第1页
C-Minus词法分析四川大学 编译原理_第2页
C-Minus词法分析四川大学 编译原理_第3页
C-Minus词法分析四川大学 编译原理_第4页
C-Minus词法分析四川大学 编译原理_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

四川大学计算机学院,软件学院实验报告学名:专家:课程名称编译原理课程设计实验课时间4实验项目具有手动结构c-语言的词法分析器实验时间实验的目的、意义1 .熟悉c-语言的词法特征,构建c-具有的DFA2 .设计数据类型、数据结构3 .通过完成词法分析程序,加强词法分析知识语言特点正则表达式注释:/*注释*/关键字: if else int return void while专用符号:- */=!=、 () ID=letterNUM=digitletter=a-z,A-Zdigit=0-9DFA数据类型数据结构设计/定义数据类型TokenTypetypedef enum结束文件,ERROR,PS,PS,PS,返回,PS,PR,WHILE身份证,数字指定,EQ,LT,LE,GT,GE,NEQ,PLUS,TIMES,OVER,LPARENRPAREN,LBRACKET,RBRACKET,LBRACE,RBRACE,COMMA,SEMI TokenType;/状态类型的定义typedef enum 开始,l缓冲器,r缓冲器,注释,编号,INID,INEQ,INLE,INGE,innq,done 状态类型;/结构定义静态结构 char *str;TokenType tok;保留的words= if ,IF,ELSE ,else ,INT,return ,RETURN,void ,VOID,while ,WHILE;DFA码映射方法双层盒实现编码映射,外层盒关注状态转换,内层盒关注输入字符。外层CASE有12种状态:开始、l缓冲器、r缓冲器、注释、编号、INID、INEQ、INLE、INGE、innq、DONE和default内层CASE判断由getNextChar ()获取的下一个字符将当前状态转换到其他状态。键码分析TokenType getToken(void )装模作样int tokenStringIndex=0;TokenType currentToken;StateType state=START;int save; 是否保存到tokenStringwhile(state!=DONE )装模作样int c=getNextChar ();save=TRUE;开关(state )装模作样case START:;if(isdigit(c ) )state=INNUM;else if(isalpha(c ) )state=INID;else if(c=) | (c=t) | (c=n ) )保存=假;else if(c=)state=INEQ;else if(c=)state=INLE;else if(c=)state=INGE;PS S (c=! 中所述情节,对概念设计中的量体体积进行分析state=INNEQ;else if(c=/)状态=l缓冲器;else装模作样state=DONE;交换机(c )装模作样case EOF:保存=假;currentToken=ENDFILE;break;case :目前令牌=plus;break;case -:战斗机currenttoken=共享break;case *:当前令牌=times;break;case (: )当前令牌=LP aren;break;case ):当前令牌=RP aren;break;case :currentToken=LBRACKET;break;case :currentToken=RBRACKET;break;case :当前令牌=lb race;break;case :当前令牌=r brace;break;case :当前令牌=semi;break;case,currentToken=COMMA;break;default:当前令牌=错误;break;以下称为以下称为break;以下称为case LBUFFER: 灬.if(c=* )装模作样tokenStringIndex=0;保存=假;state=INCOMMENT以下称为else if(c=EOF )装模作样state=DONE;currentToken=ENDFILE;以下称为else装模作样目前令牌=over;state=DONE;以下称为break;以下称为case INCOMMENT:保存=假;if(c=* )状态=r缓冲器;else if(c=EOF )装模作样state=DONE;currentToken=ENDFILE;以下称为break;以下称为case RBUFFER:保存=假;if(c=/)state=START;else if(c=* )灬else if(c=EOF )装模作样state=DONE;当前文件=结束文件;以下称为elsestate=INCOMMENTbreak;以下称为case INNUM: 灬.if! isdigit(c ) )装模作样ungetNextChar ();save=FALSE;state=DONE;当前令牌=num;以下称为break;以下称为case INID: 灬.PK (! isalpha(c ) )装模作样ungetNextChar ();保存=假;state=DONE;目前令牌=id;以下称为break;以下称为case INEQ:;if(c=)装模作样state=DONE;目前令牌=eq;以下称为else装模作样ungetNextChar ();保存=假;state=DONE;目前令牌=assign;以下称为break;以下称为case INLE:if(c=)装模作样state=DONE;目前令牌=le;以下称为else装模作样ungetNextChar ();保存=假;state=DONE;当前令牌=lt;以下称为break;以下称为case INGE: 灬.if(c=)装模作样state=DONE;currentToken=GE;以下称为else装模作样ungetNextChar ();save=FALSE;state=DONE;currentToken=GT;以下称为break;以下称为case INNEQ:;if(c=)装模作样state=DONE;目前令牌=neq;以下称为else装模作样ungetNextChar ();保存=假;state=DONE;currentToken=ERROR;以下称为break;以下称为case DONE:break;以下称为default:fprintf (列表, scannerbug:state=%dn ,state );state=DONE;currentToken=ERROR;break;以下称为以下称为if (save ) (tokenstrigindex=maxtokenlen ) )tokenstring tokenstrigindex =(char ) c;if(state=DONE )装模作样tokenstring tokenstrigindex =0;if (当前令牌=id )current token=reserved lookup (tokenstring )以下称为以下称为把PS (跟踪扫描) fprintf(listing,t360 ,lineno );打印令牌(current token,tokenString )以下称为返回当前令牌;以下称为实验结果的截图。总结字句分析程序的输出和输入:字句分析程序的功能是读入源程序,输出单词符号。 单词符号是编程语言的正文法符号,编程语言的单词符号一般是关键字、符号、常数、运算符、定界符、单词的输出为二项式的形式,知道二项式的表现方法,将得到的二项式写入输出文件。实验注意事项:1 .在实验中设计注释部分的分析时,c-具有的注释由4个字符构成,因此在设计DFA时,在为了判断状态迁移而

温馨提示

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

评论

0/150

提交评论