西安交大编译原理实验词法分析器文档以及代码最后.docx

上传人:b****4 文档编号:5462738 上传时间:2022-12-16 格式:DOCX 页数:16 大小:119.80KB
下载 相关 举报
西安交大编译原理实验词法分析器文档以及代码最后.docx_第1页
第1页 / 共16页
西安交大编译原理实验词法分析器文档以及代码最后.docx_第2页
第2页 / 共16页
西安交大编译原理实验词法分析器文档以及代码最后.docx_第3页
第3页 / 共16页
西安交大编译原理实验词法分析器文档以及代码最后.docx_第4页
第4页 / 共16页
西安交大编译原理实验词法分析器文档以及代码最后.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

西安交大编译原理实验词法分析器文档以及代码最后.docx

《西安交大编译原理实验词法分析器文档以及代码最后.docx》由会员分享,可在线阅读,更多相关《西安交大编译原理实验词法分析器文档以及代码最后.docx(16页珍藏版)》请在冰豆网上搜索。

西安交大编译原理实验词法分析器文档以及代码最后.docx

西安交大编译原理实验词法分析器文档以及代码最后

实验一:

词法分析器

一、实验目的:

1.强化对系统软件综合工程实现能力的训练;

2.加强对词法分析原理、方法和基本实现技术的理解;

二、实验内容:

用C语言或者其他的高级语言作为宿主语言完成C1语言的词法分析器的设计和实现。

三、实验要求:

1.编写C0语言的词法分析器的源程序并调试通过。

其中词法分析程序既可以自己手动去完成,也可以利用LEX自动生成。

2.通过测试程序的验收;

3.实验报告按照提供的模板填写:

(1)功能描述:

该程序具有什么功能?

(2)程序结构描述:

函数调用格式、参数含义、返回值描述、函数功能;另外可以附加函数之间的调用关系图、程序总体执行流程图。

(3)实验总结:

你在编程过程中花时多少?

多少时间在纸上设计?

多少时间上机输入和调试?

多少时间在思考问题?

遇到了哪些难题?

你是怎么克服的?

你对你的程序的评价?

你的收获有哪些?

四、评判标准:

1.输出正确的实验结果;

2.代码清晰,格式良好;

3.提交报告,报告阐述清楚。

五、程序工作说明:

(以C0语言为例)

程序的输入文件是任何一个目录下的文件格式的C0语言程序段。

程序的输出文件是以xml格式表示的词法分析的结果。

该输出将作为下个实验语法分析的输入文件。

(注意:

也可以自定义格式,但需要在报告中给出格式说明)

词法分析结果输出成xml文件格式为

程序输入/输出示例:

如源程序为如下:

1.voidf1(inta,intb){

2.a=1;

3.b=a+b;

4.}

5.voidmain()

6.{

7.inta[100];

8.intb;

9.floatc;

10.a[b]=a;

11.if(c

12.f1(a,b);

13.}

14.}

则要求得到如下输出文件:

xmlversion="1.0"?

>

六、相关知识:

词法分析器任务:

输入源程序;扫描、分解字符串,识别出一个个单词(定义符、标识符、运算符、界符、常数)。

单词符号的表示:

1)需要对单词分类,每一个识别出来的单词都属于不同的类型

publicenumTokenType

{

//关键字

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

//运算符+-*/=<<=>>=!

=…

PLUS,MINUS,STAR,SLASH,LT,LTEQ,GT,GTEQ,EQ,NEQ,ASSIGN,

//界符;,()[]{}/**/

SEMI,COMMA,LPAREN,RPAREN,LSQUAR,RSQUAR,LBRACE,RBRACE,

LCOMMENT,RCOMMENT,

ID,//标识符

NUMBER,//数字常量

『ID→letter(letter|didit)*

      NUMBER→digitdigit*

        letter→a|b|…|z|A|B|…|Z

        digit→0|…|9』

NONTOKEN,ERROR,ENDFILE//其它

};

2)单词符号的数据结构设计

publicclassToken

{

stringstr;//单词字符串

TokenTypettype;//单词的类型

intline;//所在行号信息

}

3)词法分析状态转换图

运行结果:

程序代码:

#include

#include

#include

#include

usingnamespacestd;

stringjudge1(chara[],intn)

{

stringstr;

str.assign(a,n);

if(!

pare("if"))

return"IF";

elseif(!

pare("else"))

return"ELSE";

elseif(!

pare("while"))

return"WHILE";

elseif(!

pare("return"))

return"RETURN";

elseif(!

pare("void"))

return"VOID";

elseif(!

pare("int"))

return"INT";

elseif(!

pare("float"))

return"FLOAT";

elseif(!

pare("char"))

return"CHAR";

return"";

}

stringjudge2(chara[],intn)

{

stringstr;

str.assign(a,n);

if(!

pare("+"))

return"PLUS";

elseif(!

pare("-"))

return"MINUS";

elseif(!

pare("*"))

return"STAR";

elseif(!

pare("/"))

return"SLASH";

elseif(!

pare("="))

return"EQ";

elseif(!

pare("<"))

return"LT";

elseif(!

pare("<="))

return"LTEQ";

elseif(!

pare(">"))

return"GT";

elseif(!

pare(">="))

return"GTEQ";

elseif(!

pare("!

="))

return"NEQ";

elseif(!

pare("=="))

return"DEQ";

elseif(!

pare("…"))

return"ASSIGN";

elseif(!

pare(";"))

return"SEMI";

elseif(!

pare(","))

return"COMMA";

elseif(!

pare("("))

return"LPAREN";

elseif(!

pare(")"))

return"RPAREN";

elseif(!

pare("["))

return"LSQUAR";

elseif(!

pare("]"))

return"RSQUAR";

elseif(!

pare("{"))

return"LBRACE";

elseif(!

pare("}"))

return"RBRACE";

elseif(!

pare("/*"))

return"LCOMMENT";

elseif(!

pare("*/"))

return"RCOMMENT";

return"";

}

voidprint(chara[],intn,intsign,intlin)

{

stringTokenType;

cout<<"

if(sign==1)

{

TokenType=judge1(a,n);

if(TokenType=="")

TokenType="ID";

cout<

for(inti=0;i

cout<

cout<<"\"/>"<

}

elseif(sign==2)

{

TokenType="NUMBER";

cout<

for(inti=0;i

cout<

cout<<"\"/>"<

}

elseif(sign==3)

{

TokenType=judge2(a,n);

if(TokenType=="")

{system("cls");cout<<"somesignerroroccurred!

Online:

"<

cout<

for(inti=0;i

cout<

cout<<"\"/>"<

}

}

 

intmain()

{

intlin=0,sign,t=0;

char*check,word[100];

charcontent[100];

fstreamout;

out.open("file1.txt",ios:

:

in);

cout<<"

xmlversion=\"1.0\"?

>"<

cout<<""<

while(!

out.eof())

{

lin++;

out.getline(content,100,'\n');

sign=0;

check=content;

while

(1)

{

if(sign==0)

{

if((*check>='a'&&*check<='z')||(*check>='A'&&*check<='Z'))

{

sign=1;

word[t]=*check;

t++;

}

elseif((*check>='0'&&*check<='9'))

{

sign=2;

word[t]=*check;

t++;

}

elseif(*check=='+'||*check=='-'||*check=='*'||*check=='/'||*check=='>'||*check=='<'||*check=='='||*check=='!

'||*check==';'||*check==','||*check=='('||*check==')'||*check=='['||*check==']'||*check=='{'||*check=='}'||*check=='…')

{

sign=3;

word[t]=*check;

t++;

}

}

elseif(sign==1)

{

if((*check>='a'&&*check<='z')||(*check>='A'&&*check<='Z')||(*check>='0'&&*check<='9'))

{

word[t]=*check;

t++;

}

elseif(*check=='+'||*check=='-'||*check=='*'||*check=='/'||*check=='>'||*check=='<'||*check=='='||*check=='!

'||*check==';'||*check==','||*check=='('||*check==')'||*check=='['||*check==']'||*check=='{'||*check=='}'||*check=='…')

{

print(word,t,sign,lin);

t=0;

word[t]=*check;

t++;

sign=3;

}

elseif(*check=='')

{

print(word,t,sign,lin);

t=0;

sign=0;

}

}

elseif(sign==2)

{

if((*check>='a'&&*check<='z')||(*check>='A'&&*check<='Z'))

{

cout<<"variableerroroccurred!

online"<

return0;

}

elseif(*check>='0'&&*check<='9')

{

word[t]=*check;

t++;

}

elseif(*check=='+'||*check=='-'||*check=='*'||*check=='/'||*check=='>'||*check=='<'||*check=='='||*check=='!

'||*check==';'||*check==','||*check=='('||*check==')'||*check=='['||*check==']'||*check=='{'||*check=='}'||*check=='…')

{

print(word,t,sign,lin);

t=0;

word[t]=*check;

t++;

sign=3;

}

elseif(*check=='')

{

print(word,t,sign,lin);

t=0;

sign=0;

}

}

elseif(sign==3)

{

if((*check>='a'&&*check<='z')||(*check>='A'&&*check<='Z'))

{

print(word,t,sign,lin);

t=0;

word[t]=*check;

t++;

sign=1;

}

elseif(*check>='0'&&*check<='9')

{

print(word,t,sign,lin);

t=0;

word[t]=*check;

t++;

sign=2;

}

elseif(*check=='*'||*check=='/'||*check=='!

'||*check=='=')

{

word[t]=*check;

t++;

}

elseif(*check=='+'||*check=='-'||*check==';'||*check==','||*check=='('||*check==')'||*check=='['||*check==']'||*check=='{'||*check=='}'||*check=='…'||*check=='>'||*check=='<')

{

print(word,t,sign,lin);

t=0;

word[t]=*check;

t++;

}

elseif(*check=='')

{

print(word,t,sign,lin);

t=0;

sign=0;

}

}

if(*check=='\n'||*check=='\0')

{

if(t>0)

{

print(word,t,sign,lin);

t=0;

sign=0;

}

break;

}

check++;

}

}

out.close();

cout<<""<

cin.get();

return0;

}

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

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1