河北工业大学语义分析实验报告

河北工业大学语义分析实验报告
河北工业大学语义分析实验报告

实验三语义分析程序实现

一、实验设计

在实现词法、语法分析程序的基础上,编写相应的语义子程序,进行语义处理,加深对语法制导翻译原理的理解,进一步掌握将语法分析所识别的语法范畴变换为某种中间代码(四元式)的语义分析方法。

基本实验题目:对文法G2[<算术表达式>]中的产生式添加语义处理子程序,完成运算对象是简单变量(标识符)和无符号数的四则运算的计值处理,将输入的四则运算转换为四元式形式的中间代码。

语法制导翻译模式是在语法分析的基础上,增加语义操作来实现的,实际上是对前后文无关文法的一种扩展。一般而言,首先需要根据进行的语义分析工作,完成对给定文法的必要拆分和语义动作的编写,从而为每一个产生式都配备相应的语义子程序,以便在进行语法分析的同时进行语义解释。即在语法分析过程中,每当用一个产生式进行推导或归约时,语法分析程序除执行相应的语法分析动作之外,还要调用相应的语义子程序,以便完成生成中间代码、查填有关表格、检查并报告源程序中的语义错误等工作。每个语义子程序需指明相应产生式中各个符号的具体含义,并规定使用该产生式进行分析时所应采取的语义动作。这样,语法制导翻译程序在对源程序从左到右进行的一遍扫描中,既完成语法分析任务,又完成语义分析和中间代码生成方面的工作。本实验要求从编译器的整体设计出发,重点通过对实验二中语法分析程序的扩展,完成一个编译器前端程序的编写、调试和测试工作,形成一个将源程序翻译为中间代码序列的编译系统。

二、程序代码

在词法分析和语法分析的基础上,完成了语义的分析,同样采用了头文件的形式,在VC++6.0中运行

#include

#include

#include

#include

#include

#include"cifa.h"

#include"fenxibiao.h"

# define PL 15 //+

# define MI 16 //-

# define MU 17

# define DI 18

#define acc 100

#define MAXState 20

#define NUMBER 9//表达式的个数

#define MAXTEMP 10//最多临时变量的个数

int State[MAXState];//状态栈

int i=0;

int CURRENTSTATE=0;//标识当前状态

int LENGTH[NUMBER]={1,3,3,1,3,3,1,3,1};//表达式右边的长度int length;

int index;//索引

int Yes=0;//判断是否结束

int tag=0;//判断是否需要调用词法程序

//extern char * cifa();

double e1,t4,f7;//整形

char e12[20],t42[20],f72[20];//字符型

int TEMP[MAXTEMP];

int temp=0;

int biaoshifu=0;

FILE * fp;

void REPORT_ERROR()

{

Yes=1;

long f1=ftell(fp);

char ch=fgetc(fp);

fseek(fp,-1,1);

printf("语法错误,第%d个字符'%C'处\n",f1,ch);

}

void Accept()

{

Yes=1;

//printf("语法分析成功\n");

}

int INDEX(char a)//获取当前字符串对应的索引

{

int i;

switch (a)

{

case 'E':i=8;return(i);break;

case 'T':i=9;return(i);break;

case 'F':i=10;return(i);break;

default: REPORT_ERROR();return(0);

break;

}

}

void Gen(int a,double i1,double i2,int t)//输出四元式{

switch(a)

{

case PL:printf("(+,%g,%g,%d)\n",i1,i2,t);

break;

case MI:printf("(-,%g,%g,%d)\n",i1,i2,t);

break;

case MU:printf("(*,%g,%g,%d)\n",i1,i2,t);

break;

case DI:printf("(/,%g,%g,%d)\n",i1,i2,t);

break;

default:break;

}

}

void yuyi(int n)//语义子程序

{

switch(n)

{

case 1:

{

temp++;//产生临时变量,

Gen(PL,e1,t4,temp);

e1=temp;

break;

}

case 2:

{

temp++;//产生临时变量,TEMP[temp]

Gen(MI,e1,t4,temp);

e1=temp;

break;

}

case 3:

{

e1=t4;

break;

}

case 4:

{

temp++;

Gen(MU,t4,f7,temp);

t4=temp;

break;

}

case 5:

{

temp++;

Gen(DI,t4,f7,temp);

t4=temp;

break;

}

case 6:

{

t4=f7;

break;

}

case 7:

{

f7=e1;

break;

}

case 8:

{

f7=FCON;

break;

}

default :printf("error\n");

break;

}

}

void Gen2(int a,char *i1,char *i2,int t)//输出四元式{

switch(a)

{

case PL:printf("(+,%s,%s,%d)\n",&i1,&i2,t);

break;

case MI:printf("(-,%s,%s,%d)\n",&i1,&i2,t);

break;

case MU:printf("(*,%s,%s,%d)\n",&i1,&i2,t);

break;

case DI:printf("(/,%s,%s,%d)\n",&i1,&i2,t);

break;

default:break;

}

}

void fuzhi(char *a,char *b)//将数组b赋值给数组a {

}

void yuyi2(int n)//语义子程序

{

switch(n)

{

case 1:

{

temp++;//产生临时变量

Gen2(PL,e12,t42,temp);

e12[0]=temp;

break;

}

case 2:

{

temp++;//产生临时变量,TEMP[temp]

Gen2(MI,e12,t42,temp);

e12[0]=temp;

break;

}

case 3:

{

//e12=t42;

strcpy(e12,t42);

break;

}

case 4:

{

temp++;

Gen2(MU,t42,f72,temp);

t42[0]=temp;

break;

}

case 5:

{

temp++;

Gen2(DI,t42,f72,temp);

t42[0]=temp;

break;

}

case 6:

{

//t42=f72;

strcpy(t42,f72);

break;

}

case 7:

{

//f72=e12;

strcpy(f72,e12);

break;

case 8:

{

//f72=TOKEN[0];

strcpy(f72,TOKEN);

break;

}

default :printf("error\n");

break;

}

}

void INPUT(int a)

{

index=a;

int index2=0;

if(Table[CURRENTSTATE][index]!=acc)

{

if (Table[CURRENTSTATE][index]==0)//报错

{

REPORT_ERROR();

}

else

if (Table[CURRENTSTATE][index]<20)//移近{ i++;

State[i]=Table[CURRENTSTATE][index];

CURRENTSTATE=State[i];

else //规约

{

tag=1;

length=LENGTH[Table[CURRENTSTATE][index]-20];

i=i-length;//指针回退

switch(Table[CURRENTSTATE][index]-20)

{

case 1:

case 2:

case 3:index2=8;break;

case 4:

case 5:

case 6:index2=9;break;

case 7:

case 8:index2=10;break;

default :REPORT_ERROR();

break;

}

if (biaoshifu!=1)//不是标识符

{

yuyi(Table[CURRENTSTATE][index]-20);//规约调用语义子程序

}

else

{

yuyi2(Table[CURRENTSTATE][index]-20);//规约调用语义子程序}

CURRENTSTATE=State[i];

i++;

State[i]=Table[CURRENTSTATE][index2];

CURRENTSTATE=State[i];

}

}

else

{

Accept();

CURRENTSTATE=0;

}

}

void main()

{

int res;

State[0]=0;

if((fp=fopen("b.txt","r"))==NULL)

{

printf("file open error!\n");

exit(0);

}

else

{

res=cifa(fp);

if(start==1)//文件以begin开始

{

do

{

res=cifa(fp);

if(end==0)

{

fseek(fp,-1,1);//文件指针回退一个*/ do

{

if(tag==0)

{

res=cifa(fp);

}

tag=0;

if (res==26)

{

biaoshifu=1;

res=res-20;

}

INPUT(res);

}while(Yes!=1);//一个语法句子翻译完成

Yes=0;//归零

i=0;

}

cifa(fp);

if(ch==EOF)

{

end=1;

printf("没有end结束符\n");

}

fseek(fp,-1,1);

}while(end==0);

cifa(fp);

if(ch!=EOF)

{

printf("end结束标识符后程序没有结束!\n");

}

//文件结束

}

else

{

printf("缺少程序开始符!\n");

}

}

}

三、实验结果

Begin标志着文件的开始,End标志着文件的结束

编译原理语义分析实验报告——免费!

语义分析实验报告 一、实验目的: 通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法。 二、实验要求: 采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。 三、算法思想: 1、设置语义过程。 (1)emit(char *result,char *ag1,char *op,char *ag2) 该函数的功能是生成一个三地址语句送到四元式表中。 四元式表的结构如下: struct { char result[8]; char ag1[8]; char op[8]; char ag2[8]; }quad[20]; (2) char *newtemp() 该函数回送一个新的临时变量名,临时变量名产生的顺序为T1,T2,… char *newtemp(void) { char *p; char m[8]; p=(char *)malloc(8); k++; itoa(k,m,10); strcpy(p+1,m); p[0]=’t’; return(p); } 2、函数lrparser 在原来语法分析的基础上插入相应的语义动作:将输入串翻译成四元式序列。在实验中我们只对表达式、赋值语句进行翻译。

四、源程序代码: #include #include #include #include struct { char result[12]; char ag1[12]; char op[12]; char ag2[12]; }quad; char prog[80],token[12]; char ch; int syn,p,m=0,n,sum=0,kk; //p是缓冲区prog的指针,m是token的指针char *rwtab[6]={"begin","if","then","while","do","end"}; void scaner(); char *factor(void); char *term(void); char *expression(void); int yucu(); void emit(char *result,char *ag1,char *op,char *ag2); char *newtemp(); int statement(); int k=0; void emit(char *result,char *ag1,char *op,char *ag2) { strcpy(quad.result,result); strcpy(quad.ag1,ag1); strcpy(quad.op,op); strcpy(quad.ag2,ag2);

编译原理词法分析器语法分析器实验报告

编译技术 班级网络0802 学号3080610052姓名叶晨舟 指导老师朱玉全2011年 7 月 4 日

一、目的 编译技术是理论与实践并重的课程,而其实验课要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。 二、任务及要求 基本要求: 1.词法分析器产生下述小语言的单词序列 这个小语言的所有的单词符号,以及它们的种别编码和内部值如下表: 单词符号种别编码助记符内码值 DIM IF DO STOP END 标识符 常数(整)= + * ** , ( )1 2 3 4 5 6 7 8 9 10 11 12 13 14 $DIM $IF $DO $STOP $END $ID $INT $ASSIGN $PLUS $STAR $POWER $COMMA $LPAR $RPAR - - - - - - 内部字符串 标准二进形式 - - - - - - 对于这个小语言,有几点重要的限制: 首先,所有的关键字(如IF﹑WHILE等)都是“保留字”。所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。例如,下面的写法是绝对禁止的: IF(5)=x 其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。也就是说,对于关键字不专设对应的转换图。但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。 再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。例如,一个条件语句应写为

计算数学排名

070102 计算数学 计算数学也叫做数值计算方法或数值分析。主要内容包括代数方程、线性代数方程组、微分方程的数值数值逼近问题,矩阵特征值的求法,最优化计算问题,概率统计计算问题等等,还包括解的存在性、唯一性差分析等理论问题。我们知道五次及五次以上的代数方程不存在求根公式,因此,要求出五次以上的高次代一般只能求它的近似解,求近似解的方法就是数值分析的方法。对于一般的超越方程,如对数方程、三角方采用数值分析的办法。怎样找出比较简洁、误差比较小、花费时间比较少的计算方法是数值分析的主要课题的办法中,常用的办法之一是迭代法,也叫做逐次逼近法。迭代法的计算是比较简单的,是比较容易进行的以用来求解线性方程组的解。求方程组的近似解也要选择适当的迭代公式,使得收敛速度快,近似误差小。 在线性代数方程组的解法中,常用的有塞德尔迭代法、共轭斜量法、超松弛迭代法等等。此外,一些比消去法,如高斯法、追赶法等等,在利用计算机的条件下也可以得到广泛的应用。在计算方法中,数值逼近本方法。数值逼近也叫近似代替,就是用简单的函数去代替比较复杂的函数,或者代替不能用解析表达式表值逼近的基本方法是插值法。 初等数学里的三角函数表,对数表中的修正值,就是根据插值法制成的。在遇到求微分和积分的时候,的函数去近似代替所给的函数,以便容易求到和求积分,也是计算方法的一个主要内容。微分方程的数值解法。常微分方程的数值解法由欧拉法、预测校正法等。偏微分方程的初值问题或边值问题,目前常用的是有限元素法等。有限差分法的基本思想是用离散的、只含有限个未知数的差分方程去代替连续变量的微分方程求出差分方程的解法作为求偏微分方程的近似解。有限元素法是近代才发展起来的,它是以变分原理和剖分的方法。在解决椭圆形方程边值问题上得到了广泛的应用。目前,有许多人正在研究用有限元素法来解双曲方程。计算数学的内容十分丰富,它在科学技术中正发挥着越来越大的作用。 排名学校名称等级 1 北京大学A+ 2 浙江大学 A+ 3 吉林大学A+ 4 大连理工大学A+ 5 西安交通大学A 北京大学:http:https://www.360docs.net/doc/338120531.html,/NewsSpecialDetailsInfo.aspx?SID=4 浙江大学:http:https://www.360docs.net/doc/338120531.html,/NewsSpecialDetailsInfo.aspx?SID=21847 吉林大学:http:https://www.360docs.net/doc/338120531.html,/NewsSpecialDetailsInfo.aspx?SID=5506 大连理工大学:http:https://www.360docs.net/doc/338120531.html,/NewsSpecialDetailsInfo.aspx?SID=4388 西安交通大学:http:https://www.360docs.net/doc/338120531.html,/NewsSpecialDetailsInfo.aspx?SID=18285

编译原理知识点汇总

编译原理的复习提纲 1.编译原理=形式语言+编译技术 2.汇编程序: 把汇编语言程序翻译成等价的机器语言程序 3.编译程序: 把高级语言程序翻译成等价的低级语言程序 4.解释执行方式: 解释程序,逐个语句地模拟执行 翻译执行方式: 翻译程序,把程序设计语言程序翻译成等价的目标程序 5.计算机程序的编译过程类似,一般分为五个阶段: 词法分析、语法分析、语义分析及中间代码生成、代码优化、目标代码生成 词法分析的任务: 扫描源程序的字符串,识别出的最小的语法单位(标识符或无正负号数等) 语法分析是: 在词法分析的基础上的,语法分析不考虑语义。语法分析读入词法分析程序识别出的符号,根据给定的语法规则,识别出各个语法结构。 语义分析的任务是检查程序语义的正确性,解释程序结构的含义,语义分析包括检查变量是否有定义,变量在使用前是否具有值,数值是否溢出等。

语法分析完成之后,编译程序通常就依据语言的语义规则,利用语法制导技术把源程序翻译成某种中间代码。所谓中间代码是一种定义明确、便于处理、独立于计算机硬件的记号系统,可以认为是一种抽象机的程序 代码优化的主要任务是对前一阶段产生的中间代码进行等价变换,以便产生速度快、空间小的目标代码 编译的最后一个阶段是目标代码生成,其主要任务是把中间代码翻译成特定的机器指令或汇编程序 编译程序结构包括五个基本功能模块和两个辅助模块 6.编译划分成前端和后端。 编译前端的工作包括词法分析、语法分析、语义分析。编译前端只依赖于源程序,独立于目标计算机。前端进行分析 编译后端的工作主要是目标代码的生成和优化后端进行综合。独立于源程序,完全依赖于目标机器和中间代码。 把编译程序分为前端和后端的优点是: 可以优化配置不同的编译程序组合,实现编译重用,保持语言与机器的独立性。 7.汇编器把汇编语言代码翻译成一个特定的机器指令序列 第二章 1.符号,字母表,符号串,符号串的长度计算P18,子符号串的含义,符号串的简单运算XY,Xn, 2.符号串集合的概念,符号串集合的乘积运算,方幂运算,闭包与正闭包的概念P19,P20A0 ={ε} 3.重写规则,简称规则。非xx(V

词法分析实验报告

编译原理实验一 姓名:朱彦荣 学号:20132184 专业:软件工程2 实验题目:词法分析完成语言:C/C++ 上级系统:VC++6.0 日期:2015/11/7

词法分析 设计题目:手工设计c语言的词法分析器 (可以是c语言的子集) 设计容: 处理c语言源程序,过滤掉无用符号,判断源程序中单词的合法性,并分解出正确的单词,以二元组形式存放在文件中。 设计目的: 了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。 结果要求:课程设计报告。 完成日期:第十五周提交报告

一.分析 要想手工设计词法分析器,实现C语言子集的识别,就要明白什么是词法分析器,它的功能是什么。词法分析是编译程序进行编译时第一个要进行的任务,主要是对源程序进行编译预处理(去除注释、无用的回车换行找到包含的文件等)之后,对整个源程序进行分解,分解成一个个单词,这些单词有且只有五类,分别是标识符、保留字、常数、运算符、界符。以便为下面的语法分析和语义分析做准备。可以说词法分析面向的对象是单个的字符,目的是把它们组成有效的单词(字符串);而语法的分析则是利用词法分析的结果作为输入来分析是否符合语法规则并且进行语法制导下的语义分析,最后产生四元组(中间代码),进行优化(可有可无)之后最终生成目标代码。可见词法分析是所有后续工作的基础,如果这一步出错,比如明明是‘<=’却被拆分成‘<’和‘=’就会对下文造成不可挽回的影响。因此,在进行词法分析的时候一定要定义好这五种符号的集合。下面是我构造的一个C语言子集。 第一类:标识符 letter(letter | digit)* 无穷集 第二类:常数 (digit)+ 无穷集 第三类:保留字(32) auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while 第四类:界符‘/*’、‘//’、 () { } [ ] " " ' 等 第五类:运算符 <、<=、>、>=、=、+、-、*、/、^、等 对所有可数符号进行编码:

编译原理实验报告(语法分析器)

. 编译原理实验专业:13级网络工程

语法分析器1 一、实现方法描述 所给文法为G【E】; E->TE’ E’->+TE’|空 T->FT’ T’->*FT’|空 F->i|(E) 递归子程序法: 首先计算出五个非终结符的first集合follow集,然后根据五个产生式定义了五个函数。定义字符数组vocabulary来存储输入的句子,字符指针ch指向vocabulary。从非终结符E函数出发,如果首字符属于E的first集,则依次进入T函数和E’函数,开始递归调用。在每个函数中,都要判断指针所指字符是否属于该非终结符的first集,属于则根据产生式进入下一个函数进行调用,若first集中有空字符,还要判断是否属于该非终结符的follow集。以分号作为结束符。 二、实现代码 头文件shiyan3.h #include #include

#include using namespace std; #define num 100 char vocabulary[num]; char *ch; void judge_E(); void judge_EE(); void judge_T(); void judge_TT(); void judge_F(); 源文件 #include"shiyan3.h" void judge_E() { if(*ch==';') { cout<<"该句子符合此文法!"<

int a=0; cout<<"按1结束程序"<>a; if(a==1) exit(0); } else if(*ch=='('||*ch=='i') { judge_T(); judge_EE(); } else { cout<<"该句子不匹配此文法!"<>a; if(a==1) exit(0); }

河北工业大学数量经济学

河北工业大学 数量经济学 学科专业攻读硕士学位研究生培养方案 一、 培养目标 为适应我国社会主义现代化建设的需要,本专业硕士生培养面向现代化、面向世界、面向未来,培养德、智、体全面发展的具有创新精神和一定创新能力的数量经济学专业高层次专门人才。毕业生应达到的要求是: (一)努力学习马克思列宁主义、毛泽东思想、邓小平理论和“三个代表”重要思想,热爱祖国,遵纪守法,具有良好的思想品德和科学素养。 (二)掌握本学科坚实的基础理论、系统的专门知识以及本学科的现代化实验方法和技能,现代实验方法及技能,熟悉所从事研究领域的发展动向,具有从事科学研究工作或独立担负专门技术工作的能力。较熟练地掌握一门外国语。 (三)具有健康的身体和良好的心理素质。 二、 学制与学习年限 数量经济学专业硕士生的学制为二年半,其中课程学习时间为一年,毕业论文(即学位论文)工作时间为一年半。硕士生在校学习年限(含休学、延期)最长为四年。硕士生已完成规定课程学习和毕业论文工作确属成绩优异者,可以提出提前毕业申请,经研究生学院和上级有关部门批准后,最多提前半年毕业。硕士生如需延期毕业,必须在第五学期的十月份之前提出申请,由本人提出申请,经导师同意,并经研究生学院和上级有关部门批准。 三、 培养方式 (一)硕士生的培养实行导师负责制,采用导师与硕士生双向选择的办法确定硕士生的导师。 (二)课程学习和毕业论文工作并重,使硕士生既能掌握坚实的基础理论和系统的专门知识,又能掌握科学研究的基本方法和技能。 (三)注重因材施教,培养硕士生独立分析和解决问题的能力,注重对硕士生科学严谨的工作作风和创新能力的培养。 (四)在确保培养质量的前提下,经研究生学院批准,可与有关单位联合培养硕士生。 四、 主要研究方向 数量经济学学科以经济学理论为指导,利用经济模型对经济目标的影响因素进行

词法分析器实验报告

词法分析器实验报告 词法分析器设计 一、实验目的: 对C语言的一个子集设计并实现一个简单的词法分析器,掌握利用状 态转换图设计词法分析器的基本方法。利用该词法分析器完成对源程 序字符串的词法分析。输出形式是源程序的单词符号二元式的代码, 并保存到文件中。 二、实验内容: 1. 设计原理 词法分析的任务:从左至右逐个字符地对源程序进行扫描,产生一个个单词符号。 理论基础:有限自动机、正规文法、正规式 词法分析器(Lexical Analyzer) 又称扫描器(Scanner):执行词法分析的程序 2. 词法分析器的功能和输出形式 功能:输入源程序、输出单词符号 程序语言的单词符号一般分为以下五种:关键字、标识符、常数、运算符,界符 3. 输出的单词符号的表示形式: 单词种别用整数编码,关键字一字一种,标识符统归为一种,常数一种,各种符号各一种。 4. 词法分析器的结构 单词符号 5. 状态转换图实现

三、程序设计 1.总体模块设计 /*用来存储目标文件名*/ string file_name; /*提取文本文件中的信息。*/ string GetText(); /*获得一个单词符号,从位置i开始查找。并且有一个引用参数j,用来返回这个单词最后一个字符在str的位置。*/ string GetWord(string str,int i,int& j); /*这个函数用来除去字符串中连续的空格和换行 int DeleteNull(string str,int i); /*判断i当前所指的字符是否为一个分界符,是的话返回真,反之假*/ bool IsBoundary(string str,int i); /*判断i当前所指的字符是否为一个运算符,是的话返回真,反之假*/ bool IsOperation(string str,int i);

河北工业大学数值分析实验一

实验一 舍入误差与数值稳定性(2学时) 目的与要求: 1、通过上机编程,复习巩固以前所学程序设计语言; 2、通过上机计算,了解舍入误差所引起的数值不稳定性。 3、通过上机计算,了解运算次序对计算结果的影响,从而尽量避免大数吃小数的现象。 实验内容: ●通过正反两个实例的计算,了解利用计算机进行数值计算中舍入误 差所引起的数值不稳定性,深入理解初始小的舍入误差可能造成误差积累从而对计算结果的巨大影响。 ●通过实际编程,了解运算次序对计算结果的影响,了解实数运算符 合的结合律和分配律在计算机里不一定成立。 概要 舍入误差在计算方法中是一个很重要的概念。在实际计算中,如果选用了不同的算法,由于舍入误差的影响,将会得到截然不同的结果。因此,选取稳定的算法,在实际计算中是十分重要的。 程序与实例 例 1 对n = 0,1,2,…,20 计算定积分 y n = dx 5 x 1 n x ? + 算法1利用递推公式 y n = n 1 - 5y1n-n = 1,2,…,20

取 =+=?dx 5 x 11 00y ln6- ln5 ≈ 0.182 322 算法 2 利用递推公式 515n 1y 1n -=-y n n = 20,19,…,1 注意到 1051dx 51dx 5x dx 611261102010201020x x x =≤+≤=??? 取 730 008.0)126 11051(201y 20≈+≈ 上机实验:用两种不同的顺序计算644834.110000 12≈∑=-n n ,分析其误差的变化。 1) #include void main(void) { int n; float s=0,d; for(n=1;n<10001;n++) { d=1.0/(n*n); s=s+d; } printf("%f\n",s); } 2) #include void main(void) { int n; float c=0,d; for(n=10000;n>0;n--) { d=1.0/(n*n); c=c+d;

词法分析器实验报告

词法分析器实验报告 词法分析器实验报告实验目的: 设计、编制、调试一个词法分析子程序,识别单词,加深对词法分析原理的理 解。 实验要求: 该程序要实现的是一个读单词过程,从输入的源程序中,识别出各个具有独立 意义的单词,即基本保留字、标识符、常数、运算符、分界符五大类。并依次输出 各个单词的内部编码及单词符号自身值。 (一)实验内容 (1)功能描述:对给定的程序通过词法分析器弄够识别一个个单词符号,并以二 元式(单词种别码,单词符号的属性值)显示。而本程序则是通过对给定路径的文件 的分析后以单词符号和文字提示显示。 (2)程序结构描述: 函数调用格式: 函数调用格式函数名(实在参数表 ) Switch(m)、 isKey(String string)、isLetter(char c)、实参 isDigit(char c)、isOperator(char c) isKey(String string)、isLetter(char c)、调作为表达式 isDigit(char c)、isOperator(char c) 用 方 作为语句 getChar()、judgement()、 法 函数的递归调用 isOperator(char c) 、isLetter(char c)、isDigit(char c)

参数含义: 1 String string;存放读入的字符串 String str; 存放暂时读入的字符串 char ch; 存放读入的字符 int rs 判断读入的文件是否为空 char []data 存放文件中的数据 int m;通过switch用来判断字符类型, 函数之间的调用关系图: main Complier..judgement isOperate() M=0 getChar( ) isDigit() M=4 For(ch ) isLet ter() M=2 Switch(m) isKey() M=3 函数功能: Judgement()判断输入的字符并输出单词符号,返回值为空; getChar() 读取文件的,返回值为空; isLetter(char c) 判断读入的字符是否为字母的,返回值为Boolean类型; switch (m) 判断跳转输出返回值为空; isOperator(char c)判断是否为运算符的,返回值为Boolean类型; isKey(String string)判断是否为关键字的,返回值为Boolean类型; isDigit(char c) 判断读入的字符是否为数字的,返回值为Boolean类型。测试结果:

PL 0 语言编译器分析实验报告

PL/0 语言编译器分析实验 一、实验目的 通过阅读与解析一个实际编译器(PL/0语言编译器)的源代码,加深对编译阶段(包括词法分析、语法分析、语义分析、中间代码生成等)和编译系统软件结构的理解,并达到提高学生学习兴趣的目的。 二、实验要求 (1)要求掌握基本的程序设计技巧(C语言)和阅读较大规模程序源代码的能力; (2)理解并掌握编译过程的逻辑阶段及各逻辑阶段的功能; (3)要求能把握整个系统(PL/0语言编译器)的体系结构,各功能模块的功能,各模块之间的接口; (4)要求能总结出实现编译过程各逻辑阶段功能采用的具体算法与技 三、实验报告 pl/0语言是pascal语言的一个子集,我们这里分析的pl/0的编译程序包括了对pl/0语言源程序进行分析处理、编译生成类pcode代码,并在虚拟机上解释运行生成的类pcode代码的功能。 pl/0语言编译程序采用以语法分析为核心、一遍扫描的编译方法。词法分析和代码生成作为独立的子程序供语法分析程序调用。语法分析的同时,提供了出错报告和出错恢复的功能。在源程序没有错误编译通过的情况下,调用类pcode 解释程序解释执行生成的类pcode代码。 词法分析子程序分析: 词法分析子程序名为getsym,功能是从源程序中读出一个单词符号(token),把它的信息放入全局变量sym、id和num中,语法分析器需要单词时,直接从这三个变量中获得。(注意!语法分析器每次用完这三个变量的值就立即调用getsym 子程序获取新的单词供下一次使用。而不是在需要新单词时才调用getsym过程。)getsym过程通过反复调用getch子过程从源程序过获取字符,并把它们拼成单词。getch过程中使用了行缓冲区技术以提高程序运行效率。 词法分析器的分析过程: 调用getsym时,它通过getch过程从源程序中获得一个字符。如果这个字符是字母,则继续获取字符或数字,最终可以拼成一个单词,查保留字表,如果查到为保留字,则把sym变量赋成相应的保留字类型值;如果没有查到,则这个单词应是一个用户自定义的标识符(可能是变量名、常量名或是过程的名字),把sym 置为ident,把这个单词存入id变量。查保留字表时使用了二分法查找以提高效率。如果getch获得的字符是数字,则继续用getch获取数字,并把它们拼成一个整数,然后把sym置为number,并把拼成的数值放入num变量。如果识别出其它合

河北工业大学学术型硕士研究生培养方案

河北工业大学学术型硕士研究生培养方案 所属学院名称:经济管理学院 学科专业代码:120100 学科专业名称:管理科学与工程 一、培养目标 为适应我国社会主义现代化建设的需要,适应国家和区域经济发展对高层次人才的需求,硕士生培养要面向现代化、面向世界、面向未来,使之成为全面发展的具有一定创新能力的高层次专门人才: (一)努力学习马列主义、毛泽东思想、邓小平理论和“三个代表”重要思想,践行科学发展观,热爱祖国,遵纪守法,品德良好,学风严谨,明礼诚信,身心健康。 (二)掌握本学科坚实的基础理论、系统的专门知识和现代实验方法及技能,熟悉所从事研究领域的发展动向,具有从事科学研究工作或独立担负专门技术工作的能力。较熟练地掌握一门外国语。 二、学制与学习年限 管理科学与工程专业硕士生的学制为二年半,其中课程学习时间为一年,毕业论文(即学位论文)工作时间为一年半。硕士生在校学习年限(含休学、延期)最长为四年。 硕士生已完成规定课程学习和毕业论文工作确属成绩优异者,可以提出提前毕业申请,经研究生院和上级有关部门批准后,最多提前半年毕业。硕士生如需延期毕业,必须在第五学期的九月份之前由本人提出申请,经导师同意,并经研究生院和上级有关部门批准。 三、培养方式 (一)硕士生的培养以课程学习和毕业论文工作并重,促进课程学习和科学研究的有机结合,使硕士生既能掌握坚实的基础理论和系统的专门知识,又能掌握科学研究的基本方法和技能。强化创新能力的培养,重视对硕士生进行系统科研训练,要求并支持研究生更多地参与前沿性、高水平的科研工作,以高水平科学研究支撑高水平硕士生培养。 (二)硕士生的培养实行导师负责制,采用导师与硕士生双向选择的方式

东南大学编译原理词法分析器实验报告

词法分析设计 1. 实验目的 通过本实验的编程实践,了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用。 2. 实验内容 用C++语言实现对C++语言子集的源程序进行词法分析。通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值;若遇到错误则显示“Error”,然后跳过错误部分继续显示;同时进行标识符登记符号表的管理。 3. 实验原理 本次实验采用NFA->DFA->DFA0的过程: 对待分析的简单的词法(关键词/id/num/运算符/空白符等)先分别建立自己的FA,然后将他们用产生式连接起来并设置一个唯一的开始符,终结符不合并。 待分析的简单的词法 (1)关键字: "asm","auto","bool","break","case","catch","char","class","

const","const_cast"等 (2)界符(查表) ";",",","(",")","[","]","{","}" (3)运算符 "*","/","%","+","-","<<","=",">>","&","^","|","++","--"," +=","-=","*=","/=","%=","&=","^=","|=" relop: (4)其他单词是标识符(ID)和整型常数(SUM),通过正规式定义。 id/keywords: digit: (5)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。

编译原理--词法分析,语法分析,语义分析(C语言)

词法分析 #include #include #include using namespace std; #define MAXN 20000 int syn,p,sum,kk,m,n,row; double dsum,pos; char index[800],len;//记录指数形式的浮点数 char r[6][10]={"function","if","then","while","do","endfunc"}; char token[MAXN],s[MAXN]; char ch; bool is_letter(char c) { return c>='a' && c<='z' || c>='A' && c<='Z'; } bool is_digtial(char c) { return c>='0' && c<='9'; } bool is_dot(char c) { return c==',' || c==';'; } void identifier()//标示符的判断 { m=0; while(ch>='a' && ch<='z' || ch>='0' && ch<='9') { token[m++]=ch; ch=s[++p]; } token[m]='\0';

ch=s[--p]; syn=10; for(n=0;n<6;n++) if(strcmp(token,r[n])==0) { syn=n+1; break; } } void digit(bool positive)//数字的判断{ len=sum=0; ch=s[p]; while(ch>='0' && ch<='9') { sum=sum*10+ch-'0'; ch=s[++p]; } if(ch=='.') { dsum=sum; ch=s[++p]; pos=0.1; while(ch>='0' && ch<='9') { dsum=dsum+(ch-'0')*pos; pos=pos*0.1; ch=s[++p]; } if(ch=='e') { index[len++]=ch; ch=s[++p]; if(ch=='-' || ch=='+') { index[len++]=ch; ch=s[++p]; } if(!(ch>='0' && ch<='9')) { syn=-1; } else

词法分析器实验报告

词法分析器实验报告 一、实验目的及要求 本次实验通过用C语言设计、编制、调试一个词法分析子程序,识别单词,实现一个C语言词法分析器,经过此过程可以加深对编译器解析单词流的过程的了解。 运行环境: 硬件:windows xp 软件:visual c++6.0 二、实验步骤 1.查询资料,了解词法分析器的工作过程与原理。 2.分析题目,整理出基本设计思路。 3.实践编码,将设计思想转换用c语言编码实现,编译运行。 4.测试功能,多次设置包含不同字符,关键字的待解析文件,仔细察看运行结果,检测该分析器的分析结果是否正确。通过最终的测试发现问题,逐渐完善代码中设置的分析对象与关键字表,拓宽分析范围提高分析能力。 三、实验内容 本实验中将c语言单词符号分成了四类:关键字key(特别的将main说明为主函数)、普通标示符、常数和界符。将关键字初始化在一个字符型指针数组*key[]中,将界符分别由程序中的case列出。在词法分析过程中,关键字表和case列出的界符的内容是固定不变的(由程序中的初始化确定),因此,从源文件字符串中识别出现的关键字,界符只能从其中选取。标识符、常数是在分析过程中不断形成的。 对于一个具体源程序而言,在扫描字符串时识别出一个单词,若这个单词的类型是关键字、普通标示符、常数或界符中之一,那么就将此单词以文字说明的形式输出.每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直到整个源程序全部扫描完毕,从而形成相应的单词串。 输出形式例如:void $关键字

流程图、程序流程图:

程序: #include #include #include #include //定义关键字 char *Key[10]={"main","void","int","char","printf","scanf","else","if","return"}; char Word[20],ch; // 存储识别出的单词流 int IsAlpha(char c) { //判断是否为字母 if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A'))) return 1; else return 0; } int IsNum(char c){ //判断是否为数字 if(c>='0'&&c<='9') return 1; else return 0; } int IsKey(char *Word){ //识别关键字函数 int m,i; for(i=0;i<9;i++){ if((m=strcmp(Word,Key[i]))==0) { if(i==0) return 2; return 1; } } return 0; } void scanner(FILE *fp){ //扫描函数 char Word[20]={'\0'}; char ch; int i,c; ch=fgetc(fp); //获取字符,指针fp并自动指向下一个字符 if(IsAlpha(ch)){ //判断该字符是否是字母 Word[0]=ch; ch=fgetc(fp);

语义分析实验报告

实验三语法分析 309 科3 李君林 一.实验目的: 通过使用、剖析和扩充TINY语言的语义分析程序,掌握编译器的语义分析程序的构造方法。 二.实验内容 (一)运行TINY的语义分析程序 (二)扩充TINY的语法分析程序 提示: 考虑作用域(如:函数)和数组时可能需要修改符号表。 三.实验步骤 1.先读懂TINY语义程序(相关联的文件:) (1)buildSymtab(syntaxTree); 充TINY的语法分析程序 本次实验我首先将源程序实现的功能改成符合C_MINUS的符号表与类型检测 然后加入没申明调用与数组调用错误即数组没申明而调用数组类型。 四.实验结果 1.正确的测试程序 /**/ int gcd (int u,int v[]) { if(v==0) return u; else return gcd(v,u); } void main(void) { int x;int y; read x; x=y=2; while(x>0) y=y-1; write y; return (gcd(x,y)); }

/**/ 运行结果: 经检验测试程序代码无语义错误2.错误测试程序 /**/ int gcd (int u,int v[]) { if(v==0) return u; else return gcd(v,u); } void main(void) { int x;int y; read x; t=1; x=y=2; x[2]=2; while(x>0) y=y-1; write y; return (gcd(x,y)); } /**/ 实验结果:

编译原理语法分析器实验报告

编译原理语法分析器实验报告 班级: 学号: 姓名:

实验名称语法分析器 一、实验目的 1、根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。 2、本次实验的目的主要是加深对自上而下分析法的理解。 二、实验内容 [问题描述] 递归下降分析法: 0.定义部分:定义常量、变量、数据结构。 1.初始化:从文件将输入符号串输入到字符缓冲区中。 2.利用递归下降分析法分析,对每个非终结符编写函数,在主函数中调用文法开始符号的函数。 LL(1)分析法: 模块结构: 1、定义部分:定义常量、变量、数据结构。 2、初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体等); 3、运行程序:让程序分析一个text文件,判断输入的字符串是否符合文法定义的规则; 4、利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式 符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示简 单的错误提示。 [基本要求] 1. 对数据输入读取 2. 格式化输出分析结果 2.简单的程序实现词法分析 public static void main(String args[]) { LL l = new LL(); l.setP(); String input = ""; boolean flag = true;

while (flag) { try { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); System.out.println(); System.out.print("请输入字符串(输入exit退出):"); input = br.readLine(); } catch (Exception e) { e.printStackTrace(); } if(input.equals("exit")){ flag = false; }else{ l.setInputString(input); l.setCount(1, 1, 0, 0); l.setFenxi(); System.out.println(); System.out.println("分析过程"); System.out.println("----------------------------------------------------------------------"); System.out.println(" 步骤| 分析栈 | 剩余输入串| 所用产生式"); System.out.println("----------------------------------------------------------------------"); boolean b = l.judge(); System.out.println("----------------------------------------------------------------------"); if(b){ System.out.println("您输入的字符串"+input+"是该文法的一个句子"); }else{ System.out.println("您输入的字符串"+input+"有词法错误!");

河北工业大学 生物医学工程.

河北工业大学生物医学工程 学科专业攻读硕士学位研究生培养方案 一、培养目标 努力学习、掌握马列主义、毛泽东思想和邓小平理论,坚持四项基本原则,牢固树立科学的世界观和方法论;热爱祖国;遵纪守法,品德优良;勤奋学习,刻苦钻研,勇于创新,努力掌握现代科学文化知识,成为思想道德素质、科学文化素质、身体心理素质全面发展的高层次人才。 具有本学科坚实宽广的理论基础和系统深入的专门知识,全面深入了解本学科有关研究领域的现状、发展方向。 具有独立从事本学科的科学研究或解决工程中技术课题的能力。具有严谨求实的科学态度和工作作风。 至少掌握一门外国语,能熟练地阅读本学科的外文资料,具有一定的写作能力和学术交流的能力。 二、学制与学习年限 培养年限为二年半,其中课程学习时间为一年,学位论文工作时间为一年半。无特殊情况不允许延期。若需延期,本人必须提前五个月递交申请,经导师同意、所在学院主管院长审批后报研究生学院批准,并向学校交纳2000元培养费后,可延期半年。延期期间,停发该硕士生的普通奖学金。未被批准而逾期者,按结业处理。 本校定向培养的硕士生,若承担一定的教学和科研工作量,经教学和科研部门证明,可申请延期一年。 硕士生提前完成课程学习和学位论文工作,可以申请提前进行学位论文答辩。申请者需提前五个月写出书面申请,经导师同意、所在学院主管院长审批、报研究生学院批准后,可提前答辩和毕业。提前时间一般不得超过半年。 三、培养方式 硕士生的培养实行导师负责制,导师可指定讲师以上职称的教师作为副导师,协助导师指导硕士生的学习和科研实践。 硕士生的课程学习以听课、教师辅导与自主学习相结合的方式进行,科研能力的培养以参加科研课题的研究与撰写论文相结合的方式进行,鼓励硕士生积极参加国内

编译原理词法分析器语法分析器实验报告

(此文档为word格式,下载后您可任意编辑修改!) 编译技术 班级网络0802 学号 姓名叶晨舟 指导老师朱玉全 2011年 7 月 4 日

一、目的 编译技术是理论与实践并重的课程,而其实验课要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。 二、任务及要求 基本要求: 1.词法分析器产生下述小语言的单词序列 这个小语言的所有的单词符号,以及它们的种别编码和内部值如下表: 单词符号种别编码助记符内码值 DIM IF DO STOP END 标识符 常数(整)= + * ** , ( )1 2 3 4 5 6 7 8 9 10 11 12 13 14 $DIM $IF $DO $STOP $END $ID $INT $ASSIGN $PLUS $STAR $POWER $COMMA $LPAR $RPAR - - - - - - 内部字符串 标准二进形式 - - - - - - 对于这个小语言,有几点重要的限制: 首先,所有的关键字(如IF﹑WHILE等)都是“保留字”。所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。例如,下面的写法是绝对禁止的: IF(5)=x 其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。也就是说,对于关键字不专设对应的转换图。但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。 再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。例如,一个条件语句应写为 IF i>0 i= 1;

相关文档
最新文档