编译原理实验报告-合肥工业大学版

编译原理实验报告-合肥工业大学版
编译原理实验报告-合肥工业大学版

编译原理实验报告

合肥工业大学计算机科学与技术

完成日期:2013.6.3

实验一词法分析设计

一、实验功能:

对输入的txt文件内的内容进行词法分析:

由文件流输入test.txt中的内容,

对文件中的各类字符进行词法分析

打印出分析后的结果;

二、程序结构描述:(源代码见附录)

1、利用Key[]进行构造并存储关键字表;利用optr[]进行构造并存储运算符表;利用separator[]进行构造并存储分界符表;

2、bool IsKey(string ss) {}判断是否是关键字函数若是关键字返回true,否则返回false;

bool IsLetter(char c) {}判断当前字符是否字母,若是返回true,否则返回false;

bool IsDigit(char c) {}判断当前字符是否是数字,若是返回true,否则返回false;

bool IsOptr(string ss) {}判断当前字符是否是运算符,若是返回true,否则返回false;

bool IsSeparator(string ss) {}判断当前字符是否是分界符,若是返回true,否则返回false;

void analyse(ifstream &in) {}分析函数构造;

关系运算符通过switch来进行判断;

三、实验结果

实验总结:

词法分析的程序是自己亲手做的,在实现各个函数时花了不少功夫,

1、要考虑到什么时候该退一字符,否则将会导致字符漏读甚至造成字符重复读取。

2、在实现行数和列数打印时要考虑到row++和line++应该放在什么位置上才可以,如当读取一个\n时line要增加一,而row需要归0处理,在读取某一字符串或字符后row需要加一;

3、对于关系运算符用switch结构进行选择判断即可解决一个字符和两个字符的运算符之间的差异;

4、将自己学过的知识应用到实践中是件不怎么容易的事情,只有亲身尝试将知识转化成程序才能避免眼高手低,对于知识的理解也必将更加深刻。

实验二LL(1)分析法

一、实验原理:

1、写出LL(1)分析法的思想:当一个文法满足LL(1)条件时,我们就可以

为它构造一个不带回溯的自上而下的分析程序,这个分析程序是有一组递归过程组成的,每个过程对应文法的一个非终结符。实现LL(1)分析的一种有效的方法是使用一张分析表和一个站进行联合控制。预测分析表是一个M[A,a]形式的矩阵,存储着分析规则;栈STACK用于存放文法符号。从栈顶取符号,按照分析表给出的规则进行有步骤的分析。

2.实验要求实现的文法:

(1)E->TG

(2)G->+TG|—TG

(3)G->ε

(4)T->FS

(5)S->*FS|/FS

(6)S->ε

(7)F->(E)

(8)F->i

二、程序结构:

各个模块:

(1)定义部分:定义常量、变量、数据结构。

(2)初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等);

(3)控制部分:从键盘输入一个表达式符号串;

(4)利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。

程序各个部分的实现:

(1)Vn[]存储非终结符数组;

Vt[]存储终结符数组;

char strToken[Length];//存储规约表达式

struct LL//ll(1){char *c}分析表的构造字初始化

Class stack实现栈的要求功能:初始化,判断空满,入栈出栈等;

Run()函数实现LL(1)文法分析的函数:先将表达式字符入栈,#最先入栈底,依次取栈顶

符号,查和符号栈和分析表,进行相应的操作。

三、实验结果:

测试方法:运行程序,输入需要分析的语句

测试结果如下:

四、实验总结:

1、出现下列两种情况说明遇到了语法错误:

(1)栈顶的终结符与当前的输入符号不匹配。

(2)非终结符A处于栈顶,面临输入符号为a,但分析表M中M[A,a]为空。发现错误后要尽快的从错误中恢复过来使分析能继续进行下去。

2、对于符号的入栈出栈,哪个应该先入栈,栈顶是哪个元素需要搞清楚,不然得到的结果肯定不对。

实验三LR(1)分析法

一实验原理

LR(1)分析法实验设计思想及算法

(1)总控程序,也可以称为驱动程序。对所有的LR分析器总控程序都是相同的。

(2)分析表或分析函数,不同的文法分析表将不同,同一个文法采用的LR分析器不同时,分析表将不同,分析表又可以分为动作表(ACTION)和状态转换(GOTO)表两个部分,它们都可用二维数组表示。

(3)分析栈,包括文法符号栈和相应的状态栈,它们均是先进后出栈。

分析器的动作就是由栈顶状态和当前输入符号所决定。

二、程序结构

◆LR分析器由三个部分组成:

◆其中:SP为栈指针,S[i]为状态栈,X[i]为文法符号栈。状态转换表用

GOTO[i,X]=j表示,规定当栈顶状态为i,遇到当前文法符号为X时应

转向状态j,X为终结符或非终结符。

◆ACTION[i,a]规定了栈顶状态为i时遇到输入符号a应执行。动作有四种

可能:

(1)移进:

action[i,a]= Sj:状态j移入到状态栈,把a移入到文法符号栈,其中i,j表示状态号。

(2)归约:

action[i,a]=rk:当在栈顶形成句柄时,则归约为相应的非终结符A,即文法中有A- B的产生式,若B的长度为R(即|B|=R),则从状态栈和文法符号栈中自顶向下去掉R个符号,即栈指针SP减去R,并把A移入文法符号栈内,

j=GOTO[i,A]移进状态栈,其中i为修改指针后的栈顶状态。

(3)接受acc:

当归约到文法符号栈中只剩文法的开始符号S时,并且输入符号串已结束即当前输入符是'#',则为分析成功。

(4)报错:

当遇到状态栈顶为某一状态下出现不该遇到的文法符号时,则报错,说明输入端不是该文法能接受的符号串。

三、实验结果:

程序测试:输入需要规约的字符串测试结果:

四、实验总结

1、与算符优先分析方法比较,用LR分析时,设计特定出错处理子程序比较容易,因为不会发生不正确的归约。在分析表的每一个空项内,可以填入一个指示器,指向特定的出错处理子程序,第一类错误的处理一般采用插入、删除或修改的办法,但要注意,不能从栈内移去任何那种状态,它代表已成功地分析了程序中的某一部分。

2、LR分析法的归约过程是规范推导的逆过程,所以LR分析过程是一种规范归约过程。LR 分析法正是给出一种能根据当前分析栈中的符号串(通常以状态表示)和向右顺序查看输入串的K个(K≥0)符号就可唯一地确定分析器的动作是移进还是归约和用哪个产生式归约,因而也就能唯一地确定句柄。其中LR(0)分析器是在分析过程中不需向右查看输入符号,因而它对文法的限制较大,然而,它是构造其它LR类分析器的基础。因此,首先应学好LR(0)项目集规范族构造的基本原理和方法。当K=1时,已能满足当前绝大多数高级语言编译程序实现的需要。SLR(1)分析是为学习LR(1)分析做准备,LR(1)项目集族的构造是LALR(1)分析器的构造原理和基础。LALR(1) 分析器是当前大多数高级程序设计语言编译程序所采用的语法分析技术,也是编译程序语法分析器自动构造工具YACC的实现基本原理。由此,LR(0)、SLR(1)、LALR(1)、LR(1)四种分析器的构造方法都必须深入理解和掌握。

3、经过以上三个实验的锤炼,不得不说自己编译原理这门课的认识又提高了一个阶层,对编译原理的知识运用更加深入,编写过程中遇到不少的问题,结合课本及强大的网络资源,在完成的过程中得到很多收获,不仅来自于对知识点的了解更加深入,更是对自己编程能力的一次很好的锻炼,希望有更多这样实验的机会。

4、本人很希望在完成实验后,老师可以根据自己讲的课本,将自己所写的程序花一段时间来讲解,我想这样会对不会编写的是一种教学,对会了的同学是一种榜样效应,可以让我们有个目标追求,这样我们收获了的也会更加准确与丰富。

附录:

实验一源代码:

#include

#include

#include

using namespace std;

string key[8]={"do","end","for","if","printf","scanf","then","while"}; string optr[4]={"+","-","*","/"};

string separator[6]={",",";","{","}","(",")"};

char ch;

//判断是否为保留字

bool IsKey(string ss) {

int i;

for(i=0;i<8;i++)

if(!strcmp(key[i].c_str(),ss.c_str()))

return true;

return false;

}

//字母判断函数

bool IsLetter(char c) {

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

return true;

return false;

}

//数字判断函数

bool IsDigit(char c) {

if(c>='0'&&c<='9')

return true;

return false;

}

//运算符判断函数

bool IsOptr(string ss) {

int i;

for(i=0;i<4;i++)

if(!strcmp(optr[i].c_str(),ss.c_str()))

return true ;

return false;

}

//分界符判断函数

bool IsSeparator(string ss) {

int i;

for(i=0;i<6;i++)

if(!strcmp(separator[i].c_str(),ss.c_str()))

return true;

return false;

}

void analyse(ifstream &in) {

string st="";

char ch;

int line=1,row=0;

while((in.get(ch))) {

st="";

if((ch==' ')||(ch=='\t')){} //空格,tab健

else

if(ch=='\n') {line++;row=0; } //换行行数加一处理

else

if(IsLetter(ch)) //关键字、标识符的处理

{

row++;

while(IsLetter(ch)||IsDigit(ch))

{

st+=ch;

in.get(ch);

}

in.seekg(-1,ios::cur);//文件指针(光标)后退一个字节

if(IsKey(st)) //判断是否为关键字查询关键字表;

cout<

else //否则为标示符

cout<

}

else

if(IsDigit(ch)) //无符号整数处理

{

row++;

while(IsDigit(ch))

{st+=ch;

ch=in.get();

}

in.seekg(-1,ios::cur);

cout<

// break;

}

else

{st="";

st+=ch;

if(IsOptr(st)) //运算符处理

{

row++;

cout<

}

else

if(IsSeparator(st))//分隔符处理

{ row++;

cout<

}

else{

switch(ch){row++;

case'=' : {row++;cout<<"="<<"\t("<<"="<<","<<"6"<<")"<<'\t'<<"\t关系运算符"<<'\t'<<"("<

case'>' :{row++;ch=in.get();

if(ch=='=')

cout<<">="<<'\t'<<"("<<">="<<","<<"6"<<")"<<'\t'<<"\t关系运算符"<<'\t'<<"("<

else {cout<<">"<<"\t("<<">"<<","<<"6"<<")"<<'\t'<<"\t关系运算符"<<'\t'<<"("<

in.seekg(-1,ios::cur);}

} break;

case'<' :{row++;ch=in.get();

if(ch=='=')cout<<"<="<<'\t'<<"("<<"="<<","<<"6"<<")"<<"\t关系运算符"<<'\t'<<"("<

else if(ch=='>') cout<<"<>"<<'\t'<<"("<<"<>"<<","<<"6"<<")"<<'\t'<<"\t关系运算符"<<'\t'<<"("<

else{cout<<"<"<<"\t("<<"<"<<","<<"6"<<")"<<"\t"<<"\t关系运算符"<<'\t'<<"("<

in.seekg(-1,ios::cur);}

}break;

default :{row++; cout<

}

}}

}

}

int main()

{

ifstream in;

in.open("test.txt",ios::in);

cout<<"关键字1 标识符2 常数3 运算符4 分隔符5关系运算符6"<

if(in.is_open())

{

analyse(in);

in.close();

system("pause");

}

else

cout<<"文件操作出错"<

}

实验二源代码:

#include

using namespace std;

const int MaxLen=20; //初始化栈的长度

const int Length=20;//初始化数组长度

char Vn[5]={'E','G','T','S','F'};//非终结符数组

char Vt[8]={'i','(',')','+','-','*','/','#'};//终结符数组

char ch,X;//ch读当前字符,X获取栈顶元素

char strToken[Length];//存储规约表达式

struct LL//ll(1)分析表的构造字初始化

{

char*c;

};

LL E[8]={"TG","TG","error","error","error","error","error","error"}; LL G[8]={"error","error","null","+TG","-TG","error","error","null"}; LL T[8]={"FS","FS","error","error","error","error","error","error"}; LL S[8]={"error","error","null","null","null","*FS","/FS","null"};

LL F[8]={"i","(E)","error","error","error","error","error","error"};

class stack//栈的构造及初始化

{

public:

stack();//初始化

bool empty() const;//是否为空

bool full() const;//是否已满

bool get_top(char &c)const;//取栈顶元素

bool push(const char c);//入栈

bool pop();//删除栈顶元素

void out();//输出栈中元素

~stack(){}//析构

private:

int count;//栈长度

char data[MaxLen];//栈中元素

};

stack::stack()

{

count=0;

}

bool stack::empty() const

{

if(count==0)

return true;

return false;

}

bool stack::full() const

{

if(count==MaxLen)

return true;

return false;

}

bool stack::get_top(char &c)const

{

if(empty())

return false;

else

{

c=data[count-1];

return true;

}

}

bool stack::push(const char c)

{

if(full())

return false;

data[count++]=c;

return true;

}

bool stack::pop()

{

if(empty())

return false;

count--;

return true;

}

void stack::out()

{

for(int i=0;i

cout<

cout<<'\t';

}

int length(char *c)

{

int l=0;

for(int i=0;c[i]!='\0';i++)

l++;

return l;

}

void print(int i,char*c)//剩余输入串的输出{

for(int j=i;j

cout<

cout<<'\t';

}

void run()

{

bool flag=true;//循环条件

int step=0,point=0;//步骤、指针

int len;//长度

cout<<"输入规约的字符串:"<

cin>>strToken;

ch=strToken[point++];//读取第一个字符

stack s;

s.push('#');//栈中数据初始化

s.push('E');

s.get_top(X);//取栈顶元素

cout<<"步骤\t"<<"分析栈\t"<<"剩余输入串\t\t"<<"所用产生式\t"<<"动作"<

cout<

s.out();

print(point-1,strToken);

cout<<'\t'<<"初始化"<

while(flag)

{

if((X==Vt[0])||(X==Vt[1])||(X==Vt[2])||(X==Vt[3])||(X==Vt[4])||(X==Vt[5])||(X==Vt[6])) //判断是否为终结符(不包括#)

{

if(X==ch)//终结符,识别,进行下一字符规约

{

s.pop();

s.get_top(X);

ch=strToken[point++];

cout<

s.out();

print(point-1,strToken);

cout<<'\t'<<"GETNEXT(I)"<

}

else

{

flag=false;

}

}

else if(X=='#')//规约结束

{

if(X==ch)

{

cout<

s.out();

print(point-1,strToken);

cout<"<

s.pop();

flag=false;

}

else

{

flag=false;

}

}

else if(X==Vn[0]) //非终结符E

{

for(int i=0;i<8;i++)//查分析表

if(ch==Vt[i])

{

if(strcmp(E[i].c,"error")==0)//出错

{

flag=false;

}

else{ //对形如X->X1X2的产生式进行入栈操作s.pop();

len=length(E[i].c)-1;

for(int j=len;j>=0;j--)

s.push(E[i].c[j]);

cout<

s.out();

print(point-1,strToken);

cout<"<

for(int j=len;j>=0;j--)

cout<

cout<<")"<

s.get_top(X);

}

}

}

else if(X==Vn[1]) //同上,处理G

{

for(int i=0;i<8;i++)

if(ch==Vt[i])

{

if(strcmp(G[i].c,"null")==0)

{

s.pop();

cout<

s.out();

print(point-1,strToken);

cout<"<<"ε"<<'\t'<<"POP"<

s.get_top(X);

}

else if(strcmp(G[i].c,"error")==0)

{

flag=false;

}

else{

s.pop();

len=length(G[i].c)-1;

for(int j=len;j>=0;j--)

s.push(G[i].c[j]);

cout<

s.out();

print(point-1,strToken);

cout<"<

for(int j=len;j>=0;j--)

cout<

cout<<")"<

s.get_top(X);

}

}

}

else if(X==Vn[2]) //同上处理T

{

for(int i=0;i<8;i++)

if(ch==Vt[i])

{

if(strcmp(T[i].c,"error")==0)

{

flag=false;

}

else{

s.pop();

len=length(T[i].c)-1;

for(int j=len;j>=0;j--)

s.push(T[i].c[j]);

cout<

s.out();

print(point-1,strToken);

唐益明的简介(合肥工业大学副研究员)_2015年6月

唐益明 合肥工业大学副研究员,博士,硕士生导师,CCF会员、IEEE会员. 学术兼职: 中国计算机学会多值逻辑与模糊逻辑专业委员会委员 中国计算机学会协同计算专业委员会委员 中国人工智能学会粗糙集与软计算专业委员会委员 Associate Editor: Journal of Mathematics and Informatics 审稿人:1) IEEE Transactions on Fuzzy Systems (SCI) 2) Information Sciences (SCI) 3) ISPRS Journal of Photogrammetry and Remote Sensing (SCI) 4) International Journal of Electrical Power & Energy Systems (SCI) 5) Signal Processing (SCI) 6) International Journal of fuzzy Systems (SCI) 7) 计算机学报(EI)主要论著 [1] Yiming Tang, Xiaoping Liu. Differently implicational universal triple I method of (1, 2, 2) type. Computers & Mathematics with Applications, 2010. (SCI, EI) [2] Xiaoping Liu, Yiming Tang, et al. A formal model of collaborative discussion for problem-solving. Chinese Journal of Electronics, 2012. (SCI,EI) [3] Yiming Tang, Fuji Ren, et al. Differently implicational α-universal triple I restriction method of (1, 2, 2) type. Journal of Systems Engineering and Electronics, 2012. (SCI,EI) [4] Yiming Tang, Fuji Ren. Universal triple I method for fuzzy reasoning and fuzzy controller. Iranian Journal of Fuzzy Systems, 2013. (SCI)[1-2] 目录 1简历 2研究方向 3学术兼职 4主要论著 5教学情况 1简历 唐益明,男,1982年出生,合肥工业大学副研究员,博士,硕士生导师,CCF多值逻辑与模糊逻辑专业委员会委员,CCF协同计算专业委员会委员,CAAI

编译原理实验报告实验一编写词法分析程序

编译原理实验报告实验名称:实验一编写词法分析程序 实验类型:验证型实验 指导教师:何中胜 专业班级:13软件四 姓名:丁越 学号: 电子邮箱: 实验地点:秋白楼B720 实验成绩: 日期:2016年3 月18 日

一、实验目的 通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析 程序所用的工具自动机,进一步理解自动机理论。掌握文法转换成自动机的技术及有穷自动机实现的方法。确定词法分析器的输出形式及标识符与关键字的区分方法。加深对课堂教学的理解;提高词法分析方法的实践能力。通过本实验,应达到以下目标: 1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2、掌握词法分析的实现方法。 3、上机调试编出的词法分析程序。 二、实验过程 以编写PASCAL子集的词法分析程序为例 1.理论部分 (1)主程序设计考虑 主程序的说明部分为各种表格和变量安排空间。 数组 k为关键字表,每个数组元素存放一个关键字。采用定长的方式,较短的关键字 后面补空格。 P数组存放分界符。为了简单起见,分界符、算术运算符和关系运算符都放在 p表中 (编程时,还应建立算术运算符表和关系运算符表,并且各有类号),合并成一类。 id和ci数组分别存放标识符和常数。 instring数组为输入源程序的单词缓存。 outtoken记录为输出内部表示缓存。 还有一些为造表填表设置的变量。 主程序开始后,先以人工方式输入关键字,造 k表;再输入分界符等造p表。 主程序的工作部分设计成便于调试的循环结构。每个循环处理一个单词;接收键盘上 送来的一个单词;调用词法分析过程;输出每个单词的内部码。 ⑵词法分析过程考虑 将词法分析程序设计成独立一遍扫描源程序的结构。其流程图见图1-1。 图1-1 该过程取名为 lexical,它根据输入单词的第一个字符(有时还需读第二个字符),判断单词类,产生类号:以字符 k表示关键字;i表示标识符;c表示常数;p表示分界符;s表示运算符(编程时类号分别为 1,2,3,4,5)。 对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有 该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组id中,将常数 变为二进制形式存入数组中 ci中,并记录其在表中的位置。 lexical过程中嵌有两个小过程:一个名为getchar,其功能为从instring中按顺序取出一个字符,并将其指针pint加1;另一个名为error,当出现错误时,调用这个过程, 输出错误编号。 2.实践部分

编译原理实验报告

编译原理实验报告 姓名: 学号: 班级: 学院: 南昌大学信息工程学院计算机系 2014年6月

目录 实验一 (3) 实验二 (8) 实验三 (15)

实验1 词法分析程序的设计 学生姓名:学号:专业班级: 实验类型:□验证□综合□设计□创新实验日期:实验成绩: 一、实验目的 掌握计算机语言的词法分析程序的开发方法。 二、实验内容 编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。 三、实验要求 1、根据以下的正规式,编制正规文法,画出状态图; 标识符<字母>(<字母>|<数字字符>)* 十进制整数0 |(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)* 如有余力,则进一步分析八进制和十六进制整数,其正规式如下: 八进制整数0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)* 十六进制整数0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)* 运算符和界符+ - * / > < =<= >=( ) ;{ } 关键字main if then else while do int (可根据需要添加) 2、根据状态图,设计词法分析函数int scan( ),完成以下功能: 1)从文本文件中读入测试源代码,根据状态转换图,分析出一个单词, 2)以二元式形式输出单词<单词种类,单词属性> 其中单词种类用整数表示: 0:标识符 1:十进制整数 2:八进制整数 3:十六进制整数 运算符和界符,关键字采用一字一符,不编码 其中单词属性表示如下: 标识符,整数由于采用一类一符,属性用单词表示 运算符和界符,关键字采用一字一符,属性为空 3、编写测试程序,反复调用函数scan( ),输出单词种别和属性。 四、实验环境 PC微机 DOS操作系统或Windows 操作系统 Turbo C 程序集成环境或Visual C++ 程序集成环境

合肥工业大学期末复习

第一章 一、信息经济学的产生 起源于(1959)年马尔萨克的《信息经济学评论》 施蒂格勒——被誉为“信息经济学”和“管制经济学”的创始人。《信息经济学》、《劳动市场的信息》(1962)和《论寡占》 提出“搜寻”概念及其理论方法——施蒂格勒对微观信息经济学的主要贡献。 肯尼思·阿罗——无论何种信息共同具备两个明显特征:信息的使用具有不可分割性、信息难以被独占或垄断。 詹姆斯·莫里斯——经济激励机制问题,建立起(委托人—代理人)关系的基本模型,奠定了委托-代理关系的基本模型框架。 施蒂格利兹——对不完全信息条件下产品市场、资本市场和保险市场中经济行为的分析、信息在社会资源配置中的作用(特别是不利选择和道德风险导致的市场失败问题),以及微观信息市场分析三个领域 笼统地说,信息经济学就是研究经济行为中的信息现象及其规律的学科。 2、直至20世纪20年代。1921年,弗兰克·奈特对不确定性做了开拓性研究。 3、从假设条件角度分析,不确定性经济学主要研究不确定性形成的基础、方式、经济特征及其影响,同时也考虑如何减少不确定性的损失,但是,这种考虑不是建立在广泛研究信息对不确定性限制的基础上。近似地说,不确定性经济学是一门“被动的”信息经济学。 4、不确定性、风险和信息,构成信息经济学三个最基本的概念。 5、可以应用统计方法计算并预测其发生概率的风险,称为可保风险。不能用统计方法或其他方法计算并预测其发生概率的风险,称为不可保风险。 6、不确定性经济学认为,风险的完全不能转移与风险的完全转移一样,都是不经济的。 7、在现代社会中,没有其他制度能够像保险和股票市场那样通过市场并且以十分明确的形式来转移风险。通过保险市场和社会股票市场,企业一方面能够转移其可保风险,另一方面也可以转移其不可保风险。但是,无论企业或社会如何努力,它们都不可能通过保险市场转移其全部的可保风险,也不可能通过社会股票市场完全转移其不可保风险,因为无论是保险市场还是股票市场都存在着自身的局限。 第二章 1、信息的理论定义可近似地表述为:信息就是传递中的知识差。 2、(1)定义反映了信息发生的基础与过程。或者说,信息就是先验概率与后验概率之差。(2)定义揭示了信息价值的基础所在。信息之所以存在价值,关键在于存在知识差,后者能够使经济代理人改善决策环境而获得预期收益。(3)定义揭示了信息与经济知识增长之间的关系,知识差正是这种关系的中介,同时,知识差概念也显示了经济信息收集与处理活动的意义所在。(4)定义表明:信息具有层次性、不可分性和共享性,这是由知识差的层次性、不可分性和共享性决定的(5)定义说明了噪音、信息失真或误差的根本所在,是知识差在传递过程中必然存在绝对的损失。 3、信息商品正式得到社会承认的标志是知识产权的专利制度的确定 4、信息必须经过开发,把各类信息经过加工,整理成有序的、有应用价值的、有共享可能的信息才能成为信息资源 5、信息资源的开发和利用既是独立的又是重合的 信息资源开发和利用程度是衡量国家信息化水平的一个重要标志 信息资源的开发和利用是信息产业持续健康发展的根本保证 信息资源的开发利用不是一个一次性的工程建设问题,而是长期服务问题 政府的统计部门适宜做不进入市场竞争的统计信息服务工作,盈利性信息资源的开发利用交由企业做 第三章 1、1、商店的数量、价格的离散幅度构成市场价格离散的主要影响因素,但起决定作用的是价格在商店中离散的概率分布 2、价格离散幅度达的市场,价格离散率未必比离散幅度小的市场的价格离散率高 3、市场价格离散率不受市场平均价格的影响 2、1 价格离散程度越高,每次搜寻所获节省额就越大,有效搜寻次数就越多。2 购买商品的价格越高,或购买商品的数量越多,就越值得进行搜寻。 第四章 1、在完全竞争的简单模型中,一个生产澄汁的新厂商将会宣布它的产品已经准备好,以市场价格或低于市场价格出

合肥工业大学信息隐藏实验报告 完整代码版.

计算机与信息学院 信息隐藏实验报告 专业班级 信息安全13-1班 学生姓名及学号 马骏 2013211869 课程教学班号 任课教师 郑淑丽 实验指导教师 郑淑丽 实验地点 20 ~20 学年第学期

实验1 BMP位图信息隐藏 一、实验目的 学习BMP格式文件,并编程实现对位图文件信息隐藏 二、实验要求 将TXT文件嵌入BMP 文件中 三、问题描述 1、BMP位图文件的格式? 2、有哪几种方法隐藏信息,分别采用什么样的数据结构 3、随机选取如何避免“碰撞”的出现 四、算法思想 1、BMP位图文件格式 0000h~0001h 2字节-------------------------bm的ASC码 0002h~0005h 4字节-------------------------文件大小102718字节 0006h~0009h 4字节-------------------------全为0 000Ah~000Dh 4字节-------------------------偏移量118字节 000Eh~0011h 4字节-------------------------位图信息块大小40字节 0012h~0015h 4字节-------------------------宽450 0016h~0019h 4字节-------------------------高450 001Ah~001Bh 2字节-------------------------恒为01h 00h 001Ch~001Dh 2字节-------------------------颜色所占二进制位数值04h 00h=4 16色位图 001Eh~0021h 4字节-------------------------压缩方式=0无压缩 0022h~0025h 4字节-------------------------图像数据区大小102600字节 0026h~0029h 4字节-------------------------水平每米多少像素39个 002Ah~002Dh 4字节-------------------------垂直每米多少像素39个 002Eh~0031h 4字节-------------------------图像所用颜色数=0 0032h~0035h 4字节-------------------------重要颜色数=0 0036h~0076h 64字节-------------------------颜色表

编译原理实验报告

编译原理实验报告 班级 姓名: 学号: 自我评定:

实验一词法分析程序实现 一、实验目的与要求 通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符形式的源程序流转化为一个由各类单词符号组成的流的词法分析方法。 二、实验内容 根据教学要求并结合学生自己的兴趣和具体情况,从具有代表性的高级程序设计语言的各类典型单词中,选取一个适当大小的子集。例如,可以完成无符号常数这一类典型单词的识别后,再完成一个尽可能兼顾到各种常数、关键字、标识符和各种运算符的扫描器的设计和实现。 输入:由符合或不符合所规定的单词类别结构的各类单词组成的源程序。 输出:把单词的字符形式的表示翻译成编译器的内部表示,即确定单词串的输出形式。例如,所输出的每一单词均按形如(CLASS,VALUE)的二元式编码。对于变量和常数,CLASS字段为相应的类别码;VALUE字段则是该标识符、常数的具体值或在其符号表中登记项的序号(要求在变量名表登记项中存放该标识符的字符串;常数表登记项中则存放该常数的二进制形式)。对于关键字和运算符,采用一词一类的编码形式;由于采用一词一类的编码方式,所以仅需在二元式的CLASS字段上放置相应的单词的类别码,VALUE字段则为“空”。另外,为便于查看由词法分析程序所输出的单词串,要求在CLASS字段上放置单词类别的助记符。 三、实现方法与环境 词法分析是编译程序的第一个处理阶段,可以通过两种途径来构造词法分析程序。其一是根据对语言中各类单词的某种描述或定义(如BNF),用手工的方式(例如可用C语言)构造词法分析程序。一般地,可以根据文法或状态转换图构造相应的状态矩阵,该状态矩阵同控制程序便组成了编译器的词法分析程序;也可以根据文法或状态转换图直接编写词法分析程序。构造词法分析程序的另外一种途径是所谓的词法分析程序的自动生成,即首先用正规式对语言中的各类单词符号进行词型描述,并分别指出在识别单词时,词法分析程序所应进行的语义处理工作,然后由一个所谓词法分析程序的构造程序对上述信息进行加工。如美国BELL实验室研制的LEX就是一个被广泛使用的词法分析程序的自动生成工具。 总的来说,开发一种新语言时,由于它的单词符号在不停地修改,采用LEX等工具生成的词法分析程序比较易于修改和维护。一旦一种语言确定了,则采用手工编写词法分析程序效率更高。 四、实验设计 1)题目1:试用手工编码方式构造识别以下给定单词的某一语言的词法分析程序。 语言中具有的单词包括五个有代表性的关键字begin、end、if、then、else;标识符;整型常数;六种关系运算符;一个赋值符和四个算术运算符。参考实现方法简述如下。 单词的分类:构造上述语言中的各类单词符号及其分类码表。 表I 语言中的各类单词符号及其分类码表 单词符号类别编码类别码的助记符单词值

合肥工业大学编译原理 LL(1)自上而下文法分析

合肥工业大学计算机与信息学院计算机系2013级 编译原理课程设计报告 姓名:马骏 专业年级:信息安全13-1 学号:2013211869 提交时间:2016年07月

一、实验题目 自上而下的LL(1)文法分析 二、实验目的 了解掌握自上而下的LL(1)文法分析过程。 二、实验内容与要求 从语法分析树构造句型所有的推导的程序实现,接受用户任意输入的一个句型的语法分析树(其表示存于指定文件中),生成该语法分析树中包含的该句型的所有推导(显示输出)。构造一程序,实现教材P.78的FIRST(X)集合的构造算法。对任一给定的文法G,程序输出所有非终结符P的FIRST(P)。构造一程序,实现教材P.78的FIRST(X)集合的构造算法。对任一给定的文法G,程序输出所有非终结符P的FIRST(P)。在此基础上,构造一程序,实现教材P.79的FOLLOW(A)集合的构造算法。对任一给定的文法G,程序输出所有非终结符A的FOLLOW (A)。对于给定的一个LL(1)文法,假定所有非终结符号P的集合FIRST(P)和集合FOLLOW(P)都已知,构造其预测分析表(实现教材P.79给出的预测分析表构造算法)。对教材P.79给出的例4.7构造出预测分析表。程序显示输出预测分析表或输出到指定文件中。首先实现集合FIRST(X)构造算法和集合FOLLOW(A)构造算法,再实现教材P.79给出的预测分析表构造算法。程序显示输出预测分析表或输出到指定文件中。 对文法按教材P.76表4.1构造出G的预测分析程序,程序显示输出如P.78那样的匹配过程。 三、实验环境与工具 操作系统:Windows 7 开发语言:C++ 四、开发过程 1)字符要求: 你的程序必须能够根据以下字符来处理语法: - 终端字符:字母,数字,符号例如“+”,“—”,…; - 非终端字母表中的大写字母。 符号“=”,“|”和“#”(替换“ε”,因为它更容易输入到文本文件)被保留用于语法的描述中,因此不能被用作终端。 2)初始状态 您的程序通过读取一个文件中的“文本”格式开始。 这个文件的结构可以随意构建,不做要求,但建议做成简单的。 例如,程序描述以下语句: E = E + T |T T = T * F |F F =(E)| 0 |1 在这种情况,我们可以很容易确定E,T和F是非终端,而符号“(”,“)”,“*”和“+”和数字“0”和“1”是在终端。 第一个非终端(第一衍生物)被认为是语法的公理。

编译原理实验报告-合肥工业大学版

编译原理实验报告 合肥工业大学计算机科学与技术 完成日期:2013.6.3 实验一词法分析设计 一、实验功能:

对输入的txt文件内的内容进行词法分析: 由文件流输入test.txt中的内容, 对文件中的各类字符进行词法分析 打印出分析后的结果; 二、程序结构描述:(源代码见附录) 1、利用Key[]进行构造并存储关键字表;利用optr[]进行构造并存储运算符表;利用separator[]进行构造并存储分界符表; 2、bool IsKey(string ss) {}判断是否是关键字函数若是关键字返回true,否则返回false; bool IsLetter(char c) {}判断当前字符是否字母,若是返回true,否则返回false; bool IsDigit(char c) {}判断当前字符是否是数字,若是返回true,否则返回false; bool IsOptr(string ss) {}判断当前字符是否是运算符,若是返回true,否则返回false; bool IsSeparator(string ss) {}判断当前字符是否是分界符,若是返回true,否则返回false; void analyse(ifstream &in) {}分析函数构造; 关系运算符通过switch来进行判断; 三、实验结果

实验总结: 词法分析的程序是自己亲手做的,在实现各个函数时花了不少功夫, 1、要考虑到什么时候该退一字符,否则将会导致字符漏读甚至造成字符重复读取。 2、在实现行数和列数打印时要考虑到row++和line++应该放在什么位置上才可以,如当读取一个\n时line要增加一,而row需要归0处理,在读取某一字符串或字符后row需要加一; 3、对于关系运算符用switch结构进行选择判断即可解决一个字符和两个字符的运算符之间的差异; 4、将自己学过的知识应用到实践中是件不怎么容易的事情,只有亲身尝试将知识转化成程序才能避免眼高手低,对于知识的理解也必将更加深刻。

编译原理实验报告总结

学年第学期《编译原理》实验报告 学院(系):计算机科学与工程学院 班级:11303070A 学号:11303070*** 姓名:无名氏 指导教师:保密式 时间:2016 年7 月

目录 1.实验目的 (1) 2.实验内容及要求 (1) 3.实验方案设计 (1) 3.1 编译系统原理介绍 (1) 3.1.1 编译程序介绍 (2) 3.1.2 对所写编译程序的源语言的描述 (2) 3.2 词法分析程序的设计 (3) 3.3 语法分析程序设计 (4) 3.4 语义分析和中间代码生成程序的设计 (4) 4. 结果及测试分析 (4) 4.1软件运行环境及限制 (4) 4.2测试数据说明 (5) 4.3运行结果及功能说明 (5) 5.总结及心得体会 (7)

1.实验目的 根据Sample语言或者自定义的某种语言,设计该语言的编译前端。包括词法分析,语法分析、语义分析及中间代码生成部分。 2.实验内容及要求 (1)词法分析器 输入源程序,输出对应的token表,符号表和词法错误信息。按规则拼单词,并转换成二元形式;滤掉空白符,跳过注释、换行符及一些无用的符号;进行行列计数,用于指出出错的行列号,并复制出错部分;列表打印源程序;发现并定位词法错误; (2)语法分析器 输入token串,通过语法分析,寻找其中的语法错误。要求能实现Sample 语言或自定义语言中几种最常见的、基本的语法单位的分析:算术表达式、布尔表达式、赋值语句、if语句、for语句、while语句、do while语句等。 (3)语义分析和中间代码生成 输入token串,进行语义分析,修改符号表,寻找其中的语义错误,并生 成中间代码。要求能实现Sample语言或自定义语言中几种最常见的、基本的语法单位的分析:算术表达式、布尔表达式、赋值语句、if语句、for语句、while 语句、do while语句等。 实验要求:功能相对完善,有输入、输出描述,有测试数据,并介绍不足。3.实验方案设计 3.1 编译系统原理介绍 编译器逐行扫描高级语言程序源程序,编译的过程如下: (1).词法分析 识别关键字、字面量、标识符(变量名、数据名)、运算符、注释行(给人看的,一般不处理)、特殊符号(续行、语句结束、数组)等六类符号,分别归类等待处理。 (2).语法分析 一个语句看作一串记号(Token)流,由语法分析器进行处理。按照语言的文法检查判定是否是合乎语法的句子。如果是合法句子就以内部格式保存,否则报错。直至检查完整个程序。 (3).语义分析 语义分析器对各句子的语法做检查:运算符两边类型是否相兼容;该做哪些类型转换(例如,实数向整数赋值要"取整");控制转移是否到不该去的地方;是

编 译 原 理 实 验 报 告

编译原理实验报告 课程:编译原理 系别:计算机系 班级:11网络 姓名:王佳明 学号:110912049 教师:刘老师 实验小组:第二组 1

实验一熟悉C程序开发环境、进行简单程序的调试 实验目的: 1、初步了解vc++6.0环境; 2、熟悉掌握调试c程序的步骤: 实验内容: 1、输入下列程序,练习Turbo C 程序的编辑、编译、运行。 #include main() { printf(“Programming is fun.\n”); } 2、分析程序,预测其运行结果,并上机检测你的预测。 #include main() { printf(“*\n”); printf(“* * *\n”); printf(“* * * * *\n”); printf(“* * * * * * *\n”); } 3、下面是一个加法程序,程序运行时等待用户从键盘输入两个整数,然后求出它们的和并输出。观察运行结果(程序输出),上机验证该程序。 #include main() { int a,b,c; printf(“Please input a,b:”); scanf(“%d,%d”,&a,&b); c=a+b; printf(“%d+%d=%d\n”,a,b,c); } 2

实验二词法分析器 一、实验目的: 设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。 二、实验要求: 1.对给定的程序通过词法分析器弄够识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示。而本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示。 2.本程序自行规定: (1)关键字"begin","end","if","then","else","while","write","read", "do", "call","const","char","until","procedure","repeat" (2)运算符:"+","-","*","/","=" (3)界符:"{","}","[","]",";",",",".","(",")",":" (4)其他标记如字符串,表示以字母开头的标识符。 (5)空格、回车、换行符跳过。 在屏幕上显示如下: ( 1 , 无符号整数) ( begin , 关键字) ( if , 关键字) ( +, 运算符) ( ;, 界符) ( a , 普通标识符) 三、使用环境: Windows下的visual c++6.0; 四、调试程序: 1.举例说明文件位置:f:、、11.txt目标程序如下: begin x:=9 if x>0 then x:=x+1; while a:=0 do 3

合肥工业大学编译原理实验

宣城校区 实验报告 课程名称编译原理 专业班级计算机0001班 学生姓名及学号赵保飞 68 指导教师李芒宏 实验地点计算机中心楼第四机房 2017 ~ 2018 学年第一学期

《编译原理》课程实验报告实验名称词法分析设计 姓名赵保飞系院专业计算机科学 与技术 班级 计算机01 班 学号68 实验日期指导教师李芒宏成绩 一、实验目的和要求 通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设 计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的 理解,并能正确地、熟练地运用。 二、实验原理 (1)实验数据结构说明 K[]String数组-关键字表;s[]char数组—分界符;m[]char数组—算术运算符;r[]String数组—关系运算符;ArrayList型String数组ci—常数;ArrayList型String数组id—标识符(2)实验算法描述 (3)算法流程图

三、源程序代码和测试结果 package lexicalAnalysis; import.*; import.*; public class lexicalAnalysis{ static String k[]={"for","main","if","while","void","public","static","printf","scanf","asm","do","return","typedef ","auto","double","break","short","using","default","long"};ength()==1){quals(b))){ display(4,r[i],' ');ength()==2){quals(a))){

合工大汇编语言程序设计实验报告

合肥工业大学计算机与信息学院 实验报告 课程:汇编语言程序设计专业班级:**************** 学号:********** 姓名:***** 目录

实验一 (3) 实验二 (7) 实验三 (12) 实验四 (22)

实验一Debug程序的使用 一.实验目的 1、熟悉DEBUG程序中的命令,学会在DEBUG下调试运行汇编语言源程序。 2、掌握8086/8088的寻址方式及多字节数据的处理方法。 二.实验内容 1、利用DEBUG程序中的“E”命令,将两个多字节数“003F1AE7H”和“006BE5C4H”分别送入起始地址为DS:0200H和DS:0204H两个单元中。 2、分别用直接寻址方式和寄存器间接寻址方式编写程序段,实现将DS:0200H 单元和DS:0204H单元中的数据相加,并将运算结果存放在DS:0208H单元中。要求: 本次实验的内容均在DEBUG下完成,实现数据的装入、修改、显示;汇编语言程序段的编辑、汇编和反汇编;程序的运行和结果检查。 三.实验过程和程序 实验内容一: e ds:0200 E7 1A 3F 00 e ds:0204 C4 E5 6B 00 实验内容二: (1)直接寻址方式 MOV AX,[0200] MOV BX,[0202] ADD AX,[0204] ADC BX,[0206] MOV [0208],AX MOV [020A],BX (2)寄存器间接寻址方式 MOV SI,0200H MOV DI,0204H MOV BX,0208H MOV AX,[SI] MOV DX,[SI+2] ADD AX,[DI] ADC DX,[DI+2]

编译原理实验报告一

实验一词法分析程序实现 一、实验目得与要求 通过编写与调试一个词法分析程序,掌握在对程序设计语言得源程序进行扫描得过程中,将字符流形式得源程序转化为一个由各类单词符号组成得流得词法分析方法 二、实验内容 基本实验题目:若某一程序设计语言中得单词包括五个关键字begin、end、if、then、else;标识符;无符号常数;六种关系运算符;一个赋值符与四个算术运算符,试构造能识别这些单词得词法分析程序(各类单词得分类码参见表I)。 表I语言中得各类单词符号及其分类码表 输入:由符合与不符合所规定得单词类别结构得各类单词组成得源程序文件。 输出:把所识别出得每一单词均按形如(CLASS,VALUE)得二元式形式输出,并将结果放到某个文件中。对于标识符与无符号常数,CLASS字段为相应得类别码得助记符;V AL UE字段则就是该标识符、常数得具体值;对于关键字与运算符,采用一词一类得编码形式,仅需在二元式得CLASS字段上放置相应单词得类别码得助记符,V ALUE字段则为“空". 三、实现方法与环境 词法分析就是编译程序得第一个处理阶段,可以通过两种途径来构造词法分析程序.其一就是根据对语言中各类单词得某种描述或定义(如BNF),用手工得方式(例如可用C语言)构造词法分析程序。一般地,可以根据文法或状态转换图构造相应得状态矩阵,该状态矩阵连同控制程序一起便组成了编译器得词法分析程序;也可以根据文法或状态转换图直接编写词法分析程序。构造词法分析程序得另外一种途径就是所谓得词法分析程序得自动生成,即首先用正规式对语言中得各类单词符号进行词型描述,并分别指出在识别单词时,词法分析程

合肥工业大学编译原理期末复习

编译原理基础题 一、选择题 1、在使用高级语言编程时,首先可通过编译程序发现源程序的全部( A)错误和部分语义错误。 A、语法 B、语义 C、语用 D、运行 2、编译过程中,语法分析器的任务是( B)。 (1)分析单词是怎样构成的; (2)分析单词串是如何构成语句和说明的; (3)分析语句和说明是如何构成程序的;(4)分析程序的结构 A、(2)(3) B、(2)(3)(4) C、(1)(2)(3) D、(1)(2)(3)(4) 3.生成能被5整除的正整数的文法G[Z]是_ C____。 A. G[Z]: Z→AC,A→BA|B,B→0|1|2|…|9,C→0|5 B. G[Z]: Z→AC,A→BA|ε,B→0|1|2|…|9,C→0|5 C. G[Z]:Z→DA0|A5,A→BA|ε,B→0|D,D→1|2|…|9 D. G[Z]:Z→AC|C,A→BA|B,B→0|1|2|…|9,C→0|5 4、编译程序中的语法分析器接受以( C)为单位的输入,并产生有关信息供以后各阶段使用。 A、表达式 B、产生式 C、单词 D、语句 5、算符优先分析法每次都是对( D)进行归约。 A、直接短语 B、句柄 C、素短语 D、最左素短语 6、过程调用时,参数的传递方法通常有( C )。 (1)传值;(2)传地址;(3)传结果;(4)传名 A、(1)(2) B、(1)(2)(3) C、(1)(2)(4) D、(1)(2)(3)(4) 7、在编译方法中,动态存储分配的含义是( A )。 A、在运行阶段对源程序中的量进行分配 B、在编译阶段对源程序中的量进行分配 C、在编译阶段对源程序中的量进行分配,在运行时这些量的地址可以根据需要改变 D、以上都不对 8、a:= a+b*c↑(d/e)/f的逆波兰记号表示是()。 A、aabc*+↑de/f/:= B、aabcde↑/*f/:= C、aabcde/↑*f/+:= D、以上都不对。 9.算符文法是指 A 的文法。 ①没有形如U→...VW...的规则(U,V,W VN) ②VT中任意两个符号之间至多存在一种算符优先关系

编译原理标准实验报告

电子科技大学 实验报告 学生姓名:学号:指导教师: 实验地点:实验时间: 一、实验室名称:计算机学院软件工程实验室 二、实验项目名称:词法分析器的设计与实现 三、实验学时:4学时 四、实验原理 1.编译程序要求对高级语言编写的源程序进行分析和合成,生成目标程序。词法分析是对源程序进行的首次分析,实现词法分析的程序为词法分析程序。 2.词法分析的功能是从左到右逐个地扫描源程序字符串,按照词法规则识别出单词符号作为输出,对识别过程中发现的词法错误,输出相关信息。 3.状态转换图是有限有向图,是设计词法分析器的有效工具。 五、实验目的 通过设计词法分析器的实验,使同学们了解和掌握词法分析程序设计的原理及相应的程序设计方法,同时提高编程能力。 六、实验内容 实现求n!的极小语言的词法分析程序,返回二元式作为输出。 七、实验器材(设备、元器件) 1.操作系统:Windows XP

2.开发工具:VC6.0 3.普通PC即可 八、实验步骤 (1)启动VC6.0,创建空白工程项目。选择菜单中的“文件”->“新建”->“项目”,在弹出的对话框中,左边的“项目类型”框中,选择“Visual C++ 项目”,在右边框中,选择“空项目(.Net)”,在对话框下边,选择工程文件存放目录及输入名称,如Example1,单击“确定”。 (2)建立相应的单词符号与种别对照表; (3)根据状态转换图编写相应的处理函数; (4)完成词法分析器; (5)编译与调试以上程序; (6)生成相应的*.dyd文件,作为后面语法分析的输入文件。 九、实验数据及结果分析

可以对源程序进行词法分析,如果有错给出出错信息和所在行数,如果无错则生成二元式文件。 十、实验结论 本实验程序较好地完成了词法分析程序的设计与实现,能够对所给文法的程序进行词法分析,在没有词法错误的时候生成相应的二元式文件。该实验程序可一次性给出源程序中的词法错误。 十一、总结及心得体会 通过该实验,对词法分析程序的设计,以及运用C语言进行编程有了更深刻的理解,同时加深了自己对词法分析程序的原理的理解与掌握,提高了自己的动手能力。 十二、对本实验过程及方法、手段的改进建议 程序设计合理,代码可进一步优化。 报告评分: 指导教师签字:

合肥工业大学计算机科学与技术专业教学计划.

合肥工业大学计算机科学与技术专业教学计划 一、培养目标与基本规格 本专业培养适应21世纪社会主义现代化建设需要、德智体全面发展、基础扎实、知识面宽、能力强、素质高、富有创新精神的计算机科学技术高级专门人才。 本专业培养的基本规格是: 1、热爱社会主义祖国,拥护共产党的领导,掌握马列主义、毛泽东思想和邓小平理论的基本原理;愿为社会主义现代化建设服务,为人民服务;有为国家富强、民族昌盛而奋斗的志向和责任感;具有敬业爱岗、艰苦求实、热爱劳动、遵纪守法、团结合作的品质;具有良好的思想品德、社会公德和职业道德。 2、积极参加社会实践,走正确成长的道路。受到必要的军事训练,能够同群众结合,理论联系实际,实事求是,热爱劳动。 3、懂得社会主义民主和法制,遵纪守法,举止文明,有“勤奋、严谨、求实、创新”的良好作风。 4、比较系统地掌握本专业所必需的自然科学基础和技术科学基础的理论知识,具有一定的专业知识、相关的工程技术知识和技术经济、工业管理知识,对本专业学科范围内的科学技术新发展及其动向有一定的了解。 5、具有从事信息产业所必需的运算、实验、测试、计算机应用等技能。 6、有独立获取知识、提出问题、分析问题和解决问题的基本能力以及具有较强开拓创新的精神,具备一定的社会活动能力、从事本专业业务工作的能力和适应相邻专业业务工作的基本能力与素质,具有工程经济观点,受到工程设计方法和科学研究方法的初步训练。 7、初步掌握一门外国语,能够比较熟练地阅读本专业的外文书刊。 8、了解体育运动的基本知识,掌握科学锻炼身体的基本技能,养成锻炼身体的良好习惯,达到国家规定的大学生体育合格标准,讲究卫生,身体健康,能胜任未来的工作,能够承担建设祖国和保卫祖国的光荣任务。 9、具有较好的文化素养和心理素质以及一定的美学修养。 二、业务范围 本专业培养的毕业生可从事: 1. 计算机系统的研究与开发; 2. 软件系统的设计与研制; 3. 计算机在科学计算、工业控制、信息处理、人工智能、辅助设计、通讯等领域的应用开发; 4. 计算机网络系统的设计和应用; 5. 高等院校和科研院所的教学和科研工作。 三、主干学科和主要课程 主干学科:计算机科学与技术 主要课程:高级语言程序设计、离散数学、电子技术、数字逻辑、面向对象程序设计、计算机组成与体系结构、数据结构、编译原理、操作系统、数据库、微型计算机原理与汇编语言、软件工程、计算机网络。 四、基本学制 四年

合工大电路实验报告2016.

电路分析基础 实验指导 2016.3

实验一常用电子仪器使用 1.1万用表 万用表是一种多用途的电工仪表,最常用的万用表,具有测量直流电压、交流电压、直流电流、交流电流、电阻值等功能。万用表可分为指针式和数字式万用表,图1为指针式万用表,图2为数字式万用表,万用表的型号很多,但它们的结构基本相似,使用方法也基本相同。 一、使用方法 1、电阻的测量方法 步骤一:连接表棒。将表棒插入万用表的正负接线柱上; 步骤二:调零。将表棒的两端相接触,调节欧姆条正电位器,使指针准确地指在欧姆刻度的零位上; 步骤三:档位选择。将转换开关旋至欧姆档的范围内;开始尽量选大的范围,测量后根据阻值再进行选择适当的范围。 步骤四:测量电阻。将表棒分开去测量未知电阻的阻值。 2、直流、交流电压和直流电流的测量方法 步骤一:连接表棒。 步骤二:档位选择。如果测直流电压将转换开关旋至直流电压档的范围内,测交流电压就旋至交流电压档范围内,测直流电流就将旋至直流电流档的范围内; 步骤三:量程选择。估算后选择档位的适当量程; 步骤四:测量并读数。将表棒接入电路,根据指针偏转,读出待测电压的大小。 二、注意事项 1、如果用数字表测量时,被测的量小,档位放的太大,就会出现小数点的位数太多。如果被测量的量大,档位放的太小,这时测量结果数字就为“1”,这说明档位太小,被测的量太大,数值溢出了,需换大档位。 2、测量电阻时,若用指针表,首先要将两只表笔短路,用调零旋钮将表针调到零,然后再测量。测量时,两手不应同时接触电阻两端,否则相当于在被测电阻两端并联一个人体电阻,而产生误差。 3、测量出的电阻值是档位值乘上指针的读数。如果用数字表测量电阻时,电阻值可以直接读出。 4、每次使用前应将转换开关调节在正确位置上再开始测量。测量电路中的电压时,万用表要并联在被测支路上。测量电路中的电流时,万用表要串联在被测支路中。 5、应该养成良好的使用习惯,即每当万用表使用完毕,应将转换开关放在最高交流电压档位上。

编译原理实验报告

《编译原理》实验报告软件131 陈万全132852

一、需求分析 通过对一个常用高级程序设计语言的简单语言子集编译系统中词法分析、语法分析、语义处理模块的设计、开发,掌握实际编译系统的核心结构、工作流程及其实现技术,获得分析、设计、实现编译程序等方面的实际操作能力,增强设计、编写和调试程序的能力。 通过开源编译器分析、编译过程可视化等扩展实验,促进学生增强复杂系统分析、设计和实现能力,鼓励学生创新意识和能力。 1、词法分析程序设计与实现 假定一种高级程序设计语言中的单词主要包括五个关键字begin、end、if、then、else;标识符;无符号常数;六种关系运算符;一个赋值符和四个算术运算符,试构造能识别这些单词的词法分析程序。 输入:由符合和不符合所规定的单词类别结构的各类单词组成的源程序文件。 输出:把所识别出的每一单词均按形如(CLASS,VALUE)的二元式形式输出,并将结果放到某个文件中。对于标识符和无符号常数,CLASS字段为相应的类别码的助记符;VALUE字段则是该标识符、常数的具体值;对于关键字和运算符,采用一词一类的编码形式,仅需在二元式的CLASS字段上放置相应单词的类别码的助记符,VALUE字段则为“空”。 2、语法分析程序设计与实现 选择对各种常见高级程序设计语言都较为通用的语法结构——算术表达式的

一个简化子集——作为分析对象,根据如下描述其语法结构的BNF定义G2[<算术表达式>],任选一种学过的语法分析方法,针对运算对象为无符号常数和变量的四则运算,设计并实现一个语法分析程序。 G2[<算术表达式>]: <算术表达式>→<项> | <算术表达式>+<项> | <算术表达式>-<项> <项>→<因式>|<项>*<因式>|<项>/<因式> <因式>→<运算对象> | (<算术表达式>) 若将语法范畴<算术表达式>、<项>、<因式>和<运算对象>分别用E、T、F和i 代表,则G2可写成: G2[E]:E → T | E+T | E-T T → F | T*F | T/F F → i | (E) 输入:由实验一输出的单词串,例如:UCON,PL,UCON,MU,ID······输出:若输入源程序中的符号串是给定文法的句子,则输出“RIGHT”,并且给出每一步分析过程;若不是句子,即输入串有错误,则输出“ERROR”,并且显示分析至此所得的中间结果,如分析栈、符号栈中的信息等,以及必要的出错说明信息。 3、语义分析程序设计与实现 对文法G2[<算术表达式>]中的产生式添加语义处理子程序,完成运算对象是简单变量(标识符)和无符号数的四则运算的计值处理,将输入的四则运算转换为四元式形式的中间代码。 输入:包含测试用例(由标识符、无符号数和+、?、*、/、(、)构成的算术表达式)的源程序文件。 输出:将源程序转换为中间代码形式表示,并将中间代码序列输出到文件中。 若源程序中有错误,应指出错误信息 二、设计思路 1、词法分析程序设计与实现 1)单词分类 为了编程的实现。我们假定要编译的语言中,全部关键字都是保留字,程序员不得将它们作为源程序中的标识符;作了这些限制以后,就可以把关键字和标识符的识别统一进行处理。即每当开始识别一个单词时,若扫视到的第一个字符为字母,则把后续输入的字母或数字字符依次进行拼接,直至扫视到非字母、数字字符为止,以期获得一个尽可能长的字母数字字符串,然后以此字符串查所谓保留字表(此保留字表要事先造好),若查到此字符串,则取出相应的类别码;反之,则表明该字符串应为一标识符。

相关文档
最新文档