2023年语义分析实验报告.docx
云南大学编译原理实验报告实验题目:语义分析学 院: 信息学院专 业:计算机科学与技术学 号:姓 名: 刘继远g F place=F();ot v = tv+ 1 ;8g e n (divid, pi,F p lac e ,tv);o P s =P ( t v );。(3)、在gen ()函数里模仿*运算,增长相应的四元式输出语句:i f ( o p = d iv i d)/ /运算(f pri n tf (f o u t(/,% s ,%s, %s) e mphtem p 2,tem p 3);。 p r i n t f (" (/,%s, %s,%s) H,t e mpl, t emp2,tem p 3 );这样就在程序中增长了' / '运算的分析规定。2、严禁同名反复声明所以登记符号之前要检查有没有同名变量声明过。由于table t x数组就是存放声明变量名和类型的结构体数组,可以在en t e r()这个存放声明变量的函数中,增长相应检查变量名反复的函数:f o r (int i =l;i<txmax;i+) 。/*检查变量是否重名*/« i f(s t r c mp (id,tab 1 e i. n a me) = 0) 。gprindT错误4:变量名反复.n");exi t ( 0 );00 J。)每次要把一个变量加入到t a b lef t x数组中都要检瓷变量名是否跟t abl e tx数组中已有的变量名反复,反复就报错,并跳出程序。这样就在程序中增长了检查反复变量名的功能。五、结果及分析1、运营的文献a. t x t内容为:r eal a, b ;nt c , d;c:= c + d *b;d:=b*a.运营结果为:*C: Docu>ent s and Sett ings'Adainist 工at or桌面St art er Files请揄入分析的文件名dtxt 请辎入保存分析错果的文件名:b.txt<*,d,b,T101><+,c,T101,T102><:=,T102,c><*,b,a,T103><:=,T103,d>语法正确Press any key to continue2、运营文献a.lx t的内容为:real a, b;int c, d , a; c:=c+d*b;d:=b*a.运营结果为:c : *C: Docu>ent s and Sett ings'Adbuinist rat or桌面St art er ,请揄入分析的文件名:a.txt 请输入葆叁分帝结界的文彳牛名=bl.txt 输臭4:变量名重复.Press any key to continue.3、运营文献a.txt的内容为:real a, b;i n t c, d ; f:=c+ d *b;d: =b*a.运营的结果为:从以上三个结果(一个对的,两个错误)来看,完全实现了扩展规定的两个功 能,也完全符合定义的语法语义规则。目录一、实验目的错误!未定义书签。二、实验内容。错误!未定义书签。三、源程序分析 错误!未定义书签。1、程序采用的BNF 错误!未定义书签。2、根据语义规定得到相应的翻译模式。错误!未定义书签。3、实现原理错误!未定义书签。4、文法的属性分析。错误!未定义书签。5、过程设计错误!未定义书签。6、子程序说明。错误!未定义书签。四、设计的基本思想(涉及修改之后的属性文法、属性类型分析、翻译模式)。错误!未定义书签。1、增长除法运算 错误!未定义书签。2、严禁同名反复声明错误!未定义书签。五、结果及分析 错误!未定义书签。一、实验目的进一步理解递归下降分析原理和实现方法,理解语义分析的基本机制, 掌握语义子程序的构造方法。二、实验内容将带变量声明的表达式翻译为四元式序列,其中涉及以下规定: 非终结符号D实现定义两种类型int, real变量的声明; 非终结符号S实现变量之间的*, +,:=(赋值运算) 两个关键字int和real变量之间的*,+ ,:=(赋值)运算只能使用声明过的变量,所以要检查使 用的变量是否声明过。 对每个*,+ ,:=(赋值)运算生成一条四元式如(*, A, B,T1),其中T1是临时变量 *优先级别高于十,*满足左结合规则三、源程序分析这是一个简朴的包含词法、语法、语义分析的程序:语义分析.h和语义 分析.cpp。实现的基本原理是自顶向下分析,单遍扫描,以语法分析为核心,调 用词法分析,并实现语义分析。1、程序采用的BNFP DS.DB;DD-£B >int L | real LL-> i d | L, idS-> V := E HH->S |eEE+T | TTT*F I FF-( E )FidV->id消除左递归之后的等价文法s t a rt> D S .DB;DD-£B i n t L | r eal LL 一 idAA ,id AA 一gS->V : =E HH->S 18E->T RR-十T RR> £T->F PP一* FPP-£F ( E )FidVid2、根据语义规定得到相应的翻译模式s t art>D S .D b;dD-£B*i nt L L.t y pe : = int | real L L.t y pe := real L一 id A.Type := L . type enter(v.e n tr y , L.typ e ) AA> , idA A 1. Type : = A.type enter(v.e n try, A .ty p e) A>8S->V : =E gen( H:=", E.place,O,V. pl a c e) HH;S | £E->T R.i: =T. place E . place:=R.sR十 T RI. i := new temp; g e n (, R. i , T. p lac e , Rl.i) R R. s := RI. s ; R 8Rs= R. i TF P. i :=F.pl a c e P T. p 1 a c e: =P.sP> 大 F p 1 .i:= newtem p ; g e n( "* n , P.i, F.plac e , T) P P.s:= pl. s ;)P->8P. s =P.iF( E) F.place := E. p lace)F>i dF.place: = p o sition (id) V>idV.plac e :=positi o n (i d )3、实现原理基于翻译模式的自上而下语义解决(翻译).对每个非终结符A,构造一个函数,以 A的每个继承属性为形参,以A 的综合属性为返回值(若有多个综合属性,可返回记录类型的值)。如同预 测分析程序的构造,该函数代码的流程是根据当前的输入符号来决定调用 哪个产生式。1 .与每个产生式相关的代码根据产生式右端的终结符,非终结符,和语义规则集 (语义动作),依从左到右的顺序完毕下列工作:(1)对终结符X,保存其综合属性x的值至专为X.x而声明的变量;然 后调用匹配终结符(mal c h_t o ken)和取下一输入符号(ne x t to ken )的函数;(2)对非终结符B,运用相应于B的函数调用产生赋值语句c:= B(bl,b2,bk),其中变量bl, b2,,bk相应B的各继承属性,变量c相应B的综合属性(3)对语义规则集,直接copy其中每一语义规则(动作)来产生代码,只是将对属性的访问替换为对相应变量的访问o4、文法的属性分析文法符号属性综合或继承含义sta r t无D无B无LL .typ e继承类型AA.t y pe继承类型S无EE . plac e综合指向变量或临时变量的指针(用整数 实现)RR.i继承同上R.s综合同上TT . plac e继承同上PP.i继承同上P.S综合同上FF.plac e综合同上VV .plac e综合同上5、过程设计i n t getsym();读一个单词void e n tcr( e num symbol type); /登记符号表void i nit ();in t position(char* id t ); 查询符号表用函数,返回在符号表中位置i nt g e n( e num s ym b ol op, int a r gl, i n t ag r 2 ,in t r esult ); / 生成四元式void newtemp ()申请临时变量v oid sta r t ();v o id D ();v oid BO;v oid L(e n um symb o 1 t yp e );v o id A(enum symbo 1 typ e );void S();void H();int E();in t R(int R i );in t T ();i n t P(int pi);int F();int V();6、子程序说明in i t(): 初始化函数,重要是用于把单字符(例如:+、一、*、/)赋值一 个 symbol。getsym():把文献中的一个字符或者一个字符串分类成各种类型,用sym表达。e nter():把声明过的变量保存到t a b Ie lx这个结构体数组中。P ositi o n ():查找名字的位置,找到则返回在名字表中的位置,否则返回0。gen ():生成中间代码,通过传来的参数生产四元式。s tart():开始对整个文献的语法语义经行分析。D ( )、B ( )、L()、A ():实现变量的声明,并把变量的类型和名字保存到 t ab 1 e t x 这个结构体数组中。S( )、H()、E( )、T()、P ( )、R ( )、F()、V():实现后面程序运算语句的检 查,并生成中间代码;其中:S()是检查赋值运算;H()是执行下一条运算语句;E()分析赋值号后面的运算;R()是实检查+运算;P()是检查*、/运算;F()是实现*、/运算的优先级高于十运算,并获得当前位置的ID;V ()获得当前位置的I Do四、设计的基本思想(涉及修改之后的属性文法、属性类型分 析、翻译模式)按照扩展规定分析:1、增长除法运算 *,/优先级别高于+, *和/满足左结合规则对包含除法运算的表达式生成相应的四元式(1)、可以在翻译模式中非终结符P增长一个产生式:P> / F p 1 . i := newt e mp; g en( V", P.i, F. p lace , T) P P. s:= pl. s; , 这样就在翻译模式中增长了 ' / '运算;(2)、在程序中的P()函数里面模仿'* '运算,增长相应的分析语句:if (s y m = =div i d)®6 g cts y m();