版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于单片机控制的红外报警器设计基于单片机控制的红外报警器设计PAGE 32PAGE 31 正文一、选题背景及类型1.1背景现代社会智能化水平越来越高,给我们的生活带来了很大便利。人们对安全有了很高的要求,以前的机械报警器已经不能满足人们对安全的要求了,电子报警器代替了机械报警器,电子报警器安装方便,成本价格低,安全性高,已经走进人们的视野,在对于企业来讲,高端技术的应用能够给企业带来很高的利润,减少不必要的安全损失或者是财产损失;对于居民而言,生活水平的提高使大部分人都住进了楼房,安全问题就出现了,为了防止不必要的损失,加强自身财产的安全管理,使用报警器就是必然的了。这不仅加强了安全,而且还使
2、得我们应用更方便、更经济,为此更准确与更经济的控制方式使我们一直追求的目标。单片机控制的红外线报警器就是一种比较实用而且价格实惠的报警器,在这方面的应用是比较好的。1.2报警器的分类报警器是一种为防止或预防某事件发生所造成的后果,以声音、光、气压等形式来提醒或警示我们应当采取某种行动的电子产品。分为两种报警器:机械报警器和电子报警器。随着科技的进步,机械式报警器越来越多地被先进的电子报警器代替,经常应用于系统故障、安全防范、交通运输、医疗救护、应急救灾、感应检测等领域,与社会生产密不可分。以下是常见的报警器。(1)气体报警器(2)烟雾报警器(3)燃气报警器(4)可燃性气体报警器(5)红外线报警
3、器本文主要介绍的是红外线报警器,以下就着重说一下有关红外线报警器的一些知识。红外线报警器分为主动式和被动式两种。主动式红外线报警器,是报警器主动发出红外线,红外线碰到障碍物,就会反弹回来,被报警器的探头接收。如果探头监测到,红外线是静止不动的,也就是不断发出红线线又不断反弹的,那么报警器就不会报警。当有会动的物体触犯了这根看不见的红线的时候,探头就会检测到有异常,就会报警。 被动式报警器少了一项功能,就是发射红外线。物理学上告诉我们,当物体的温度高于0K的时候,就会发出红外线,换句话说任何物体都能发出红外线。而其后的原理,被动式报警器和主动式是一样的。 红外线报警器对温度敏感,温度越高的物体辐
4、射出的红外线越强,当感应到环境中存在高出背景强度的辐射时,就触发反警。把报警主机通电放在固定位置,把报警探头挂在约2米高的地方,使其向前下方倾斜,以获得较高的灵敏度。接通电源,经过1分钟左右的延时后,报警器进入警戒状态,这时,若有人进入监控区,即刻报警。报警约1分钟,自动停止。然后重新处于警戒状态。主人进入时,首先按一下遥控器上的关机键,随着报警器一声“嘀”响,即关闭了报警器,进入警戒区也不再报警。当主人离开警戒区后,按一下开机键,随一声“嘀”响,报警器重处于警戒状态。遇到紧急情况,按一下紧急报警键,报警器即紧急报警。报警器内设有高,中,低三档灵敏度调整,用户可根据需要自行调整。二、硬件部分2
5、.1DS18B20(温度传感器)的简介 基于单片机控制的红外报警器中的传感器是DS18B20(温度传感器),该传感器由DALLS半导公司生产的DS18B20型单线智能温度传感器,属于新一代适配微处理器的智能温度传感器,可广泛用于工业、民用、军事等领域的温度测量及控制仪测控系统和大型设备中。它具有体积小,接口方便,传输距离远等特点。下面主要是温度传感器的性能特点、内部结构及控制方法。2.1.1DS18B20性能特点(1)采用单总线专用技术,既可通过串行口线,也可通过其它I/O口线与微机接口,无须经过其它变换电路,直接输出被测温度值(9位二进制数,含符号位)。(2)测温范围为-55-+125,测量
6、分辨率为0.0625。(3)内含64位经过激光修正的只读存储器ROM。(4)适配各种单片机或系统机。(5)用户可分别设定各路温度的上、下限。(6)内含寄生电源 。2.1.2DS18B20内部结构 DS18B20内部结构主要由四部分组成:64位光刻ROM(它是出厂前被光刻好的,它可以看作是该DS18B20的地址序列号。不同的器件地址序列号不同。),温度传感器,非挥发的温度报警触发器TH和TL,高速暂存器。DS18B20的管脚排列如图1所示。 图1DS18B20引脚分布图 2.1.3DS18B20控制方法 在硬件上,DS18B20与单片机的连接有两种方法,一种是Vcc接外部电源,GND接地,I/O
7、与单片机的I/O线相连;另一种是用寄生电源供电,此时UDD、GND接地,I/O接单片机I/O。无论是内部寄生电源还是外部供电,I/O口线要接5K左右的上拉电阻。 DS18B20有六条控制命令,如表1所示: 指 令约定代码操 作 说 明 温度转换44H启动DS18B20进行温度转换 读暂存器BEH读暂存器9个字节内容 写暂存器4EH将数据写入暂存器的TH、TL字节 复制暂存器48H把暂存器的TH、TL字节写到E2RAM中 重新调E2RAMB8H把E2RAM中的TH、TL字节写到暂存器TH、TL字节 读电源供电方式B4H启动DS18B20发送电源供电方式的信号给主CPU CPU对DS18B20的访
8、问流程是:先对DS18B20初始化,再进行ROM操作命令,最后才能对存储器操作,数据操作。DS18B20每一步操作都要遵循严格的工作时序和通信协议。如主机控制DS18B20完成温度转换这一过程,根据DS18B20的通讯协议,须经三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。2.21602液晶屏 液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在袖珍式仪表和低功耗应用系统中得到越来越广泛的应用。液晶显示器可以分为两大类,一类是点阵型,另一类是字符型。点阵型通常面积较大,可以显示图形;
9、而一般的字符型液晶只有两行,面积小,只能显示字符和一些简单的图形,简单易控制且成本低。与此同时1062液晶屏的实用性很高。下面简要的说明一下它的电气连接。1.1电气连接1602液晶屏采用标准的16脚接口,定义如下表2所示: 表2 1602液晶屏的引脚定义注: 液晶显示偏压信号:是指用于驱动1602液晶屏上的像素点改变颜色所用的电压,此电压可能接近GND,本实验板所用的1602液晶是接近GND。 读写选择端是用于控制对液晶的读和写的信号,在本实验板内被直接连接在GND上,即采用只写不读的方式(只要在两次写中间加适当的延时即可)。第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:V0为液
10、晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第714脚:D0D7为8位双向数据线。 第1516脚:空脚。图2 1602液晶屏2.3蜂鸣器蜂鸣器发声原理是电流通过
11、电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,单片机IO引脚输出的电流较小,单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。实验板通过一个三极管Q1来放大驱动蜂鸣器。蜂鸣器的正极接到Q1的集电极C极上面,蜂鸣器的负极地,三极管发射极E极接电源VCC,基级B经过限流电阻R33后由单片机的P1.7引脚控制,当P1.7输出高电平时,三极管T1截止,没有电流流过线圈,蜂鸣器不发声当P17输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。因此,我们可以通过程序控制P1.7脚的电平来使蜂鸣器发出声音和关闭。程序中改变单片机P1.7引脚
12、输出波形的频率,就可以调整控制蜂鸣器音调,产生各种不同音色、音调的声音。另外,改变P1.7输出电平的高低电平占空比,则可以控制蜂鸣器的声音大小。2.4stc89c51单片机2.4.1简介单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机了解计算机原理与结构的最佳选择.可以说,二十世纪跨越了三个“电”的时代,即电气时代、电子时代和现已进入的电脑时代。不过,这种电脑,通常是指个人计算机,简称PC机。它由主机、键盘、显示器等组成(如图1所
13、示)。还有一类计算机,大多数人却不怎么熟悉。这种计算机就是把智能赋予各种机械的单片机(亦称微控制器,如图2所示)。顾名思义,这种计算机的最小系统只用了一片集成电路,即可进行简单运算和控制。因为它体积小,通常都藏在被控机械的“肚子”里。它在整个装置中,起着有如人类头脑的作用,它出了毛病,整个装置就瘫痪了。现在,这种单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词“智能型”,如智能型洗衣机等。现在有些工厂的技术人员或其它业余电子开发者搞出来的某些产品,不是电路太复杂,就是功能太简单且极
14、易被仿制。究其原因,可能就卡在产品未使用单片机或其它可编程逻辑器件上。在红外线报警器当中我们应用的单片机是stc89c51单片机,由它来控制报警器的运行。2.5红外对管红外对管是红外线发射管与光敏接收管,或者红外线接收管,或者红外线接收头配合在一起使用时候的总称。下面主要是对红外对管中红外线以及功能的说明。2.5.1红外线 在光谱中波长自0.76至400微米的一段称为红外线,红外线是不 HYPERLINK /view/68621.htm t _blank 可见光线。所有高于绝对零度(-273.15)的物质都可以产生红外线。现代物理学称之为热 HYPERLINK /view/290246.htm
15、 t _blank 射线。医用红外线可分为两类:近红外线与远红外线。 HYPERLINK /image/263e802f1d6ac17c1f30898c o 查看图片 t _blank 图3红外线发射管红外线发射管在LED封装行业中主要有三个常用的波段,如下850NM、875NM、940NM。根据波长的特性运用的产品也有很大的差异,850NM波长的主要用于红外线监控设备、875NM主要用于医疗设备、940NM波段的主要用于红外线控制设备。EG:红外线遥控器、光电开关、光电记数设备等。2.5.2功能说明(1)光敏接收管它是一个具有光敏特征的PN结,属于光敏三极管,具有单向导电性,因此工作时需加上
16、反向电压。无光照时,有很小的饱和反向漏电流(暗电流)。此时光敏管不导通。当光照时,饱和反向漏电流马上增加,形成光电流,在一定的范围内它随入射光强度的变化而增大。(2)红外接收管功能与光敏接收管相似只是不受可见光的干扰,属于光敏二极管,只对红外线有反应。(3)红外线接收头就是在红外线接收管的基础上进行放大的信号的作用,类似与三极管的放大效果。三、软件部分3.1原理图与程序3.1.1原理图红外线报警器是由单片机最小系统以及其他元件组成的,单片机最小系统是其中不可缺少的,是其中的核心元件,下面是红外线报警器的原理图。 图4 红外线报警器原理图3.1.2以下是基于单片机控制红外线报警器的程序 #inc
17、lude#include#include #include LCD1602.h#include ds18b20.c#include 38khz.c#define uchar unsigned char#define uint unsigned intsbit OUT=P22;sbit P32=P32;uchar bInt0 = 0;uint mstcnt=0;uchar t,set;bit outflag;bit write=0;bit flag;bit flag2;bit TR1_flag; /控制蜂鸣器报警uchar code str0= system running ;uchar cod
18、e str1= OK SA: . C;uchar code str2=wrong SA: . C;void init_timer0(void); void displayfun1(void);uchar ReadOneChar(void);void WriteOneChar(unsigned char dat);void ReadTemperature(void);void playalarm(void); /*LCD display function*/void displayfun1(void)WriteCommandLCM(0 x0c,1); DisplayListChar(0,0,st
19、r0);/DisplayListChar(0,1,str1); DisplayOneChar(11,1,temp1/10+0 x30); DisplayOneChar(12,1,temp1%10+0 x30);DisplayOneChar(14,1,temp2/10+0 x30);void display() if(!TR1_flag) / 为0时显示OK,为1时显示WRONG DisplayListChar(0,1,str1); displayfun1(); delay_LCM(1000); else DisplayListChar(0,1,str2); displayfun1(); del
20、ay_LCM(1000); /*timer t0 initialization*/void init_timer1(void) TMOD=TMOD|0 x12; TH1=0 x3c; TL1=0 xb0; EA=1; ET1=1; /TR1=1; void timer1(void) interrupt 3 using 0 TH1=0 x3c; TL1=0 xb0; /OUT = OUT; OUT = 1;/蜂鸣器长鸣 mstcnt+; if(mstcnt=400)/蜂鸣器响10秒 mstcnt=0; TR1 = 0;TR0 = 1; flag = 0; /停止报警,进入正常模式TR1_flag
21、 = 0;/切换显示OUT = 0;/*the main funtion*/ void main(void) int_mcu(); P1=0 xff; / initialize p1delay_LCM(500); /500ms time delayinitLCM( ); /initialize LCDinit_timer1( ); /initialize Timer0 Init_DS18B20( ); /initialize Ds18b20DisplayListChar(0,0,str0);DisplayListChar(0,1,str1); /out_high();/测试输出38k载波 TR
22、1_flag = 0; while (1) /TR0 = 1; if(!flag) /flag为0时正常显示,为1时执行报警 OUT = 0; TR0 = 1;TR1_flag = 0; ReadTemperature(); /read temperaturedisplay();/for(m=0;m8;m+) /读取P32状态8次,若有高电平则报警 / if(P32) delay_LCM(50); if(P32) flag = 1; flag2 = 1; TR1_flag = 1; else delay_LCM(100); / else if(flag2) TR0 = 0;/关定时器0,停止发
23、送脉冲 TR1 = 1;/启动定时器1,蜂鸣器响 display(); flag2 = 0; 结论 红外报警器是一种基于单片机控制的报警器,是一种简单的报警器。在制作实物的过程中遇到一些小问题,就是往单片机里面写程序的时候,刚开始写了几次都不能够运行,经过最后的努力终于成功了。当最后完成的时候有一种自豪感,完成一件事的过程远比结果好。虽然我们做的红外线报警器只是一个简单的模型,但是能选到这个设计我也从中学到了很多东西,这些是以前在书本上学不到的东西,一种实际的动手能力,一种自己的探索,一种查阅资料自己学习的付出。原来自己能过成一件事是多么的让人高兴啊。报警器也不是完美的东西,有的时候也会引起误
24、报、漏报,至于具体原因这里也不多说了,这是以后的研究课题。参考资料1电子驿站 HYPERLINK 2百度文库及百度百科 3杜树春.单片机应用系统开发实例详解.北京:机械工业出版社,20074无线电杂志社.无线电.北京:人民邮电出版社,2007-20105 李广弟.单片机基础. 电子工业出版社,2007致谢 经过自己的努力,加上老师的指导,同学的帮助,我完成了红外线报警器的毕业设计。由于长时间没有学习单片机知识了,刚开始做的时候感觉到比较吃力,可是在别人的帮助下总算是把所忘记的知识慢慢想起来了,而且顺利的完成了设计。在本次的毕业设计当中我感觉到学习知识的时候很简单,可是实际运用的时候感觉到就比较
25、吃力了,有点学无所用的感觉,也许也就是自己学的不够好吧。通过这次设计,我感觉自己的知识面是很窄的很多东西都不是很清楚不得不请教老师或者是同学,再就是上网去查找资料。要想使自己更上一层楼,还是要不断的去学习的,不断的提升自己啊。能够完成这个设计我感觉到很自豪,毕竟是自己做的第一设计。感谢一切帮助我的人啊,感谢学校。再次感谢指导老师和我的搭档们,辛苦了!三年的大学生活即将结束,学生时代的最后一项任务也画上了句号。希望在以后的日子里,不断学习、进步,让自己做得更好。附录以下是红外线报警器的实物图图5红外线报警器实物图6毕业论文评阅、评审意见表专业:学生姓名:题目:指导教师评语:成绩:指导教师(签字)
26、: 年月日答辩委员会(或答辩小组)评审意见:成绩:组长(签字): 年月日附录资料:不需要的可以自行删除C语言编译器的设计与实现 我们设计的编译程序涉及到编译五个阶段中的三个,即词法分析器、语法分析器和中间代码生成器。编译程序的输出结果包括词法分析后的二元式序列、变量名表、状态栈分析过程显示及四元式序列程序,整个编译程序分为三部分:(1) 词法分析部分(2) 语法分析处理及四元式生成部分 (3) 输出显示部分一词法分析器设计 由于我们规定的程序语句中涉及单词较少,故在词法分析阶段忽略了单词输入错误的检查,而将编译程序的重点放在中间代码生成阶段。词法分析器的功能是输入源程序,输出单词符号。我们规定
27、输出的单词符号格式为如下的二元式: (单词种别,单词自身的值)#define ACC -2#define syl_if 0#define syl_else 1#define syl_while 2#define syl_begin 3#define syl_end 4#define a 5#define semicolon 6#define e 7#define jinghao 8#define s 9#define L 10#define tempsy 11#define EA 12#define EO 13#define plus 14#define times 15#define bec
28、omes 16#define op_and 17#define op_or 18#define op_not 19#define rop 20#define lparent 21#define rparent 22#define ident 23#define intconst 24函数说明 读取函数 readline( )、readch( )词法分析包含从源文件读取字符的操作,但频繁的读文件操作会影响程序执行效率,故实际上是从源程序文件” source.dat ”中读取一行到输入缓冲区,而词法分析过程中每次读取一个字符时则是通过执行 readch( )从输入缓冲区获得的;若缓冲区已被读空,则
29、再执行readline( )从 source.dat 中读取下一行至输入缓冲区。扫描函数 scan( ) 扫描函数 scan( )的功能是滤除多余空格并对主要单词进行分析处理,将分析得到的二元式存入二元式结果缓冲区。变量处理 find( )变量处理中首先把以字母开头的字母数字串存到 spelling 数组中,然后进行识别。识别过程是先让它与保留关键字表中的所有关键字进行匹配,若获得成功则说明它为保留关键字,即将其内码值写入二元式结果缓冲区;否则说明其为变量,这时让它与变量名表中的变量进行匹配( 变量匹配函数 find( ) ),如果成功,则说明该变量已存在并在二元式结果缓冲区中标记为此变量(
30、值填为该变量在变量名表中的位置),否则将该变量登记到变量名表中,再将这个新变量存入二元式缓存数组中。数字识别 number( ) 数字识别将识别出的数字填入二元式结果缓存数组。显示函数 显示函数的功能在屏幕上输出词法分析的结果( 即二元式序列程序),同时给出二元式个数及源程序行数统计。二语法分析器设计 语法分析器的核心是三张 SLR 分析表以及针对这三张 SLR 分析表进行语义加工的语义动作。编译程序中语法分析处理及四元式生成部分主要是以二元式作为输入,并通过 SLR 分析表对语法分析处理过程进行控制,使四元式翻译的工作有条不紊的进行,同时识别语法分析中的语法错误。在处理 if 和 while
31、 语句时,需要进行真值或假值的拉链和返填工作,以便转移目标的正确填入。1. 控制语句的 SLR 分析表1 设计过程如下: 将扩展文法GS S1)S if e S else S2)S while e S3)S L 4)S a;5)L S6)L SL用_CLOSURE方法构造LR(0)项目规范簇为:I0: S SS if e S else SS while e S S L S a ;I1: S SI2: S ife S else SI3: S while e SI4: S L L S L SL S if e S else SS while e S S L S a ; I5: S a; I6: S
32、if e S else S S if e S else SS while e S S L S a ; I7: S while e S S if e S else SS while e S S L S a ; I8: S L I9: L S L SL L SL L S S if e S else SS while e S S L S a ; I10: S a ; I11: S if e S else SI12: S while e S I13: S L I14: S SL I15: S if e S else S S if e S else SS while e S S L S a ; I16:
33、 S if e S else S 构造文法G中非终结符的FOLLOW集如下:FOLLOW(S) = # S if e S else S得FOLLOW(S) = else S L 得FOLLOW(L) = 3) S S 得FOLLOW(S) = else , # L S 因为FIRST(S) = ,所以FOLLOW(S) = else , #, 在()项目规范簇中,只有9有“移进归约”冲突,L SL SL因为FOLLOW(L) FIRST(L) = 所以可以用方法解决以上冲突,最后我们得到的分析表如下:ACTIONGOTO ifElsewhilea;e#SL0S2S3S4S511ACC2S63S
34、74S2S3S4S5985S106S2S3S4S5117S2S3S4S5128S139S2S3S4R5S591410R4R4R4111512R2R2R213R3R3R314R615S2S3S4S51616R1R1R1static int action2011=/* 0 */ 2, -1, 3, 4, -1, 5, -1, -1, -1, 1, -1,/* 1 */ -1, -1, -1, -1, -1, -1, -1, -1,ACC, -1, -1,/* 2 */ -1, -1, -1, -1, -1, -1, -1, 6, -1, -1, -1,/* 3 */ -1, -1, -1, -1,
35、 -1, -1, -1, 7, -1, -1, -1,/* 4 */ 2, -1, 3, 4, -1, 5, -1, -1, -1, 9, 8,/* 5 */ -1, -1, -1, -1, -1, -1, 10, -1, -1, -1, -1,/* 6 */ 2, -1, 3, 4, -1, 5, -1, -1, -1, 11, -1,/* 7 */ 2, -1, 3, 4, -1, 5, -1, -1, -1, 12, -1,/* 8 */ -1, -1, -1, -1, 13, -1, -1, -1, -1, -1, -1,/* 9 */ 2, -1, 3, 4,105, 5, -1,
36、-1, -1, 9, 14,/* 10*/ -1,104, -1, -1,104, -1, -1, -1,104, -1, -1,/* 11*/ -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,/* 12*/ -1,102, -1, -1,102, -1, -1, -1,102, -1, -1,/* 13*/ -1,103, -1, -1,103, -1, -1, -1,103, -1, -1,/* 14*/ -1, -1, -1, -1,106, -1, -1, -1, -1, -1, -1,/* 15*/ 2, -1, 3, 4, -1, 5, -1,
37、 -1, -1, 16, -1,/* 16*/ -1,101, -1, -1,101, -1, -1, -1,101, -1, -1;其中,前 9 列为 action 值,后 2 列为 goto 值;016 表示 17 个移进状态( 即 Si);-1表示出错;ACC 表示分析成功;而 100106 对应 7 个归约产生式:S SS if e S else SS while e SS L S a;L SL SL2. 算术表达式的 LR 分析表 2 设计如下:S EE E+EE E*EE (E)E i (过程略)ACTIONGOTOI+*()#E0S3S211S4S5ACC2S3S263R4R4R
38、4R44S3S275S3S286S4S5S97R1R5R1R18R2R2R2R29R3R3R3R3static int action1107=/* 0 */ 3, -1, -1, 2, -1, -1, 1,/* 1 */ -1, 4, 5, -1, -1,ACC, -1,/* 2 */ 3, -1, -1, 2, -1, -1, 6,/* 3 */ -1,104,104, -1,104,104, -1,/* 4 */ 3, -1, -1, 2, -1, -1, 7,/* 5 */ 3, -1, -1, 2, -1, -1, 8,/* 6 */ -1, 4, 5, -1, 9, -1, -1,/
39、* 7 */ -1,101, 5, -1,101,101, -1,/* 8 */ -1,102,102, -1,102,102, -1,/* 9 */ -1,103,103, -1,103,103, -1;3.布尔表达式的 SLR 分析表3 设计如下:(过程略)S BB iB i rop iB ( B )B ! BA B &B ABO B |B OBACTIONGOTOiRop()!&|#BAO0S1S4S513781S2R1R1R1R12S33R2R2R2R24S1S4S511785S1S4S56786R4S9S10R47S1S4S514788S1S4S515789R5R5R510R7R7R
40、711S12S9S1012R3R3R3R313S9S10ACC14R6S9S10R615R8S9S10R8static int action21611=/* 0 */ 1, -1, 4, -1, 5, -1, -1, -1, 13, 7, 8,/* 1 */ 1, 2, -1,101, -1,101,101,101, -1, -1, -1,/* 2 */ 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,/* 3 */ -1, -1, -1,102, -1,102,102,102, -1, -1, -1,/* 4 */ 1, -1, 4, -1, 5, -1,
41、 -1, -1, 11, 7, 8,/* 5 */ 1, -1, 4, -1, 5, -1, -1, -1, 6, 7, 8,/* 6 */ -1, -1, -1,104, -1, 9, 10,104, -1, -1, -1,/* 7 */ 1, -1, 4, -1, 5, -1, -1, -1, 14, 7, 8,/* 8 */ 1, -1, 4, -1, 5, -1, -1, -1, 15, 7, 8,/* 9 */ 105, -1,105, -1,105, -1, -1, -1, -1, -1, -1,/*10 */ 107, -1,107, -1,107, -1, -1, -1, -1
42、, -1, -1,/*11 */ -1, -1, -1, 12, -1, 9, 10, -1, -1, -1, -1,/*12 */ -1, -1, -1,103, -1,103,103,103, -1, -1, -1,/*13 */ -1, -1, -1, -1, -1, 9, 10,ACC, -1, -1, -1,/*14 */ -1, -1, -1,106, -1, 9, 10,106, -1, -1, -1,/*15 */ -1, -1, -1,108, -1, 9, 10,108, -1, -1, -1;LR 分析表控制语义加工的实现:当扫描 LR 分析表的当前状态为归约状态时,则在
43、调用与该状态对应的产生式进行归约的同时,调用相应的语义子程序进行有关的翻译工作。现在对 LR 分析器的分析栈加以扩充,使得每个文法符号之后都跟着它的语义值。为了清晰起见,我们把这个栈的每一项看成由三部分组成:状态 state ,文法符号 syl 和语义值 val。编译程序实现算术表达式、布尔表达式及程序语句的语义加工时,都是按这种状态栈加工方式进行的。例如:( 5 + 3 ) * 6的分析过程序号STATEValsylinput10-#( 5 + 3 ) * 6 #202-#(5 + 3 ) * 6 #3023#(5+ 3 ) * 6 #4026-5#(E+ 3 ) * 6 #50264-5-
44、#(E+3 ) * 6 #602643-5-#(E+3 ) * 6 #702647-5-3#(E+E) * 6 #8026-8#(E) * 6 #90269-8-#(E)* 6 #1001-8#E* 6 #11015-8-#E* 6 #120153-8-#E*6#130158-8-6#E*E#1401-48#E#15ACC在分析过程中,第(3)步操作后的状态栈为 023,根据栈顶状态“ 3”和现行输入符号“ +”( input 栏字符串的第一个字符)查分析表 ACTION3,+=R4,即按第(4)个产生式 En 来进行归约;由于产生式右部仅含一项,故去掉状态栈栈顶“3”;此时 2 变为新的栈顶
45、状态,再查( 2,E)的下一状态 s:GOTO2,E=6,即将状态 6 和文法符号 E 压栈,最后得到第( 4)步的状态。第( 7)步操作后也是如此,当前状态栈为 02647,根据栈顶状态 7 和现行输入符号“ )”查分析表 ACTION7,)=R1,即按第(1)个产生式 EE1+E2进行归约;由于产生式右部有三项,故去掉状态栈栈顶的 647 三项;此时 2 变为新的栈顶状态,再查( 2,E)的下一状态 s:GOTO2,E=6,即将状态 6 和文法符号 E 压栈,最后得到第(8)步的状态。三中间代码生成器设计:布尔表达式 布尔表达式在程序语言中有两个基本作用:一是用作控制语句( 如 if -e
46、lse 或 while语句)的条件式;二是用于逻辑演算,计算逻辑值。布尔表达式是由布尔算符( &、| 、!)作用于布尔变量( 或常数)或关系表达式而形成的。关系表达式的形式是 E1 rop E2,其中 rop 是关系符( 如或),E1和 E2是算术式。在这里,我们只考虑前面给定文法所产生的布尔表达式:BB &B | B | B | ! B | (B) | i rop i | i遵照我们的约定,布尔算符的优先顺序( 从高到低)为:!、&、|,并假定&和|都服从左结合规则。所有关系符的优先级都是相同的,而且高于任何布尔算符,低于任何算术算符,关系算符不得结合。表达式的真、假出口的确定:考虑表达式
47、B1 | B2 ,若 B1为真,则立即知道 B 也为真;因此,B1的真出口也就是整个 B 的真出口。若 B1?为假,则 B2必须被计值,B2的第一个四元式就是 B1的假出口。当然,B2的真、假出口也就是整个 B的真、假出口。类似的考虑适用于对 B1 & B2的翻译,我们将 B1 | B2和 B1 & B2 的翻译用下图表示,在自下而上的分析过程中,一个布尔式的真假出口往往不能在产生四元式的同时就填上。我们只好把这种未完成的四元式的地址( 编号)作为 B 的语义值暂存起来,待到整个表达式的四元式产生完毕之后再来回填这个未填入的转移目标。条件语句对条件语句 if e S1 else S2 中的布尔
48、表达式 e,其作用仅在于控制对 S1和 S2的选择。因此,作为转移条件的布尔式e,我们可以赋予它两种“ 出口”:一是“ 真”出T口,出向 S1;一是“ 假”出口,出向 S2。于是,e的代码F条件语句可以翻译成如图的一般形式。非终结符 e 具有两项语义值 e _TC 和e_FC,它们分别指出了尚待回填真、S2的代码假出口的四元式串。e 的“ 真”出口只有在往回扫描到if时才能知道,而它图 3-2 条件语句的代码结构 的“ 假”出口则需到处理过 S1并且到达 else 才能明确。这就是说,必须把 e_FC 的值传下去,以便到达相应的 else时才进行回填。另外,当 S1语句执行完时意味着整个 if
49、-else 语句也已执行完毕;因此,在 S1的编码之后应产生一条无条件转移指令。这条转移指令将导致程序控制离开整个 if-else 语句。但是,在完成 S2的翻译之前,这条无条件转移指令的转移目标是不知道的。甚至,在翻译完 S2之后,这条转移指令的转移目标仍无法确定。这种情形是由于语句的嵌套性所引起的。例如下面的语句:if e1 if e2 S1 else S2 else S3 在 S1的代码之后的那条无条件转移指令不仅应跨越 S2而且应跨越 S3。这也就是说,转移目标的确定和语句所处的环境密切相关。条件循环语句条件循环语句 while e S 通常被翻译成图的代码结构。布尔式 e 的“ 真”
50、出口出向 S 代码段的第一个四元式。紧接 S 代码段之后应产生一条转向测试 e 的无条件转移指令。e 的“ 假”出口将导致程序控制离开整个 while 语句。e 的“ 假”出口目标即使在整个 while 语句翻译完之后也未必明确。例如: if e1 while e2 S1 else S2这种情况仍是由于语句的嵌套性引起的。所以,我们只好把它作为语句的语义值 SCHAIN 暂留下来,以便在处理外层语句时再伺机回填。语法翻译实现方法 将上述语法翻译付诸实现过程中,我们仅保留了算术表达式和布尔表达式翻译的文法和语义动作;面对程序语句的翻译,由于改造后含有较多的非终结符且语义动作又相对简单,故仍恢复为
51、改造之前的程序语句文法。由于总体上构造一个 SLR 分析表来实现语法分析及语义加工将使得所构造的 SLR 分析表过大,所以将其分为下面三部分处理:对算术表达式单独处理,即为算术表达式构造一个 SLR 分析表,并将赋值语句A=E 与算术表达式归为一类处理,处理之后的赋值语句仅看作为程序语句文法中的一个终结符 a。对布尔表达式也单独处理,并为其构造一个 SLR 分析表,经 SLR 分析表处理后的布尔表达式看作为程序语句文法中的一个终结符 e。程序语句文法此时变为:S if e S else S | while e S | L | a;L SL | S此时为程序语句构造相应的 SLR 分析表就简单多
52、了。前面的程序语句文法中所添加的非终结符是为了能及时回填有关四元式转移目标而引入的,在取消了这些非终结符后又如何解决及时回填转移目标的问题呢?我们采取的解决方法是增加两个数组 labelmark 和 labeltemp 来分别记录语句嵌套中每一层布尔表达式( 如果有的话)e 的首地址以及每一层else( 如果有的话)之前的四元式地址( 即无条件转出此层 if 语句的四元式)。也即,对程序语句的翻译来说:在处理完布尔表达式 e 后,回填 if 或 while 语句的真值链;在归约完每一个语句 S 之后检查符号栈,看在 S 之前的文法符号是否 if 或 while,若是则回填假值链( 假值入口为语句 S 所对应的四元式序列之后;对 if 语句,此时已在该序列之后加入了一条无条件转移的四元式);在 if 语句中,else 前面要加入一个无条件转移的四元式转向 if 语句末尾;在 while语句尾要有一个无条件转移四元式转向 whi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026广东梅州市人民医院招聘博士研究生备考题库带答案详解ab卷
- 2026吉林省高速公路集团有限公司招聘165人备考题库及答案详解【全优】
- 2026海南海口市秀英区疾病预防控制中心招聘事业编制人员9人备考题库含答案详解(综合题)
- 2026年4月安徽芜湖高新区(弋江区)国有企业人员招聘14人备考题库带答案详解(培优a卷)
- 2026福建医科大学附属第一医院招聘非在编合同制人员20人备考题库(二)带答案详解(达标题)
- 某化肥厂原材料管理规范
- 2026福建福州职业技术学院诚聘高层次人才备考题库及1套完整答案详解
- 2026中国中煤能源集团有限公司西南分公司(四川分公司)第三批招聘10人备考题库及答案详解(有一套)
- 2026广西崇左宁明县那堪镇卫生院招聘1人备考题库及答案详解(必刷)
- 2026广东广州市中山大学孙逸仙纪念医院药学部工程岗位招聘1人备考题库及答案详解(名师系列)
- 中医新型冠状病毒肺炎课件
- 电工技术基础与技能30课件
- 《中国军装变迁》课件
- 委托办理供电委托书模板
- 酶固定化技术及固定化酶应用的研究进展
- 安全生产工作清单和责任清单
- Y -S-T 436-2023 铝合金建筑型材图样图册 (正式版)
- DB32 4418-2022《 居住建筑标准化外窗系统应用技术规程》
- 【真题】2023年徐州市中考道德与法治试卷(含答案解析)
- 孕妇的护理家庭护理
- 人教新课标五年级数学下册教材解读PPT
评论
0/150
提交评论