编译原理课程设计心得体会
经过一个星期的编译原理课程设计,本人在刘贞老师的指导下,顺利完成该课程设计。通过该课程设计,收获颇多。
一、对实验原理有更深的理解
通过该课程设计,掌握了什么是编译程序,编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程、构造工具及其相关的技术对课本上的知识有了更深的理解,课本上的知识师机械的,表面的。通过把该算法的内容,算法的执行顺序在计算机上实现,把原来以为很深奥的书本知识变的更为简单,对实验原理有更深的理解。
二、对该理论在实践中的应用有深刻的理解
通过把该算法的内容,算法的执行顺序在计算机上实现,知道和理解了该理论在计算机中是怎样执行的,对该理论在实践中的应用有深刻的理解。
三、激发了学习的积极性
通过该课程设计,全面系统的理解了编译原理程序构造的一般原理和基本实现方法。把死板的课本知识变得生动有趣,激发了学习的积极性。把学过的计算机编译原理的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。以前对与计算机操
作系统的认识是模糊的,概念上的,现在通过自己动手做实验,从实践上认识了操作系统是如何处理命令的,如何协调计算机内部各个部件运行,对计算机编译原理的认识更加深刻。课程设计中程序比较复杂,在调试时应该仔细,在程序调试时,注意指针,将不必要的命令去除。
在这次课程设计中,我就是按照实验指导的思想来完成。加深了理解文件系统的内部功能及内部实现,培养实践动手能力和程序开发能力的目的。
四、理解了该知识点以及学科之间的融合渗透
本次课程设计程序部分是用c语言编写的,把《计算机操作系统》,《编译原理》,《算法分析与设计》《c语言》四门学科联系起来,把各个学科之间的知识融合起来,把各门课程的知识联系起来,对计算机整体的认识更加深刻。使我加深了对《计算机操作系统》,《编译原理》,《算法分析与设计》《c语言》四门课程的认识。
第二篇:编译原理课程设计课设报告
1. 课程设计题目名称:语法高亮转换软件
2. 课程设计任务目的与任务 目 的: ·通过此次课程设计更深一步了解此法分析
·培养解决工程问题的能力,例如方案的制定
·了解设计和实现一个实际高级语言编译器所面临的各种问题及其复杂程度。 主要任务: 输入:cpp源代码文件,后缀为.cpp的文件;输出:网页文件,后缀为.html
文件;实现功能:将cpp源代码转换成网页文件,在浏览器中打开网页文件时,
网页中显示C++源代码并以高亮语法表示显示。
3. 设计思想和实现方法
设计思想:词法分析程序完成从输入文件中读取字符形式的高级语言源程序,并把输入
转化为一个由单词符号组成的流。构造词法分析器的一种简单办法是用状态
转化图来描述源语言词法记号流,然后手工把这种状态转换图翻译成为识别
记号的程序。用这种方法可以产生高效的词法分析器。
实现方法:用C++语言编写一个词法分析器,使之能识别输入串,并把分析结果(单词符号,
标识符,关键字等等)输出.输入源程序,输入单词符号,本词法分析器可以辨别
关键字,标识符,常数,运算符号和某些界符,运用了文件读入来获取源程序代
码,再对该源程序代码进行词法分析,这就是词法分析器的基本功能.当词法分
析器调用预处理子程序处理出一串输入字符放进扫描缓冲区之后,分析器就
从此缓冲区中逐一识别单词符号.当缓冲区里的字符串被处理完之后,它又调
用预处理子程序来处理新串.
4. 程序说明:
程序一开始要求读入一个代码文件,接着把读入的源程序打印出来.然后进行词法分析,程序定义两个数组keyword[60]和cha[31],前者用来存放关键字,后者用来存放中断字符。从文件中读入字符,与cha[31]中的中断字符相比较。判断读入的是否为中断字符,如果不是继续读入字符;如果是中断字符,将前面读入的字符放入到一个字符串当中,
将此字符串与keyword[60]中存放的关键字比较,如是关键字则做相应处理即着色;如果不是关键字不作处理。
程序流程图:
5. 程序运行结果
example.cpp文件中的内容:// example.cpp
#include <iostream>
#define pi 3.1415
using namespace std;
int main()
{
int n = 0;
float a = 12.34;
char ch = 'a';
cout << "hello C++ ";
for (int i = 0; i < 10; i++) a = n + ch;
}
return 0;
运行程序 :
查看wyl.html中的显示内容:
6. 测试报告:
为了更好的检查程序最终输出是否正确,可以用记事本打开wyl.html查看代码。
wyl.html代码如下:
7. 存在问题及分析:
刚开始编写程序时,编写程序不知道如何从一个文件中读入字符,如何将一个字符串直接输出到文件当中。这主要是对C++语言中的一些函数不了解造成的。
在设计如何过滤中断字符和判断是否为关键字时,出现了迷茫,不知道该如何操作。这主要是算法不成熟导致的,没有正确的算法就不可能设计出正确的。要想设计出一个好的程序首先要有一个好的思想然后将这个思想转化为正确的算法,根据算法编写程序。
虽然最终程序写出来了也完成了课程设计的要求,但是编写的程序还是存在一些不足。首先,程序并没有把C++中所有的关键子都添加进去,只是添加了一些最常用的。其次,由于自己编程能力有限所编的程序执行效率有点低。
8. 总结及体会:
经过一个星期的编译原理课程设计,本人在单老师的指导下,顺利完成该课程设计.通过该课程设计,收获颇多。
一、 对实验原理有更深的理解
通过该课程设计,掌握了什么是编译程序,编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程,对课本上的知识有了更深的理解,课本上的知识是机械的,表面的.通过把该算法的内容,算法的执行顺序在计算机上实现,把原来以为很深奥的书本知识变的更为简单,对实验原理有更深的理解.
二、对该理论在实践中的应用有深刻的理解
通过把该算法的内容,算法的执行顺序在计算机上实现,知道和理解了该理论在计算机中是怎样执行的, 对该理论在实践中的应用有深刻的理解 .
三、激发了学习的积极性
通过该课程设计,全面系统的理解了编译原理程序构造的一般原理和基本实现方法.把死板的课本知识变得生动有趣,激发了学习的积极性.把学过的计算机编译原理的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解.以前认识是模糊的,概念上的,现在通过自己动手做实验,从实践上认识了知识的运用,对计算机编译原理的认识更加深刻.课程设计中程序比较复杂,在调试时应该仔细,在程序调试时,注意命令的正确性.,培养实践动手能力和程序开发能力.
四、理解了该知识点以及学科之间的融合渗透
本次课程设计程序部分是用C++语言编写的,把《编译原理》,《算法分析与设计》《C语言》三门学科联系起来,把各个学科之间的知识融合起来 ,把各门课程的知识联系起来,对计算机整体的认识更加深刻.使我加深了对《编译原理》,《算法分析与设计》《C++语言》三门课程的认识.
参考文献
[1] 陈意云 张昱,《编译原理》,高等教育出版社
[2] 王雷 刘志成 周晶,《编译原理课程设计》,机械工业出版社
[3] Internet网络相关资源
附录:源代码
/*cpp完成将wyl文件里的.cpp文本转换成wyl.html文件 并可以识别出关键字并用高亮表示*/
//头文件
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
//关键词表
string keyword[60]={ "auto","bool","break","case","catch","char","class",
"const","const_cast","continue","default","delete","do",
"double","dynamic_cast","else","enum","explicit","extern","false","float","for", "friend","goto","#include","if","inline","int",
"long","mutable","namespace","new","operator", "private", "protected","public","register", "return","short", "signed","sizeof","static","static_cast","struct","switch","template", "this","true","try","typedef","typeid","typename","union","unsigned", "using","virtual","void","volatile","while","_asm",};
cha[31]={' //中断字符表 char
','\t','\n','{','}',',','.','[',']','*','\\','/','?','<','>',';',':','^','%','@','!','~','`','(',')','+','-','|','=','\'','\"'};
ifstream fin("wyl.cpp");
ofstream fout("wyl.html");
void main()
{ /*主函数*/
fout<<"<html>"<<endl; fout<<"<body>"<<endl; int num=60; //查找是否为关键字的函数 如果是 则高亮表示 void searchword(string word); //判断读入字符是否为中断字符 bool ismark(char); //处理中断字符 void mark(char);
char m;
while(!fin.eof())
{ /*读入文件的字符并处理*/ m=fin.get(); string n; while(!ismark(m)&&!fin.eof())
{/*如果不是中断字并且不是全文结束符,则继续读入下一个次,并将之前读入的字符全部存入字符串a中*/
} if(ismark(m)) {/*如果是中断字,则判断字符串a是否为关键字,并处理关键字*/ searchword(n); mark(m); n=n+m; m=fin.get();
} if(fin.eof())break; } fout<<"</body>"<<endl; fout<<"</html>"; fin.close(); fout.close();
}
void searchword(string word)
{/*查找关键字并输出*/
} int flag=0; for(int i=0;i<50;i++) { } if(keyword[i]==word.data()) { flag=1; } fout<<"<font color=\"blue\">"<<word.data()<<"</font>"; break; if(flag==0) fout<<word.data();
bool ismark(char ch)
{/*判断中断符*/
for(int i=0;i<31;i++)
} { if(ch==cha[i])return 1; } return 0;
void mark(char ch) {/*处理中断符*/
char m; string a; a=ch; string b; int n=0; void search_end(int); switch(ch) { case '\n':fout<<"<br>";n=0;break; case '\t':fout<<" ";n=0;break; //一个制表符等于4个空格 case '<':fout<<"<";n=0;break; case '>':fout<<">";n=0;break; case ' ':fout<<" ";n=0;break; case '\'': {/*当读入字符为 ' 时,查找匹配的下一个'并输出之间的字符*/ } m=fin.get(); while(m!='\n'&&m!='\'') { switch(m) { case '<':b="<";break; case '>':b=">";break; case ' ':b=" ";break; case '\t':b=" ";break; default:b=m;break; } a=a+b; m=fin.get(); } if(m=='\n') fout<<a.data()<<"<br>"; else fout<<a.data()<<'\''; break; case '\"': {/*查找匹配的"并输出字符串*/ m=fin.get(); while(m!='\n'&&m!='\"') { switch(m) { case '<':b="<";break;
} } case '>':b=">";break; case ' ':b=" ";break; case '\t':b=" ";break; case '\\':b='\\';m=fin.get();b=b+m;break; default:b=m;break; } a=a+b; m=fin.get(); if(m=='\n') fout<<"<font color=\"ff00ff\">"<<a.data()<<"<br>"<<"</font>"; else fout<<"<font color=\"ff00ff\">"<<a.data()<<'\"'<<"</font>"; break;
case '/':
{/*判断是否为注释,如果是,则调用处理注释函数,如果不是,则当做一般字符处理*/
}
m=fin.get(); if(m=='/')search_end(0); else if(m=='*')search_end(1); else fout<<'/'<<m; break; } case '\\': { } m=fin.get(); fout<<'\\'<<m; break; default:fout<<ch;break; } void search_end(int flag) {/*读入注释并输出的函数*/ string a; string b; char m; int n=0; int t=0; if(flag==0) { m=fin.get(); while(m!='\n')
} } else { } { } switch(m) { case '<':b="<";break; case '>':b=">";break; case ' ':b=" ";break; case '\t':b=" ";break; default:b=m;break; } a=a+b; m=fin.get(); fout<<"<font color=\"green\">"<<"//"<<a.data()<<"</font>"<<"<br>"; while(n==0||t==0) { m=fin.get(); } fout<<"<font color=\"green\">"<<"/*"<<a.data()<<"</font>"; switch(m) { case '<':b="<";n=0;break; case '>':b=">";n=0;break; case ' ':b=" ";n=0;break; case '\t':b=" ";n=0;break; case '\n':b="<br>";break; case '*': n=1;b=m; break; case '/': { if(n==1) t=1; else n=0; b=m;break; } default:b=m;n=0;break; } a=a+b;