(实验报告模板)实验3:语义分析与中间代码生成

(实验报告模板)实验3:语义分析与中间代码生成
(实验报告模板)实验3:语义分析与中间代码生成

实验报告学院(系)名称:计算机与通信工程学院

【实验过程记录(源程序、测试用例、测试结果及心得体会等)】

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

语义分析实验报告 一、实验目的: 通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法。 二、实验要求: 采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。 三、算法思想: 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);

红外光谱(FTIR)实验报告

红外光谱仪调查及实验报告 第一部分红外光谱仪调查 1.1 简介 傅里叶红外光谱仪: 全名为傅里叶变换红外光谱仪(Fourier Transform Infrared Spectrometer,FTIR Spectrometer),是基于对干涉后的红外光进行傅里叶变换的原理而开发的红外光谱仪,主要由红外光源、光阑、干涉仪(分束器、动镜、定镜)、样品室、检测器以及各种红外反射镜、激光器、控制电路板和电源组成。傅里叶红外光谱仪不同于色散型红外分光的原理,可以对样品进行定性和定量分析,广泛应用于医药化工、地矿、石油、煤炭、环保、海关、宝石鉴定、刑侦鉴定等领域。 滤光片型近红外光谱仪器: 滤光片型近红外光谱仪器以滤光片作为分光系统,即采用滤光片作为单色光器件。滤光片型近红外光谱仪器可分为固定式滤光片和可调式滤光片两种形式,其中固定滤光片型的仪器时近红外光谱仪最早的设计形式。仪器工作时,由光源发出的光通过滤光片后得到一宽带的单色光,与样品作用后到达检测器。 色散型近红外光谱仪器: 色散型近红外光谱仪器的分光元件可以是棱镜或光栅。为获得较高分辨率,现代色散型仪器中多采用全息光栅作为分光元件,扫描型仪器通过光栅的转动,使单色光按照波长的高低依次通过样品,进入检测器检测。根据样品的物态特性,可以选择不同的测样器件进行投射或反射分析。 傅里叶变换型近红外光谱仪器: 傅里叶变换近红外分光光度计简称为傅里叶变换光谱仪,它利用干涉图与光谱图之间的对应关系,通过测量干涉图并对干涉图进行傅里叶积分变换的方法来测定和研究近红外光谱。其基本组成包括五部分:①分析光发生系统,由光源、分束器、样品等组成,用以产生负载了样品信息的分析光;②以传统的麦克尔逊干涉仪为代表的干涉仪,以及以后的各类改进型干涉仪,其作用是使光源发出的光分为两束后,造成一定的光程差,用以产生空间(时间)域中表达的分析光,即干涉光;③检测器,用以检测干涉光;④采

实验三 自下而上语法分析及语义分析

实验三自下而上语法分析及语义分析 一、实验目的: 通过本实验掌握LR分析器的构造过程,并根据语法制导翻译,掌握属性文法的自下而上计算的过程。 二、实验学时: 4学时。 三、实验内容 根据给出的简单表达式的语法构成规则(见五),编制LR分析程序,要求能对用给定的语法规则书写的源程序进行语法分析和语义分析。 对于正确的表达式,给出表达式的值。 对于错误的表达式,给出出错位置。 四、实验方法 采用LR分析法。 首先给出S-属性文法的定义(为简便起见,每个文法符号只设置一个综合属性,即该文法符号所代表的表达式的值。属性文法的定义可参照书137页表6.1),并将其改造成用LR分析实现时的语义分析动作(可参照书145页表6.5)。 接下来给出LR分析表。 然后程序的具体实现: ●LR分析表可用二维数组(或其他)实现。 ●添加一个val栈作为语义分析实现的工具。 ●编写总控程序,实现语法分析和语义分析的过程。 注:对于整数的识别可以借助实验1。 五、文法定义 简单的表达式文法如下: E->E+T|E-T|T T->T*F|T/F|F F->(E)|i 上式中,i 为整数。 六、处理程序例 例1: 正确源程序例: 23+(45+4)* 40分析结果应为:正确的表达式。其值为:1983 例2: 错误源程序例: 5+(56+)-24 分析结果应为:错误的表达式:出错位置为)

附录:源程序 #include #include"string.h" #include using namespace std; #define R 30 #define C 20 typedef struct elem { char e[4]; }Elem; //ACTION表与GoTo表中的元素类型 Elem LR[R][C]; //存放ACTION表与GoTo表中的内容 typedef struct out { int order; //序号 int state[10]; //状态栈 char sign[30]; //符号栈 char grasen[20]; //产生式 char input[30]; //输入串 char explen[50]; //解释说明 }OutNode; //输出结果中每一行的类型 OutNode out[20]; //存放输出结果 char Sentence[20]; //存放文法的一个句子 char GramSent[10][20]; //存放文法的一组产生式

无水乙醇红外光谱分析实验报告

竭诚为您提供优质文档/双击可除无水乙醇红外光谱分析实验报告 篇一:红外光谱分析实验报告 一、【实验题目】 红外光谱分析实验 二、【实验目的】 1.了解傅立叶变换红外光谱仪的基本构造及工作原理 2.掌握红外光谱分析的基础实验技术 3.学会用傅立叶变换红外光谱仪进行样品测试 4.掌握几种常用的红外光谱解析方法 三、【实验要求】 利用所学过的红外光谱知识对碳酸钙、聚乙烯醇、丙三醇、乙醇的定性分析制定出合理的样品制备方法;并对其谱图给出基本的解析。 四、【实验原理】 红外光是一种波长介于可见光区和微波区之间的电磁波谱。波长在0.78~300μm。通常又把这个波段分成三个区域,即近红外区:波长在0.78~2.5μm(波数在12820~

4000cm-1),又称泛频区;中红外区:波长在2.5~25μm(波数在4000~400cm-1),又称基频区;远红外区:波长在25~300μm(波数在400~33cm-1),又称转动区。其中中红外区是研究、应用最多的区域。 红外区的光谱除用波长λ表征外,更常用波数(wavenumber)σ表征。波数是波长的倒数,表示单位厘米波长内所含波的数目。其关系式为: 作为红外光谱的特点,首先是应用面广,提供信息多且具有特征性,故把红外光谱通称为"分子指纹"。它最广泛的应用还在于对物质的化学组成进行分析。用红外光谱法可以根据光谱中吸收峰的位置和形状来推断未知物的结构,依照特征吸收峰的强度来测定混合物中各组分的含量。其次,它不受样品相态的限制,无论是固态、液态以及气态都能直接测定,甚至对一些表面涂层和不溶、不熔融的弹性体(如橡胶)也可直接获得其光谱。它也不受熔点、沸点和蒸气压的限制,样品用量少且可回收,是属于非破坏分析。而作为红外光谱的测定工具-红外光谱仪,与其他近代分析仪器(如核磁共振波谱仪、质谱仪 等)比较,构造简单,操作方便,价格便宜。因此,它已成为现代结构化学、分析化学最常用和不可缺少的工具。根据红外光谱与分子结构的关系,谱图中每一个特征吸收谱带都对应于某化合物的质点或基团振动的形式。因此,特征吸收

词法分析实验报告

编译原理实验一 姓名:朱彦荣 学号: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 第四类:界符‘/*’、‘//’、 () { } [ ] " " ' 等 第五类:运算符 <、<=、>、>=、=、+、-、*、/、^、等 对所有可数符号进行编码:

红外光谱分析实验报告

仪器分析实验 实验名称:红外光谱分析实验 学院:化学工程学院专业:化学工程与工艺班级: 姓名:学号: 指导教师: 日期:

一、 实验目的 1、掌握溴化钾压片法制备固体样品的方法; 2、学习并掌握美国尼高立IR-6700型红外光谱仪的使用方法; 3、初步学会对红外吸收光谱图的解析。 二、实验原理 红外光是一种波长介于可见光区和微波区之间的电磁波谱。波长在0.75~1000μm 。通常又把这个波段分成三个区域,即近红外区:波长在0.75~2.5μm (波数在13300~4000cm -1),又称泛频区;中红外区:波长在 2.5~50μm (波数在4000~200cm -1),又称振动区;远红外区:波长在50~1000μm (波数在200~10cm -1),又称转动区。其中中红外区是研究、应用最多的区域。 红外区的光谱除用波长λ表征外,更常用波数σ表征。波数是波长的倒数,表示单位厘米波长内所含波的数目。其关系式为: )(10)(4 1 cm cm λσ=- 三、仪器和试剂 1、仪器: 美国尼高立IR-6700 2、试剂: 溴化钾,聚乙烯,苯甲酸 3、傅立叶红外光谱仪(FTIR)的构造及工作原理 计算机检测器样品室干涉仪光源?→??→??→??→? 四、实验步骤 1、打开红外光谱仪并稳定大概5分钟,同时进入对应的计算机工作站。 2、波数检验:将聚乙烯薄膜插入红外光谱仪的样品池处,从4000-650cm -1进行 波数扫描,得到吸收光谱。然后将所得的谱图与计算机上的标准谱图进行匹配,分析得到最吻合的图谱,即可判断物质结构。 3、测绘苯甲酸的红外吸收光谱——溴化钾压片法 取1-2mg 苯甲酸,加入在红外灯下烘干的100-200mg 溴化钾粉末,在玛瑙研钵中充分磨细(颗粒约2μm ),使之混合均匀。取出约80mg 混合物均匀铺洒在干净的压模内,于压片机上制成直径透明薄片。将此片装于固体样品架上,样品架插入红外光谱仪的样品池处,从4000-400cm -1进行波数扫描,得到吸收光谱。然后将所得的谱图与计算机上的标准谱图进行匹配。 4、结束实验,关闭工作站和红外光谱仪。

固体红外光谱实验报告

KBr压片法测定固体样品的红外光谱 一、实验目的 1、掌握红外光谱分析法的基本原理。 2、掌握Nicolet5700智能傅立叶红外光谱仪的操作方法。 3、掌握用KBr压片法制备固体样品进行红外光谱测定的技术和方法。 4、了解基本且常用的KBr压片制样技术在红外光谱测定中的应用。 5、通过谱图解析及标准谱图的检索,了解由红外光谱鉴定未知物的一般过程。 二、仪器及试剂 1 仪器:美国热电公司Nicolet5700智能傅立叶红外光谱仪;HY-12型手动液压式红外压片机及配套压片模具;磁性样品架;红外灯干燥器;玛瑙研钵。 2 试剂:苯甲酸样品(AR);KBr(光谱纯);无水丙酮;无水乙醇。 三、实验原理 红外吸收光谱法是通过研究物质结构与红外吸收光谱间的关系,来对物质进行分析的,红外光谱可以用吸收峰谱带的位置和峰的强度加以表征。测定未知物结构是红外光谱定性分析的一个重要用途。根据实验所测绘的红外光谱图的吸收峰位置、强度和形状,利用基团振动频率与分子结构的关系,来确定吸收带的归属,确认分子中所含的基团或键,并推断分子的结构,鉴定的步骤如下: (1)对样品做初步了解,如样品的纯度、外观、来源及元素分析结果,及物理性质(分子量、沸点、熔点)。 (2)确定未知物不饱和度,以推测化合物可能的结构; (3)图谱解析 ①首先在官能团区(4000~1300cm-1)搜寻官能团的特征伸缩振动; ②再根据“指纹区”(1300~400cm-1)的吸收情况,进一步确认该基团的存在以及与其它基团的结合方式。

图1 仪器的基本结构 四、实验步骤 1. 红外光谱仪的准备 (1)打开红外光谱仪电源开关,待仪器稳定30 分钟以上,方可测定; (2)打开电脑,选择win98系统,打开OMNIC E.S.P软件;在Collect菜单下的Experiment Set-up 中设置实验参数; (3)实验参数设置:分辨率 4 cm-1,扫描次数32,扫描范围4000-400 cm-1;纵坐标为Transmittance 2.固体样品的制备 (1)取干燥的苯甲酸试样约1mg于干净的玛瑙研钵中,在红外灯下研磨成细粉,再加入约150mg干燥且已研磨成细粉的KBr一起研磨至二者完全混合均匀,混合物粒度约为2μm以下(样品与KBr的比例为1:100~1:200)。 (2)取适量的混合样品于干净的压片模具中,堆积均匀,用手压式压片机用力加压约30s,制成透明试样薄片。 3.样品的红外光谱测定 (3)小心取出试样薄片,装在磁性样品架上,放入Nicolet5700智能傅立叶红外光谱仪的样品室中,在选择的仪器程序下进行测定,通常先测KBr的空白

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变量。如果识别出其它合

实验1-3 《编译原理》词法分析程序设计方案

实验1-3 《编译原理》S语言词法分析程序设计方案 一、实验目的 了解词法分析程序的两种设计方法之一:根据状态转换图直接编程的方式; 二、实验内容 1.根据状态转换图直接编程 编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件输出。在此,词法分析程序作为单独的一遍,如下图所示。 具体任务有: (1)组织源程序的输入 (2)拼出单词并查找其类别编号,形成二元式输出,得到单词流文件 (3)删除注释、空格和无用符号 (4)发现并定位词法错误,需要输出错误的位置在源程序中的第几行。将错误信息输出到屏幕上。 (5)对于普通标识符和常量,分别建立标识符表和常量表(使用线性表存储),当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。 标识符表结构:变量名,类型(整型、实型、字符型),分配的数据区地址 注:词法分析阶段只填写变量名,其它部分在语法分析、语义分析、代码生成等阶段逐步填入。 常量表结构:常量名,常量值 三、实验要求 1.能对任何S语言源程序进行分析 在运行词法分析程序时,应该用问答形式输入要被分析的S源语言程序的文件名,然后对该程序完成词法分析任务。 2.能检查并处理某些词法分析错误 词法分析程序能给出的错误信息包括:总的出错个数,每个错误所在的行号,错误的编号及错误信息。 本实验要求处理以下两种错误(编号分别为1,2): 1:非法字符:单词表中不存在的字符处理为非法字符,处理方式是删除该字符,给出错误信息,“某某字符非法”。 2:源程序文件结束而注释未结束。注释格式为:/* …… */ 四、保留字和特殊符号表

语义分析实验报告

实验三语法分析 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、红外光谱法特点: 由于许多化合物在红外区域产生特征光谱,因此红外光谱法广 泛应用于这些物质的定性和定量分析,特别是对聚合物的定性 分析,用其他化学和物理方法较为困难,而红外光谱法简便易 行,特别适用于聚合物分析。 2、红外光谱的产生和表示 红外光谱定义:分子吸收红外光引起的振动能级跃迁和转动能级跃 迁而产生的吸收信号。 分子发生振动能级跃迁需要的能量对应光波的红外区域分类为: i.近红外区:10000-4000cm-1 ⅱ.中红外区:4000-400cm-1——最为常用,大多数化合物的化键振 动能级的跃迁发生在这一区域。 ⅲ.远红外区:400-10cm-1 产生红外吸收光谱的必要条件: 1)分子振动:只有在振动过程中产生偶极矩变化时才能吸收红外辐射。 ⅰ.双原子分子的振动:(一种振动方式)理想状态模型——把两个 原子看做由弹簧连接的两个质点,用此来 描述即伸缩振动;

图1 双原子分子的振动模型 ⅱ.多原子分子的振动:(简正振动,依据键长和键角变化分两大类) 伸缩振动:对称伸缩振动 反对称伸缩振动 弯曲振动:面内弯曲:剪切式振动 (变形振动)平面摇摆振动 面外弯曲振动:扭曲振动 非平面摇摆振动 ※同一种键型,不对称伸缩振动频率大于对称伸缩振动频率,伸缩振动频率大于弯曲振动频率。 ※当振动频率和入射光的频率一致时,入射光就被吸收,因而同一基团基本上总是相对稳定地在某一特定范围内出现吸收峰。ⅲ.分子振动频率: 基频吸收(强吸收峰):基态到第一激发态所产生分子振动 的振动频率。 倍频吸收(弱吸收峰):基态到第二激发态,比基频高一倍 处弱吸收,振动频率约为基频两倍。 组频吸收(复合频吸收):多分子振动间相互作用,2个或2

红外光谱实验报告

一、实验目的 1、掌握溴化钾压片法制备固体样品的方法; 2、学习并掌握美国尼高立IR-6700型红外光谱仪的使用方法; 3、初步学会对红外吸收光谱图的解析。 二、实验原理 红外光是一种波长介于可见光区和微波区之间的电磁波谱。波长在~1000μm。通常又把这个波段分成三个区域,即近红外区:波长在~μm(波数在13300~4000cm-1),又称泛频区;中红外区:波长在~50μm(波数在4000~200cm-1),又称振动区;远红外区:波长在50~1000μm(波数在200~10cm-1),又称转动区。其中中红外区是研究、应用最多的区域。 红外区的光谱除用波长λ表征外,更常用波数σ表征。波数是波长的倒数,表示单位厘米波长内所含波的数目。其关系式为: 三、仪器和试剂 1、仪器:美国尼高立IR-6700 2、试剂:溴化钾,聚乙烯,苯甲酸 3、傅立叶红外光谱仪(FTIR)的构造及工作原理 四、实验步骤

1、波数检验:将聚苯乙烯薄膜插入红外光谱仪的样品池处,从4000-650cm-1进行波数扫描,得到吸收光谱。 2、测绘苯甲酸的红外吸收光谱——溴化钾压片法 取1-2mg苯甲酸,加入在红外灯下烘干的100-200mg溴化钾粉末,在玛瑙研钵中充分磨细(颗粒约2μm),使之混合均匀。取出约80mg混合物均匀铺洒在干净的压模内,于压片机上制成直径透明薄片。将此片装于固体样品架上,样品架插入红外光谱仪的样品池处,从4000-400cm-1进行波数扫描,得到吸收光谱。 五、注意事项 1、实验室环境应该保持干燥; 2、确保样品与药品的纯度与干燥度; 3、在制备样品的时候要迅速以防止其吸收过多的水分,影响实验结果; 4、试样放入仪器的时候动作要迅速,避免当中的空气流动,影响实验的准确性。 5、溴化钾压片的过程中,粉末要在研钵中充分磨细,且于压片机上制得的透明薄片厚度要适当。 六、数据处理 该图中在波数700~800、1500~1600、2800~2975左右有峰形,证明了该物质中可能有烯烃的C-H变形振动,C-C间的伸缩振动,同时也拥有烷烃的C-H伸缩振动,推测为聚乙烯的红外谱图。 谱带位置/cm-1吸收基团的振动形式 )n—C— n≥4) (—C—(CH 2

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

实验三语义分析程序实现 一、实验设计 在实现词法、语法分析程序的基础上,编写相应的语义子程序,进行语义处理,加深对语法制导翻译原理的理解,进一步掌握将语法分析所识别的语法范畴变换为某种中间代码(四元式)的语义分析方法。 基本实验题目:对文法G2[<算术表达式>]中的产生式添加语义处理子程序,完成运算对象是简单变量(标识符)和无符号数的四则运算的计值处理,将输入的四则运算转换为四元式形式的中间代码。 语法制导翻译模式是在语法分析的基础上,增加语义操作来实现的,实际上是对前后文无关文法的一种扩展。一般而言,首先需要根据进行的语义分析工作,完成对给定文法的必要拆分和语义动作的编写,从而为每一个产生式都配备相应的语义子程序,以便在进行语法分析的同时进行语义解释。即在语法分析过程中,每当用一个产生式进行推导或归约时,语法分析程序除执行相应的语法分析动作之外,还要调用相应的语义子程序,以便完成生成中间代码、查填有关表格、检查并报告源程序中的语义错误等工作。每个语义子程序需指明相应产生式中各个符号的具体含义,并规定使用该产生式进行分析时所应采取的语义动作。这样,语法制导翻译程序在对源程序从左到右进行的一遍扫描中,既完成语法分析任务,又完成语义分析和中间代码生成方面的工作。本实验要求从编译器的整体设计出发,重点通过对实验二中语法分析程序的扩展,完成一个编译器前端程序的编写、调试和测试工作,形成一个将源程序翻译为中间代码序列的编译系统。 二、程序代码 在词法分析和语法分析的基础上,完成了语义的分析,同样采用了头文件的形式,在VC++6.0中运行 #include #include #include #include #include #include"cifa.h" #include"fenxibiao.h" # define PL 15 //+ # define MI 16 //-

编译原理实验三-自下而上语法分析及语义分析.docx

上海电力学院 编译原理 课程实验报告 实验名称:实验三自下而上语法分析及语义分析 院系:计算机科学和技术学院 专业年级: 学生姓名:学号: 指导老师: 实验日期: 实验三自上而下的语法分析 一、实验目的: 通过本实验掌握LR分析器的构造过程,并根据语法制导翻译,掌握属性文法的自下而上计算的过程。 二、实验学时: 4学时。 三、实验内容

根据给出的简单表达式的语法构成规则(见五),编制LR分析程序,要求能对用给定的语法规则书写的源程序进行语法分析和语义分析。 对于正确的表达式,给出表达式的值。 对于错误的表达式,给出出错位置。 四、实验方法 采用LR分析法。 首先给出S-属性文法的定义(为简便起见,每个文法符号只设置一个综合属性,即该文法符号所代表的表达式的值。属性文法的定义可参照书137页表6.1),并将其改造成用LR分析实现时的语义分析动作(可参照书145页表6.5)。 接下来给出LR分析表。 然后程序的具体实现: ● LR分析表可用二维数组(或其他)实现。 ●添加一个val栈作为语义分析实现的工具。 ●编写总控程序,实现语法分析和语义分析的过程。 注:对于整数的识别可以借助实验1。 五、文法定义 简单的表达式文法如下: (1)E->E+T (2)E->E-T (3)E->T

(4)T->T*F (5)T->T/F (6)T->F (7)F->(E) (8)F->i 状态ACTION(动作)GOTO(转换) i + - * / ( ) # E T F 0 S5 S4 1 2 3 1 S6 S1 2 acc 2 R 3 R3 S7 S13 R3 R3 3 R6 R6 R6 R6 R6 R6 4 S 5 S4 8 2 3 5 R8 R8 R8 R8 R8 R8 6 S5 S4 9 3 7 S5 S4 10 8 S6 R12 S11 9 R1 R1 S7 S13 R1 R1 10 R4 R4 R4 R4 R4 R4 11 R7 R7 R7 R7 R7 R7 12 S5 S4 14 3 13 S5 S4 15 14 R2 R2 S7 S13 R2 R2 15 R5 R5 R5 R5 R5 R5 五、处理程序例和处理结果例 示例1:20133191*(20133191+3191)+ 3191#

语义分析实验报告.doc

实验三语法分析 20080810309 科3 李君林 一.实验目的: 通过使用、剖析和扩充TINY语言的语义分析程序,掌握编译器的语义分析程序的构造方法。 二.实验内容 (一)运行TINY的语义分析程序 (二)扩充TINY的语法分析程序 提示: 考虑作用域(如:函数)和数组时可能需要修改符号表。 三.实验步骤 1.先读懂TINY语义程序(相关联的文件:MAIN.C ANALYZE.C ANALYZE.H) (1)buildSymtab(syntaxTree); //根据语法树建立符号表 通过递归调用traverse(syntaxTree,insertNode,nullProc); 进行static void insertNode( TreeNode * t),这样将遇到与ID有关的Node信息通过void st_insert( char * name, int lineno, int loc,int len )加入到hashTable[h]数据结构中。 (2)接着调用typeCheck(syntaxTree);进行类型检测 通过递归调用traverse(syntaxTree,nullProc,checkNode);将语法树遍历,然后调用static void checkNode(TreeNode * t)对节点进行类型检测 2.扩充TINY的语法分析程序 本次实验我首先将源程序实现的功能改成符合C_MINUS的符号表与类型检测然后加入没申明调用与数组调用错误即数组没申明而调用数组类型。 四.实验结果 1.正确的测试程序 /**/ int gcd (int u,int v[]) { if(v==0) return u; else return gcd(v,u); } void main(void)

分析实验报告-红外光谱测定苯甲酸---最终版

华南师范大学实验报告 学生姓名:杨秀琼学号:20082401129 专业:化学年级班级:08化二 实验类型:综合实验时间:2010/3/25 实验指导老师郭长娟老师实验评分: 红外光谱法测定苯甲酸 一、[ 实验目的] 1.了解苯甲酸的红外光谱特征,通过实践掌握有机化合物的红外光谱鉴定方法。 2.练习用KBr压片法制备样品的方法。 3.了解红外光谱仪的结构,熟悉红外光谱仪的使用方法。 二、[实验原理] 红外吸收光谱分析方法主要是依据分子内部原子间的相对振动和分子转动等信息进行测定。不同的化学键或官能团,其振动能级从基态跃迁到激发态所需的能量不同,因此要吸收不同的红外光,将在不同波长出现吸收峰,从而形成红外光谱。 三、[仪器与试剂] 仪器:傅里叶红外光谱仪 软件:IRSolution; 压片机、膜具和干燥器;玛瑙研钵、药匙、镜纸及红外灯。 试剂:苯甲酸粉末、光谱纯KBr粉末。 四、[实验步骤]

1.将所有的膜具用酒精擦拭干净,用电吹风先烘干,再在红外灯下烘烤; 2.用电子天平称量一定量的KBr粉末(每份约200mg),在红外灯下研钵中加入KBr进行研磨,直至KBr粉末颗粒足够小(注意KBr粉末的干燥); 3.将KBr装入膜具,在压片机上压片,压力上升至14Mpa左右,稳定30S; 4.打开傅里叶红外光谱仪,将压好的薄片装机,设置背景的各项参数之后,进行测试,得到背景的扫描谱图。 5. 取一定量的样品(样品:大约1.2-1.3g)放入研钵中研细,然后重复上述步骤得到试样的薄片; 6.将样品的薄片固定好,装入红外光谱仪,设置样品测试的各项参数后进行测试,得到苯甲酸的红外谱图; 7.然后删掉背景谱图,对样品谱图进行简单的编辑和修饰,并标注出吸收峰值,保存试样的红外谱图; 8.谱图分析:在测定的谱图中根据出现吸收带的位置、强度和形状,利用各种基团特征吸收的知识,确定吸收带的归属。若出现了某基团的吸收,应该查看该基团的相关峰是否也存在。应用谱图分析,结合其他分析数据,可以确定化合物的结构单元,在按照化学知识和解谱经验,提出可能的结构式。然后查找该化合物标准谱图来验证推定的化合物的结构式。 五、[结果与分析]

语义分析与中间代码生成程序的设计原理与实现技术__实验报告与源代码_北京交通大学

语义分析及中间代码生成程序设计原理与实现技术 XXX 1028XXX2 计科1XXX班 1.程序功能描述 完成以下描述赋值语句和算术表达式文法的语法制导生成中间代码四元式的过 程。 G[A]:A→V:=E E→E+T∣E-T∣ T→T*F∣T/F∣F F→(E)∣i V→i 说明:终结符号i 为用户定义的简单变量,即标识符的定义。 2. 设计要求 (1)给出每一产生式对应的语义动作;(2)设计中间代码四元式的结构(暂不与符号表有关)。(3)输入串应是词法分析的输出二元式序列,即某算术表达式“实验项目一”的输出结果。输出为输入串的四元式序列中间文件。(4)设计两个测试用例(尽可能完备),并给出程序执行结果四元式序列。 3.主要数据结构描述: 本程序采用的是算符优先文法,文法以及算符优先矩阵是根据第四次实验来修改的,所以主要的数据结构也跟第四次差不多,主要为文法的表示,FirstVT集和LastVT 集以及算符优先矩阵:

算符优先矩阵采用二维字符数组表示的: char mtr[9][9]; //算符优先矩阵 4.程序结构描述: 本程序一共有8功能函数: void get(); //获取文法 void print(); //打印文法 void fun(); //求FirstVT 和LastVT void matrix(); //求算符优先矩阵 void test(); //测试文法 int cmp(char a,char b); 比较两个运算符的优先级 1 0 -1 void out(char now,int avg1,int avg2); //打印四元式 int ope(char op,int a,int b); //定义四元式计算方法 5.实验代码 详见附件 6.程序测试 6.1 功能测试 程序运行显示如下功能菜单:

无水乙醇红外光谱分析实验报告

竭诚为您提供优质文档/双击可除 无水乙醇红外光谱分析实验报告 篇一:红外光谱分析实验报告 一、【实验题目】 红外光谱分析实验 二、【实验目的】 1.了解傅立叶变换红外光谱仪的基本构造及工作原理 2.掌握红外光谱分析的基础实验技术 3.学会用傅立叶变换红外光谱仪进行样品测试 4.掌握几种常用的红外光谱解析方法 三、【实验要求】 利用所学过的红外光谱知识对碳酸钙、聚乙烯醇、丙三醇、乙醇的定性分析制定出合理的样品制备方法;并对其谱图给出基本的解析。 四、【实验原理】红外光是一种波长介于可见光区和微波区之间的电磁 波谱。波长在0.78?300卩m通常又把这个波段分成三个区域, 即近红外区:波长在0.78?2.5卩m (波数在12820?

4000cm-1),又称泛频区;中红外区:波长在2.5?25卩m(波数在4000?400cm-1),又称基频区;远红外区:波长在25?300卩m(波数在400?33cm-1)又称转动区。其中中红外区是研究、应用最多的区域。 红外区的光谱除用波长入表征外,更常用波数 (wavenumber)c表征。波数是波长的倒数,表示单位厘米波长内所含波的数目。其关系式为: 作为红外光谱的特点,首先是应用面广,提供信息多且具有特征性,故把红外光谱通称为"分子指纹"。它最广泛的应用还在于对物质的化学组成进行分析。用红外光谱法可以根据光谱中吸收峰的位置和形状来推断未知物的结构,依照特征吸收峰的强度来测定混合物中各组分的含量。其次,它不受样品相态的限制,无论是固态、液态以及气态都能直接测定,甚至对一些表面涂层和不溶、不熔融的弹性体(如橡胶)也可直接获得其光谱。它也不受熔点、沸点和蒸气压的限制,样品用量少且可回收,是属于非破坏分析。而作为红外光谱的测定工具-红外光谱仪,与其他近代分析仪器(如核磁共振波谱仪、质谱仪等)比较,构造简单,操作方便,价格便宜。因此,它已成为现代结构化学、分析化学最常用和不可缺少的工具。根据红外光谱与分子结构的关系,谱图中每一个特征吸收谱带都对应于某化合物的质点或基团振动的形式。因此,特征吸收 谱带的数目、位置、形状及强度取决于分子中各基团(化学键)的振动形式和所处的化学环境。只要掌握了各种基团的振动频率(基团频率)及其位移规律,即可利用基团振动频率与分子结构的关系,来确定吸收谱带的归属,确定分子中所含的基团或键,并进而由其特征振动频率的位移、谱带强度和形状的改变,来推定分子结构。

编译原理实验报告-语义分析

编译原理课程实验报告实验3:语义分析

图2-1 本程序根据之前两个实验的结果进一步进行语义分析,主要是通过在第二个实验句法分析过程中添加语义分析功能完成的。 在代码编写之前,我将程序的功能模块分为界面及主控程序,实体类和工具类三大部分。 MyCompiler是整个程序运行的入口,是主控程序;ComplierFrame完成程序的界面,以及界面里事件的响应;Token是词法分析中词法单元的实体类;ErrorToken是错误的词法单元实体类;Symbol是句法分析中符号的实体类;Production是产生式的实体类;ErrorProduction是句法分析中产生错误的时候使用的产生式实体类;Id是标示符实体类,保存了语义分析后的标识符表;Node是语法分析树的节点类,帮助完成语法分析树的构造;LL类使用LL(1)分析法完成句法分析,同时完成语义分析;MyScanner完成了词法分析。

图2-2 得分 三、详细设计及实现 要求:对如下工作进行展开描述 (1)核心数据结构的设计 本程序使用了两个新的实体类,分别是Id和Node。 Id是标识符,里面也包含了该标识符在本程序中存储的地址和长度等信息。Id的属性如下: private String name; //名 private String type;//基本类型 private int offset;//起始地址 private int length;//长度

开始 输入 词法分析 读入Token 尝试匹配 是否错误存储错误记录,处理栈顶与Token 序列 是否为语义符号 存储产生式,处理栈顶与Token 序列 判断动作符号执行语义动作 是否读到Token 末尾 打印结果 结束

编译原理语义分析实验报告

实验3 语义分析实验报告 一、实验目的 通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法。 二、实验要求 采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。 三、算法思想 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);

相关文档
最新文档