编译课设 2Word文档格式.docx
- 文档编号:19493588
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:13
- 大小:58.53KB
编译课设 2Word文档格式.docx
《编译课设 2Word文档格式.docx》由会员分享,可在线阅读,更多相关《编译课设 2Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
*字符串变红
*注释变绿
*关键字变蓝
**/
#include<
iostream>
string>
fstream>
usingnamespacestd;
#defineLENGTH63
//关键字列表,将c++中常用关键字存于数组KeyWord中
char*KeyWord[LENGTH]=
{"
asm"
"
default"
float"
operator"
static_cast"
union"
auto"
delete"
for"
private"
struct"
unsigned"
bool"
do"
friend"
protected"
switch"
using"
break"
double"
goto"
public"
template"
virtual"
case"
dynamic_cast"
if"
register"
this"
void"
catch"
else"
"
inline"
reinterpret_cast"
throw"
volatile"
char"
enum"
int"
return"
true"
wchar_t"
class"
"
explicit"
long"
short"
try"
while"
const"
export"
mutable"
signed"
typedef"
const_cast"
extern"
namespace"
sizeof"
typeid"
continue"
false"
new"
stat"
include"
define"
};
/*定义Red,Blue,Green变量用来在html文件中将文字内容显示成红色、蓝色和绿色*/
char*Red="
<
fontcolor=\"
red\"
>
;
char*Tail="
/font>
char*Blue="
blue\"
char*Green="
green\"
//////对照_ch是不是关键字
boolisKeyWord(char*_ch)
{
for(inti=0;
i<
LENGTH;
i++)
{
if(!
strcmp(_ch,KeyWord[i]))
returntrue;
}
returnfalse;
}
/*初始化源文件,如果初始化成功,复制文件到inDir,否则提示输入“请输入要转换的文件名,读入文件存于inDir。
*/
voidmain(intargc,char*argv[])
{
charinDir[30];
//初始化文件
try
{
strcpy(inDir,argv[1]);
catch(...)
cout<
请输入要转换的文件名:
cin>
inDir;
fstreamrfile;
//创建文件/rfile
fstreamwfile;
//创建文件wfile
rfile.open(inDir);
//将文件inDir写入到文件rfile中
strcat(inDir,"
.html"
//为文件inDir增加后缀.html
//利用fopen函数写功能将inDir文件内容写入到file1中
FILE*file1=fopen(inDir,"
wfile.open(inDir);
cout<
创建文件"
inDir<
endl;
//文件头
wfile<
html>
body>
fontface=\"
宋体\"
charstrWord[100]="
//读入字符的缓冲数组
charstrWrite[100]={0};
//写入文件的缓冲数组
charch;
intisEx=0;
//0为不注释1为行注释2为块注释
intisStr=0;
//0为正常1为字符串
/////////////////循环读出并处理文件///////////////
while(!
rfile.eof())
ch=rfile.get();
inti=0;
/*判断是否为关键字,若为关键字则用蓝色字体输出*/
if(ch>
='
a'
&
ch<
z'
||ch>
A'
Z'
)//如果首字母是字母,则
//读出整个单词
while(ch>
||ch=='
_'
)
{
strWord[i++]=ch;
ch=rfile.get();
}
rfile.seekg(-1,ios:
:
cur);
//退格
strWord[i]='
\0'
if(isKeyWord(strWord)&
isEx==0&
isStr==0)
wfile<
Blue<
strWord<
Tail;
//关键字加蓝色标签
else
strWord;
/*利用switch语句判别字符串和注释*/
elseswitch(ch)
case'
#'
{
if(isEx==0&
isStr==0&
ch>
#"
//#加蓝色标签
elsewfile<
break;
}
case'
\"
'
//判断字符串
{
rfile.seekg(-2,ios:
if(rfile.get()!
\\'
isEx==0)//判断是不是转义后的
if(isStr==0)
{
isStr=1;
wfile<
Red;
//字符串加红色标签
}
else
{
isStr=0;
Tail<
//结束字符串闭合标签
else
wfile<
rfile.get();
}
'
nbsp"
break;
//加空格标签
\n'
{if(isEx==1)
{
isEx=0;
}
wfile<
br>
\n"
break;
//加换行标签<
:
lt"
break;
//加<
gt"
//>
/'
{//判断注释
ch=rfile.get();
if(ch=='
isStr==0)//行注释
{
isEx=1;
Green<
//"
//注释加绿标签
break;
elseif(ch=='
*'
isStr==0)//块注释
isEx=2;
/*"
/"
rfile.seekg(-1,ios:
//回退一个字符
if(ch=='
isEx==2&
isStr==0)//块注释结尾
isEx=0;
*/<
//闭合标签
*"
rfile.seekg(-1,ios:
default:
wfile<
ch;
//文件尾
/body>
/html>
cout<
完成转换!
!
5.程序运行结果
编写cpp文件,并以wd.cpp保存
执行程序,输出html文件,运行结果如下:
可以看出关键字用蓝色显示,字符串用红色显示,注释用绿色显示。
满足题目要求。
6.测试报告
编写cpp文件用于测试,文件名为wd.cpp
执行程序,提示输入要转换的文件名,输入wd.cpp并按回车键,程序显示创建文件wd.cpp.html完成转换。
打开wd.cpp.html,可以看到它的内容即是wd.cpp文件的语法高亮显示。
测试过程如下图所示:
ccc.cpp.html文件用html语言表示为:
<
fontface="
宋体"
fontcolor="
blue"
#<
include<
nbsp&
ltiostream.h&
gt&
nbsp<
green"
//包含CIN,COUT&
nbsp头文件<
class&
nbsptest&
//定义一个类<
{<
public<
test();
~test(){};
private<
int<
nbspi;
test:
test()&
//定义类中的构造函数<
i=25;
cout&
lt&
red"
nbsphere&
nbspis&
nbspthe&
nbspprogram&
nbspoutput.\n<
nbsp;
nbsplet&
nbspus&
nbspgenerate&
nbspsome&
nbspstuff...\n<
for<
(<
nbspctr=0;
ctr&
lt10;
ctr++)<
{<
cout&
nbspcounting&
nbspat<
ltctr&
nbsp\n<
}<
}<
test&
nbspanobject;
//生成一个类对象<
main()<
return<
nbsp0;
}<
经测试,程序满足设计要求,能完成指定功能,测试成功!
7.存在问题及分析
字符分类问题
很显然,本设计的实现关键就是字符的分类问题。
好的分类为他们的高亮显示提供了一个前提条件,让他们的功能既不会因为分类不具体而冲突也不会因为分得太细而使得某些功能没有实现,这使得了本设计的实现成为了可能,做好分类问题就相当于成功了一半。
但是由于时间有限和本人水平有限,还不是特别细致,在以后的设计中应该再逐步完善。
转换为html文件的问题
html语句和c++语句不同,必须是闭合的语句。
在输出一段文字后必须加上"
才能完成相应的功能。
所以在输出时候应特别注意,每句末尾要加上"
。
html语言中的一些符号的表示和c++不同,输出时候应注意转换为heml语言中的符号。
转义字符
应注意区别注释和字符串中的转义字符。
转义字符需要加上/,此时应该区别转义字符和注释,否则会引起错误,误将本应该按普通字符输出的转义字符按照字符串或者注释输出,引起错误。
8.总结及体会
通过这次的编译原理课程设计,使我明白只有把知识运用到实践中,才能真正把握知识。
程序设计是在将课本知识融会贯通的基础上,灵活运用,才能设计出符合要求的程序。
设计中需要不断思考,发现问题,解决问题,不断完善程序,设计出最好的程序。
对于本设计,要求设计一个简单的编译器以实现C++源文件在向HTML文件转换的过程中的关键字高亮显示的功能。
对于设计者来说,虽然题目不是那么复杂,但是要是将课本所学的知识转化成相应的实际应用软件却不是一件很容易的事情。
本设计的设计思想相对简单,只需将关键字、字符串、注释符等分类,然后通过识别不同类型的字符串,用相应的颜色显示即可。
但是,如何声明判别,怎样分类,却实在让设计者头痛。
经过不断的探讨,我终于成功完成了本次任务。
编译原理不同于一般集成环境的设计语言,它具有很强的抽象性。
这就要求我们在设计过程中要真正理解编译器是如何构造,如何实现功能的,而这相对普通程序设计语言在难度和抽象程度上有了很大的提升。
当然这也能使我们对程序设计语言的设计和实现由更深刻的理解。
对和程序设计语言相关的理论知识有了更深层次的了解。
编译原理是一门深奥的学科,从课堂上我们学到的并非知识的全部,课程设计为我们提供了一次自我学习的机会。
通过查找资料,我发现课本上的知识还不够深入,要想真正掌握这门课程,还应该多涉猎一些与之有关的其他方面的书籍,这样才能在拓展知识面的同时提高自己的能力。
在不断的学习过程中,我认识到编译原理作为一门计算机专业的基础课程,不是单独存在的,它和其它的课程有着紧密的联系。
所以在学习编译原理的同时,我们还应该注意他和其它课程的结合的地方,多涉猎相关知识,这样才能真正学好这门课程。
这次的课程设计不仅锻炼了我们的动手和动脑的能力,更让我体会到了理论与实践相联合的重要行,理论并不等于实践,光有理论是绝对不行的,但是在实践的过程中我们必须以理论为根据,才能在这一个层次上更好的把理论应用到实践中去,这次的课设使我真正的懂得了理论只是实践的基础,只有进一步的实践才能更好的运用理论。
所以在以后的学习和生活中都会好好的把理论和实践相结合才能达到真的懂一个问题。
程序设计应力求新颖,所以今后还应该不断提高创新意识与能力,不能拘泥于一种设计方案,争取设计出最。
参考文献
[1]李建中姜守旭,《编译原理》,机械工业出版社
[2]陈意云张昱,《编译原理》,高等教育出版社
[3]王雷刘志成周晶,《编译原理课程设计》,机械工业出版社
附录:
测试文件:
iostream.h>
//包含CIN,COUT头文件
classtest//定义一个类
public:
private:
inti;
test()//定义类中的构造函数
hereistheprogramoutput.\n"
letusgeneratesomestuff...\n"
for(intctr=0;
ctr<
10;
ctr++)
countingat"
testanobject;
//生成一个类对象
main()
return0;
评语
评阅人:
日期:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译课设 编译