1、关系运算符| | | | |字母 ABCDEFGHIJKLMNOPQRSTUVWXYZ数字 1234567890实验1 词法分析介绍词法分析程序的编程与调试。(2学时)一、目的与要求)目的通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解;提高词法分析方法的实践能力。)要求 掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 掌握词法分析的实现方法。 上机调试编出的词法分析程序。二、实践题 题目用 C/C+ 语言编写前述 C/C+ 子集的词法分析程序。)主程序设计考虑,(参阅后面给出的程序框架)主程序的说明部分为各种表格和变量安排空间。数组k为
2、关键字表,每个数组元素存放一个关键字。采用定长的方式,较短的关键字后面补空格。P 数组存放分界符。为了简单起见,分界符、算术运算符和关系运算符都放在p表中(学生编程时,应建立算术运算符表和关系运算符表,并且各有类号),合并成一类。id 和ci 数组分别存放标识符和常数。instring 数组为输入源程序的单词缓存。outtoken 记录为输出内部表示缓存。还有一些为造表填表设置的变量。主程序开始后,先以人工方式输入关键字,造k表;再输入分界符等造 p 表。主程序的工作部分设计成便于调试的循环结构。每个循环处理一个单词;接收键盘上送来的一个单词;调用词法分析过程;输出每个单词的内部码。)词法分析
3、过程考虑该过程取名为 lexical,它根据输入单词的第一个字符(有时还需读第二个字符),判断单词类,产生类号:以字符k表示关键字;i表示标识符;c 表示常数;p 表示分界符;s 表示运算符(学生编程时类号分别为1,2,3,4,5)。对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组 id 中,将常数变为二进制形式存入数组中 ci 中,并记录其在表中的位置。lexical 过程中嵌有两个小过程:一个名为 getchar,其功能为从 instring 中按顺序取出一个字符,并将其指针 pint 加 1 ;另一
4、个名为 error,当出现错误时,调用这个过程,输出错误编号。将词法分析程序设计成独(入口)立一遍扫描源程序的结构。其流程图见图1。图1 词法分析程序流程图 要求 所有识别出的单词都用两个字节的等长表示,称为内部码。第一个字节为 t ,第二个字节为 i 。 t 为单词的种类。关键字的 t=;分界符的 t=;算术运算符的 t=;关系运算符的 t=;无符号数的 t=;标识符的 t=。i 为该单词在各自表中的指针或内部码值。表 1-1 为关键字表;表 1-2 为分界符表;表 1-3 为算术运算符的 i 值;表 1-4 为关系运算符的 i 值。表1-1 关键字表表1-2 分界符表指针1关键字分界符MA
5、IN,1;2.3IF :=4THEN(5ELSE)6FOR7WHILE表1-3 算术运算符表1-4 关系运算符i 值算术运算符关系运算符00H21H/04H05H表1-1只供参考,具体实现时要求参考C语言手册中的保留字表选择一个子集。常数表和标识符表是在编译过程中建立起来的。其 i 值是根据它们在源程序中出现的顺序确定的。常数分析程序、关键字和标识符分析程序、其他单词分析程序请参阅范例自行设计。下面给出部分程序的算法框架,设计实现时需要补充完善。三、程序框架 plexical(input,output); CONST keylen=10; identlen=10; outreco=RECORD
6、 char ty; integer point; END; outreco Integer cip,ip,pint,i,j,l,m,errorx; CHAR charl, instring10, p16,2; integer ci 10; string kkeylen, idkeylen; string token; outreco outtoken; OF char;PROCEDURE lexical integer l,m,num; boolean b; PROCEDURE getchar charl:=instring pint ; pint:=pint+1 /*getchar*/ PR
7、OCEDURE error putchar(error,errorx) /*error*/ FOR (1:=1; inentlen)token1:= ; getchar; WHILE char1= DO getchar; IF char1 IN a.z THEN /*处理标识符*/ m: WHILE (char1 IN ) OR (char1 IN 09) DO IF m=identlen THEN tokenm:=char1;=m+1 ; getchar /*while*/=pint-1; 1: b:=false; WHILE (1=keylen) AND (NOT b) DO=true;
8、i: WHILE (i=identlen) AND b DO IF k1 i=tokeni THEN i:=i+1 ELSE b: IF NOT b THEN l:=l+1 IF 1=keylen outtoken.ty:k outtoken.point:=1 ELSE l: WHILE (lip ip:=ip+1; FOR m:=1 TO identlen DO idipm:=tokenm;i 处理常数 /*integer*/IF char1 IN ,.() 处理分界符 IF char IN +-*/ 处理运算符 ELSE errorx : =2; error /*lexica1*/out
9、(k-table, input!);FOR(1: keyicn )FOR(m: identlen)read (k1,m )ReadFOR(l: identlen)id 1,m:out(p-table, input!FOR( 1:=1 ; 11)FOR( m: 2)read(p1,m)ip:=0;cip:pint:L1: out(source, input!FOR( j: identlen)Read (instringj )lexicalout(outtoken.ty)out(outtoken. point) identlen) out(token1)out;Goto L1END.实验2 NFA
10、确定化 输入:NFA; 输出DFA (2学时) 要求:对于自动机的数据结构自行确定,在实验报告中加以说明即可。实验3 语法分析 (4 - 6学时) 目的通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。 要求选择最有代表性的语法分析方法,如算符优先法、递归子程序法和LR分析法;选择对各种常见程序语言都用的语法结构,如赋值语句,特别是表达式,作为分析对象,并且与所选语法分析方法要比较贴切。二、实习题分析对象的BNF定义如下:算术表达式项|算术表达式项|算术表达式项项因式|项因式|项因式因式变量(算术表达式)变量字母
11、字母A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z(a)(b) (c)(d)(e) (f)图2 递归下降法分析表达式之框图(a) ZC 过程;(b) E 过程;(c) T 过程;(d) F 过程;(e) 函数过程 SYM ;(f) 过程 ADVANCE 算法 用递归下降法分析上述算术表达式的框图,如图2所示。这里,ZC过程为总控程序,主要完成: 通知外界键入算术表达式; 控制过程分析算术表达式; 根据分析结果之正误,分别通知外界不同的信息。ZC过程被设计成可以分析无穷多个算术表达式。E、T和F三个过程分别对应算术表达式、项和因式三个产生式
12、的处理。它们用到两个公共过程。一个是函数过程SYM,它负责从输入字符串ST中取出下一个字符,并存入SYM中等待分析。另一个过程ADVANCE负责剔除ST中的首字符。 小结 实习前的准备按实习目的和要求,用 C/C+ 语言编写一个语法分析程序,同时考虑相应的数据结构。 调试调试例子应包括符合语法规则的算术表达式,以及分析程序能够判别的若干错例。 输出对于所输入的算术表达式,不论对错,都应有明确的信息告诉外界。 扩充有余力的同学,可适当扩大分析对象。譬如: 算术表达式中变量名可以是一般标识符,还可含一般常数、数组元素、函数调用等等。 除算术表达式外,还可扩充分析布尔、字符、位等不同类型的各种表达式
13、。加强语法检查,尽量多和确切地指出各种错误。 编写上机实习报告。实验4 语义分析通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法范畴变换为某种中间代码的语义翻译方法。 选用目前世界上普遍采用的语义分析方法语法制导翻译技术。 语义分析对象重点考虑经过语法分析后已是正确的语法范畴,实习重点是语义子程序。 中间代码选用比较常见的形式,例如四元式。 实习时间为2-小时。 题目的选择语法制导翻译是在语法分析的基础上增加语义操作来实现翻译的。原则上每个产生式对应一个语义子程序。在语法分析的过程中,当一个产生式获得匹配或进行归约时,相应的语义子程序便开始工作,生成中间代码,查填有关表格
14、,检查并报告源程序中的错误,修改编译程序某些变量的值。高级语言的语法结构类型很多,从实习的角度可分为以下六类: 说明语句。如各种数据类型说明(整型、实型、布尔型、字符型、复型、双精度型、枚举、子界、数组、集合、文件、记录、指针等),各种数据空间特性说明(如公用语句,共名语句,等价语句等),初值语句。实习重点是内存空间的分配方法。 顺序结构语句。典型代表是各类表达式(如算术表达式、布尔表达式、字符表达式、位表达)及相应的赋值语句。实习重点是算术表达式的翻译方法。 控制结构语句。常见的有转移语句、条件语句和各种分叉语句。实习重点是拉链返填的方法。 子程序结构。指子程序、函数、过程这类结构的定义和调
15、用。实习重点是哑实结合的方法。 循环结构。如计数循环、条件循环等。实习重点是循环化简的方法。 格式语句。主要指输入输出语句的格式加工。实习重点是数据编辑的方法。根据教学要求可从以上六类中选择一至三类实习。 题目在对简化的算术表达式进行语法分析的同时生成四元式。 算法根据题意,所求的四元式生成程序核心部分(指表达式、项和因式的处理)的算法,可用类C语言算法描述如下: PROCEDURE E; EIPLACE:=T; WHILE SYM= OR DO ADVANCE; E2PLACE: T1:=NEWTEMP; GEN(,E1PLACE,E2PLACE,T1); E1PLACE:=T1 RETUR
16、N(E1PLACE) . PROCEDURE T; T1PLACE:=F; DO ADVANCE: T2PLACE: GEN(*/,T1PLACE,T2PLACE, T1); RETURN(T1PLACE) PROCEDURE F: IF SYM=标识符 RETURN(ENTRY(i) ELSE IF SYM= PLACE:=E; RETURN(PLACE) ELSE ERROR这里:E表达式;T项;F因式;ADVANCE将输入串指针调整至指向下一个输入字符;NEWTEMP分配一个新的工作单元;GEN将一个四元式填入四元式表;ENTRY查找名表,并获得名字所在位置值。3. 具体要求(1)完善并用程序实现2中的翻译算法(2)用算符优先分析法或LR分析法实现所要求的翻译(3)调试、运行翻译程序,观察中间代码的生成过程并写出实习报告结束语编译程序从输入高级语言源程序到输出目标代码(比如汇编语言),是一个庞大的系统工程,是一个有机整体。每个实验在单独进行的同时,要注意其前驱工作和后继工作,比如语法分析器的输入是词法分析器的输出,而语法分析器的输出将作为代码优化或目标代码生成器的输入。本课程结束之后还有一周的课程设计,课程设计的基本要求就是将词法分析程序与语法分析程序连在一起进行。此外,根据教学要求的不同,还可增加其它的实验,比如语义程序设计、目标代码生成器的设计与实现等。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1