CMinus词法分析报告四川大学编译原理.docx

上传人:b****7 文档编号:16269189 上传时间:2023-07-12 格式:DOCX 页数:14 大小:100.44KB
下载 相关 举报
CMinus词法分析报告四川大学编译原理.docx_第1页
第1页 / 共14页
CMinus词法分析报告四川大学编译原理.docx_第2页
第2页 / 共14页
CMinus词法分析报告四川大学编译原理.docx_第3页
第3页 / 共14页
CMinus词法分析报告四川大学编译原理.docx_第4页
第4页 / 共14页
CMinus词法分析报告四川大学编译原理.docx_第5页
第5页 / 共14页
CMinus词法分析报告四川大学编译原理.docx_第6页
第6页 / 共14页
CMinus词法分析报告四川大学编译原理.docx_第7页
第7页 / 共14页
CMinus词法分析报告四川大学编译原理.docx_第8页
第8页 / 共14页
CMinus词法分析报告四川大学编译原理.docx_第9页
第9页 / 共14页
CMinus词法分析报告四川大学编译原理.docx_第10页
第10页 / 共14页
CMinus词法分析报告四川大学编译原理.docx_第11页
第11页 / 共14页
CMinus词法分析报告四川大学编译原理.docx_第12页
第12页 / 共14页
CMinus词法分析报告四川大学编译原理.docx_第13页
第13页 / 共14页
CMinus词法分析报告四川大学编译原理.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

CMinus词法分析报告四川大学编译原理.docx

《CMinus词法分析报告四川大学编译原理.docx》由会员分享,可在线阅读,更多相关《CMinus词法分析报告四川大学编译原理.docx(14页珍藏版)》请在冰点文库上搜索。

CMinus词法分析报告四川大学编译原理.docx

CMinus词法分析报告四川大学编译原理

四川大学计算机学院、软件学院

实验报告

学号姓名:

专业:

课程名称

编译原理课程设计

实验课时

4

实验项目

手工构造C-Minus语言的词法分析器

实验时间

实验目的、意义

1.熟悉C-Minus语言的词法特点,构造C-Minus的DFA;

2.设计数据类型、数据结构

3.通过完成词法分析程序,巩固词法分析知识

语言特点

正则表达式

注释:

/*注释*/

关键字:

ifelseintreturnvoidwhile

专用符号:

+-*/<<=>>===!

==;,[](){}

ID=letter+

NUM=digit+

letter=[a-z,A-Z]

digit=[0-9]

DFA

数据类型

数据结构设计

//定义数据类型TokenType

typedefenum

{ENDFILE,ERROR,

IF,ELSE,INT,RETURN,VOID,WHILE,

ID,NUM,

ASSIGN,EQ,LT,LE,GT,GE,NEQ,PLUS,MINUS,TIMES,OVER,LPAREN,

RPAREN,LBRACKET,RBRACKET,LBRACE,RBRACE,COMMA,SEMI

}TokenType;

//定义状态类型

typedefenum{START,LBUFFER,RBUFFER,INCOMMENT,INNUM,INID,INEQ,INLE,INGE,INNEQ,DONE}StateType;

//结构定义

staticstruct

{char*str;

TokenTypetok;

}reservedWords[MAXRESERVED]={{"if",IF},{"else",ELSE},{"int",INT},{"return",RETURN},{"void",VOID},{"while",WHILE}};

DFA代码映射方法

双层CASE实现代码映射,外层CASE关注状态变换,内层CASE关注输入字符。

外层CASE一共有12个状态:

START,LBUFFER,RBUFFER,INCOMMENT,INNUM,INID,INEQ,INLE,INGE,INNEQ,DONE,default;

内层CASE判断getNextChar()获取的下一个字符使当前状态转换为其他状态。

关键代码分析

TokenTypegetToken(void)

{

inttokenStringIndex=0;

TokenTypecurrentToken;

StateTypestate=START;

intsave;//是否保存到tokenString

while(state!

=DONE)

{

intc=getNextChar();

save=TRUE;

switch(state)

{

caseSTART:

{

if(isdigit(c))

state=INNUM;

elseif(isalpha(c))

state=INID;

elseif((c=='')||(c=='\t')||(c=='\n'))

save=FALSE;

elseif(c=='=')

state=INEQ;

elseif(c=='<')

state=INLE;

elseif(c=='>')

state=INGE;

elseif(c=='!

')

state=INNEQ;

elseif(c=='/')

state=LBUFFER;

else

{

state=DONE;

switch(c)

{

caseEOF:

save=FALSE;

currentToken=ENDFILE;

break;

case'+':

currentToken=PLUS;

break;

case'-':

currentToken=MINUS;

break;

case'*':

currentToken=TIMES;

break;

case'(':

currentToken=LPAREN;

break;

case')':

currentToken=RPAREN;

break;

case'[':

currentToken=LBRACKET;

break;

case']':

currentToken=RBRACKET;

break;

case'{':

currentToken=LBRACE;

break;

case'}':

currentToken=RBRACE;

break;

case';':

currentToken=SEMI;

break;

case',':

currentToken=COMMA;

break;

default:

currentToken=ERROR;

break;

}

}

break;

}

caseLBUFFER:

{

if(c=='*')

{

tokenStringIndex=0;

save=FALSE;

state=INCOMMENT;

}

elseif(c==EOF)

{

state=DONE;

currentToken=ENDFILE;

}

else

{

currentToken=OVER;

state=DONE;

}

break;

}

caseINCOMMENT:

{

save=FALSE;

if(c=='*')

state=RBUFFER;

elseif(c==EOF)

{

state=DONE;

currentToken=ENDFILE;

}

break;

}

caseRBUFFER:

{

save=FALSE;

if(c=='/')

state=START;

elseif(c=='*')

;

elseif(c==EOF)

{

state=DONE;

currentToken=ENDFILE;

}

else

state=INCOMMENT;

break;

}

caseINNUM:

{

if(!

isdigit(c))

{

ungetNextChar();

save=FALSE;

state=DONE;

currentToken=NUM;

}

break;

}

caseINID:

{

if(!

isalpha(c))

{

ungetNextChar();

save=FALSE;

state=DONE;

currentToken=ID;

}

break;

}

caseINEQ:

{

if(c=='=')

{

state=DONE;

currentToken=EQ;

}

else

{

ungetNextChar();

save=FALSE;

state=DONE;

currentToken=ASSIGN;

}

break;

}

caseINLE:

{

if(c=='=')

{

state=DONE;

currentToken=LE;

}

else

{

ungetNextChar();

save=FALSE;

state=DONE;

currentToken=LT;

}

break;

}

caseINGE:

{

if(c=='=')

{

state=DONE;

currentToken=GE;

}

else

{

ungetNextChar();

save=FALSE;

state=DONE;

currentToken=GT;

}

break;

}

caseINNEQ:

{

if(c=='=')

{

state=DONE;

currentToken=NEQ;

}

else

{

ungetNextChar();

save=FALSE;

state=DONE;

currentToken=ERROR;

}

break;

}

caseDONE:

{

break;

}

default:

{

fprintf(listing,"ScannerBug:

state=%d\n",state);

state=DONE;

currentToken=ERROR;

break;

}

}

if((save)&&(tokenStringIndex<=MAXTOKENLEN))

tokenString[tokenStringIndex++]=(char)c;

if(state==DONE)

{

tokenString[tokenStringIndex]='\0';

if(currentToken==ID)

currentToken=reservedLookup(tokenString);

}

}

if(TraceScan){

fprintf(listing,"\t%d:

",lineno);

printToken(currentToken,tokenString);

}

returncurrentToken;

}

实验结果截图

总结

词法分析程序的输出和输入:

词法分析程序的功能是读入源程序,输出单词符号。

单词符号是程序设计语言的本语法符号,程序设计语言的单词符号一般分为如下几种:

关键字,标示符,常数,运算符,界符,单词的输出是二元式的形式,需要知道二元式的表示方法,把得到的二元式写入输出文件。

实验注意事项:

1.试验中在设计注释部分的解析时,因为C-Minus的注释符是四个字符组成,设计DFA时设计了两个中间态,用来判断状态转换;在代码中,如果由中间态转换为INCOMMENT状态,注意字符回退和save置false

2.在判断运算符<,<=,>,>=,!

=时,第二字符是’=’可成功识别出运算符,第二字符是其他字符时也可能是合法符号,注意字符回退与token判断。

参考资料:

《编译原理及实践/编译器设计方案》

指导老师

评议

 

成绩评定:

指导教师签名:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2