小型编译程序的设计与实现_第1页
小型编译程序的设计与实现_第2页
小型编译程序的设计与实现_第3页
小型编译程序的设计与实现_第4页
小型编译程序的设计与实现_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、小型编译程序的设计与实现本实验设计的小型编译程序涉及到编译前端的三个阶段:词法分析、语法分析和语义分析生成中间代码(四元式),编译程序的重点放在中间代码生成阶段。编译程序的输出结果包括词法分析后的二元式序列、变量名表;语法分析后的状态栈分析过程显示;语义分析生成中间代码后的四元式程序。整个程序分为三个部分:(1) 词法分析部分(2) 语法分析、语义分析及四元式生成部分(3) 输出显示部分1 词法分析器设计词法分析器的功能是输入源程序,输出单词符号。我们规定输出的单词符号格式为如下的二元式:(单词种别编码,单词自身的值)由于我们规定的程序语句中涉及单词较少,故在词法分析阶段忽略了单词输入错误的检

2、查。1.1 单词符号的内部定义及在编译程序中的定义我们对常量、变量、临时变量、保留关键字(if、while、begin、end、else、then、do等)、关系运算符、逻辑运算符、分号、括号等,规定其内部定义如下:符 号种别编码说 明sy_if0保留字 ifsy_then1保留字 thensy_else2保留字 elsesy_while3保留字 whilesy_begin4保留字 beginsy_do5保留字 dosy_end6保留字 enda7赋值语句semicolon8“ ; ”e9布尔表达式Jinghao10“ # ”S11语句L12复合语句Tempsy15临时变量EA18B and(

3、即布尔表达式中的BEO19B or(即布尔表达式中的B Plus34“ + ”Times36“ * ”Becomes38“ := ” 赋值Op_and39“ and ”Op_or40“ or ”Op_not41“ not ”Rop42关系运算符Lparent48“ ( ”Rparent49“ ”Ident56变量Intconst57整常量#include "stdio.h" /*如果使用TC的话,需要配置头文件路径*/#include "string.h"#define ACC -2/*/#define sy_if 0#define sy_then 1#

4、define sy_else 2#define sy_while 3#define sy_begin 4#define sy_do 5#define sy_end 6#define a 7#define semicolon 8#define e 9#define jinghao 10#define S 11#define L 12#define tempsy 15#define EA 18 /*E and*/#define E0 19 /E or*/#define plus 34#define times 36#define becomes 38#define op_and 39#define

5、 op_or 40#define op_not 41#define rop 42#define lparent 48#define rparent 49#define ident 56#define intconst 571.2 变量及数据结构说明编译程序中涉及到的变量及数据结构说明如下:char ch='0' /*从字符缓冲区读取当前字符*/int count=0; /*词法分析结果缓冲区计数器*/static char spelling10="" /*存放识别的字*/static char line81="" /*一行字符缓冲区,最多

6、80个字符*/char *pline; /*字符缓冲区指针*/static char ntab110010; /*变量名表,共100项,每项长度10*/struct ntabint tc; /*真值*/int fc; /*假值*/ntab2200; /*在布尔表达式E中保存有关布尔变量的真、假值*/int label=0; /*指向ntab2的指针*/struct rwordschar sp10;int sy; /*保留字表的结构,用来与输入缓冲区中的单词进行匹配*/struct rwords reswords10="if",sy_if,"do",sy_

7、do,"else",sy_else,"while",sy_while,"then",sy_then,"begin",sy_begin,"end",sy_end,"and",op_and,"or",op_or,"not",op_not; /*保留字表初始化,大小为10*/struct aaint sy1; /*存放单词的种别编码*/int pos; /*存放单词自身的值*/buf1000, /*词法分析结果缓冲区*/n, /*读取二元式的

8、当前字符*/n1, /*当前表达式中的字符*/E, /*非终结符*/sstack100, /*算术或布尔表达式加工处理使用的符号栈*/ibuf100, /*算术或布尔表达式使用的缓冲区*/stack1000; /*语法分析加工处理使用的符号栈*/struct aa oth; /*四元式中的空白位置*/struct fourexpchar op10;struct aa arg1;struct aa arg2;int result;fexp200; /*四元式的结构定义*/int ssp=0; /*指向sstack栈指针*/struct aa *pbuf=buf; /*指向词法分析缓冲区的指针*/

9、int nlength=0; /*词法分析中记录单词的长度*/int tt1=0; /*变量名表指针*/char *cfile; /*源程序文件,为结束符*/int lnum=0; /*源程序行数记数*/int sign=0; /*sign=1为赋值语句;=2为while语句;=3为if语句*/*/int newt=0; /*临时变量计数器*/int nxq=100; /*nxq总是指向下一个将要形成的四元式地址,*/*每次执行gen()时,地址自动增1*/int lr; /*扫描LR分析表1过程中保存的当前状态值*/int lr1; /*扫描LR分析表2或表3所保存的当前状态值*/int s

10、p=0; /*查找LR分析表时状态栈的栈顶指针*/int stack1100; /*状态栈1定义*/int sp1=0; /*状态栈1的栈顶指针*/int num=0; /*算术或布尔表达式缓冲区指针*/struct llint nxq1; /*记录下一条四元式的地址*/ int tc1; /*真值链*/int fc1; /*假值链*/labelmark10; /*记录语句嵌套层次的数组,*/*即记录嵌套中每层的布尔表达式E的首地址*/int labeltemp10; /*记录语句嵌套层次的数组,*/*即记录每层else之前的四元式地址*/int pointmark=-1, /*labelma

11、rk数组指针*/pointtemp=-1; /*labeltemp数组指针*/1.3 主函数main()void main(cfile=fopen("pas.dat","r" /*打开C语言源文件*/readch(; /*从源文件读一个字符*/scan(; /*词法分析*/disp1(;disp3(;stacksp.pos=0;stacksp.sy1=-1; /*初始化状态栈*/stack1sp1=0; /*初始化状态栈1*/oth.sy1=-1;printf("n* 状态栈变化过程以及归约顺序 *n"readnu(; /*从二元式读

12、入一个符号*/lrparse(; /*语法语义分析产生四元式*/getch(;disp2(;printf("n程序运行结束!n"getch(;1.4 词法分析函数说明(1) 读取函数 readline( 、readch( 词法分析包含从源文件读取字符的操作,但频繁的读文件会影响程序执行效率,故实际上是从源程序文件“pas.dat”中读取一行到输入缓冲区,而词法分析过程中每次读取一个字符时则是通过执行readch()从输入缓冲区获得的;若缓冲区已被读空,则再执行readline()从pas.dat中读取下一行至输入缓冲区。/*从文件读一行到缓冲区*/readline(char

13、 ch1;pline=line;ch1=getc(cfile; while(ch1!='n' && !feof(cfile*pline=ch1;pline+;ch1=getc(cfile; *pline='0'pline=line;/*从缓冲区读取一个字符*/readch(if(ch='0'readline(;lnum+;ch=*pline;pline+;(2) 扫描函数 scan( 扫描函数scan()的功能是滤除多余空格并对主要单词进行分析处理,将分析得到的二元式存入二元式结果缓冲区。/*扫描主函数*/scan(int i;w

14、hile(ch!='' /*是源程序结束符号*/switch(chcase ' ':break;case 'a' :case 'b' :case 'c' :case 'd' :case 'e' :case 'f' :case 'g' :case 'h' :case 'i' :case 'j' :case 'k' :case 'l' :case 'm' :ca

15、se 'n' :case 'o' :case 'p' :case 'q' :case 'r' :case 's' :case 't' :case 'u' :case 'v' :case 'w' :case 'x' :case 'y' :case 'z' : /*保留字和标识符中的字母只能是小写字母*/identifier(; /*识别保留字和标识符*/break;case '0&#

16、39; :case '1' :case '2' :case '3' :case '4' :case '5' :case '6' :case '7' :case '8' :case '9' :number(; /*识别整常数*/break;case '<' :readch(;if(ch='='bufcount.pos=0; /*识别<=*/elseif(ch='>' bufcount.po

17、s=4; /*识别<>*/elsebufcount.pos=1; /*识别<*/pline-;bufcount.sy1=rop; /*识别关系运算符*/count+;break;case '>' :readch(;if(ch='='bufcount.pos=2; /*识别>=*/elsebufcount.pos=3; /*识别>*/pline-;bufcount.sy1=rop; /*识别关系运算符*/count+;break;case '(' :bufcount.sy1=lparent; /*识别(*/cou

18、nt+;break;case '' :bufcount.sy1=rparent; /*识别*/count+;break;case '#' :bufcount.sy1=jinghao; /*识别#*/count+;break;case '+' :bufcount.sy1=plus; /*识别+*/count+;break;case '*' :bufcount.sy1=times; /*识别*/count+;break;case ':' :readch(;if(ch='='bufcount.sy1=be

19、comes; /*识别:=*/count+;break;case '=' :bufcount.sy1=rop;bufcount.pos=5; /*识别=,关系算符*/count+;break;case '' :bufcount.sy1=semicolon; /*识别;*/count+;break;readch(;bufcount.sy1=-1; /*不可识别的符号*/(3) 变量处理及变量名表 find( 变量处理中首先把以字母开头的字母数字串存到spelling10数组中,然后进行识别。识别过程是先让它与保留关键字表中的所有关键字进行匹配,若获得成功则说明它为

20、保留关键字,即将其内码值写入二元式结果缓冲区;否则说明其为变量,这时让它与变量名表中的变量进行匹配(变量匹配函数find(),如果成功,则说明该变量已存在并在二元式结果缓冲区中标记为此变量(单词自身值填为该变量在变量名表中的位置),否则将该变量登记到变量名表中,再将这个新变量存入二元式缓存数组中。/* 变量匹配,查找变量名表 */find(char spelint ss1=0;int ii=0;while(ss1=0&&(ii if(!strcmp(spel,ntab1ii ss1=1; /*查找,匹配*/ii+;if(ss1=1 return ii-1; /*查找到*/els

21、e return -1; /*没查找到*/*标识符和保留字的识别*/identifier(int iii=0,j,k;int ss=0;k=0;dospellingk=ch;k+;readch(;while(ch>='a'&&(ch<='z'|(ch>='0'&&(ch<='9'pline-;spellingk='0'while(ss=0&&(iii<10if(!strcmp(spelling,reswordsiii.sp ss=1; /

22、*保留字匹配*/iii+;if(ss=1bufcount.sy1=reswordsiii-1.sy; /*是保留字*/elsebufcount.sy1=ident; /*是标识符,变量名*/j=find(spelling;if(j=-1 /*没有在变量名表中则添加*/bufcount.pos=tt1; /*tt1是变量名表指针*/strcpy(ntab1tt1,spelling;tt1+;nlength+;else bufcount.pos=j; /*获得变量名自身的值*/count+;for(k=0;k<10;k+ spellingk='' /*清空单词符号缓冲区*/(

23、5) 数字识别 number( 数字识别将识别出的数字转换为等值的十进制数值并填入二元式结果缓存数组。/*数字识别*/number(int ivalue=0;int digit;dodigit=ch-'0'ivalue=ivalue*10+digit; /*数字字符转换为十进制整常数*/readch(;while(ch>='0'&&(ch<='9'bufcount.sy1=intconst; /*整常数单词符号二元式*/bufcount.pos=ivalue;count+;pline-;(6) 显示函数显示函数的功能是

24、在屏幕上输出词法分析的结果(即二元式序列和变量名表),同时给出二元式个数及源程序行数统计。/* 显示词法分析结果:单词符号二元式 */disp1(int temp1=0;printf("n* 词法分析结果 *n"for(temp1=0;temp1 printf("%dt%dn",buftemp1.sy1,buftemp1.pos;if(temp1=20printf("Press any key to continue.n"getch(;getch(;/* 打印变量名表 */void disp3(int tttt;printf(&quo

25、t;nn程序总共%d行,产生了%d个二元式!n",lnum,count;getch(;printf("n* 变量名表 *n"for(tttt=0;tttt printf("%dt%sn",tttt,ntab1tttt;getch(;2. 语法语义分析器设计语法语义分析器的核心是描述程序语句、算术表达式、布尔表达式语法分析的三张LR分析表以及针对这三张LR分析表进行语义加工的语义动作。编译程序中语法分析处理及四元式生成部分主要是以二元式作为输入,并且通过LR分析表对语法分析处理过程进行控制,使四元式翻译的工作有条不紊的进行,同时识别语法分析中的语

26、法错误。在处理if和while语句时,需要进行真值或假值的拉链和回填工作,以便转移目标的正确填入。2.1 LR分析表及实现(1)程序语句的文法及LR分析表实现程序语句的文法GS如下:Sif e then S else S|while e do S|begin L end|aLS;L|S在本小型编译程序的设计与实现中,我们将赋值语句与算术表达式归为一类处理,故在此处将赋值语句仅看作为程序语句文法中的一个终结符号a,将布尔表达式也看作终结符号e。将文法GS拓广为GS:(0 SS(1 Sif e then S else S(2 Swhile e do S(3 Sbegin L end(4 Sa(5

27、LS(6 LS;L由此得到程序语句LR分析的SLR(1)分析表如下:状态ACTIONGOTOifthenelsewhilebegindoenda;e#SL0s2s3s4s511acc2s63s74s2s3s4s5985r4r4r4r46s107s118s129r5s1310s2s3s4s51411s2s3s4s51512r3r3r3r313s2s3s4s591614s1715r2r2r2r216r617s2s3s4s51818r1r1r1r1在小型编译程序中程序语句的SLR(1)分析表设计如下:/* 程序语句的LR分析表 */static int action1913= /*0*/ 2, -1

28、, -1, 3, 4, -1, -1, 5, -1, -1, 10, 1, -1 ,/*1*/ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ACC, -1, -1 ,/*2*/ -1, -1, -1, -1, -1, -1, -1, -1, -1, 6, -1, -1, -1 ,/*3*/ -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, -1, -1, -1 ,/*4*/ 2, -1, -1, 3, 4, -1, -1, 5, -1, -1, -1, 9, 8 ,/*5*/ -1, -1,104, -1, -1, -1,104,

29、 -1,104, -1, 104, -1, -1 ,/*6*/ -1, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ,/*7*/ -1, -1, -1, -1, -1, 11, -1, -1, -1, -1, -1, -1, -1 ,/*8*/ -1, -1, -1, -1, -1, -1, 12, -1, -1, -1, -1, -1, -1 ,/*9*/ -1, -1, -1, -1, -1, -1,105, -1, 13, -1, -1, -1, -1 ,/*10*/ 2, -1, -1, 3, 4, -1, -1, 5, -1, -1,

30、 -1, 14, -1 ,/*11*/ 2, -1, -1, 3, 4, -1, -1, 5, -1, -1, -1, 15, -1 ,/*12*/ -1, -1,103, -1, -1, -1,103, -1,103, -1, 103, -1, -1 ,/*13*/ 2, -1, -1, 3, 4, -1, -1, 5, -1, -1, -1, 9, 16 ,/*14*/ -1, -1, 17, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ,/*15*/ -1, -1,102, -1, -1, -1,102, -1,102, -1, 102, -1, -1

31、,/*16*/ -1, -1, -1, -1, -1, -1,106, -1, -1, -1, -1, -1, -1 ,/*17*/ 2, -1, -1, 3, 4 ,-1, -1, 5, -1, -1, -1, 18, -1 ,/*18*/ -1, -1,101, -1, -1, -1,101, -1,101, -1, 101, -1, -1 ;其中前11列为action值,后2列为goto值;018表示19个移进状态(即Sj);-1表示出错;acc表示分析成功;而100106对应7个归约产生式:100: SS101: S if e then S else S e是布尔表达式,看作终结符号1

32、02: S while e do S 103: S begin L end104: S a a是赋值语句,看作终结符号105: L S106: L S;L(2) 算术表达式的LR分析表实现算术表达式的文法GE如下:EE+E|E*E|(E)|i将文法GE拓广为GS(0 SE(1 E E+E(2 E E*E(3 E (E(4 E i由此得到算术表达式LR分析的SLR(1)分析表如下:状态ACTIONGOTOi+*()#E0s3s211s4s5acc2s3s263r4r4r4r44s3s275s3s286s4s5s97r1s5r1r18r2r2r2r29r3r3r3r3编译程序中算术表达式的SLR(

33、1分析表设计如下:/* 算术表达式的LR分析表 */static 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 ,/*7*/ -1, 101, 5, -1,101,101 ,-

34、1 ,/*8*/ -1, 102,102,-1,102,102, -1 ,/*9*/ -1, 103,103,-1,103,103, -1 ;其中前6列为action值,后1列为goto值; 09表示10个移进状态(即Sj);-1表示出错;ACC表示分析成功;而100104对应5个归约产生式:100: SE101: E E + E102: E E * E103: E ( E 104: E i(3) 布尔表达式的LR分析表实现布尔表达式的文法GB如下:BBB|BB|B|(B|i rop i | i 为了便于语法分析时的加工处理,将上述文法改写为文法GS:BBAB|BOB|B|(B|i rop i

35、 | i BABBOB将文法GS拓广为文法GS(0 SB (1 B i (2 B i rop i (3 B (B (4 B not B(5 A B and(6 B AB(7 O B or(8 B OB由此得到算术表达式LR分析的SLR(1)分析表如下:状态ACTIONGOTOirop(notandor#BAO0s1s4s513781s2r1r1r1r12s33r2r2r2r24s1s4s511785s1s4s56786r1s9s10r47s1s4s514788s1S4S515789r5r5r510r7r7r711s12s9s1012r3r3r3r313s9s10acc14r6s9s10r615

36、r8s9s10r8编译程序中布尔表达式LR分析的SLR(1分析表设计如下:/* 布尔表达式的LR分析表 */static 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, -1,

37、 -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, -1, -1

38、,/*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 ;其中前8列为action值,后3列为goto值; 015表示16个移进状态(即Sj);-1表示出

39、错;acc表示分析成功;而100108对应9个归约产生式:100: SB101: B i102: B i rop i 103: B ( B 104: B not B105: A B and106: B AB107: O B or108: B OB2.2 算术表达式处理的语义加工程序根据算术表达式文法中产生式对应的语义动作,相应的加工处理程序如下:/* 赋值语句和算术表达式的分析 */lrparse1(int num int lr1;lr1=action1stack1sp1change1(n1.sy1;if(lr1=-1printf("n算术表示式或赋值语句出错!n"getc

40、h(;exit(0;if(lr1<10&&(lr1>=0 /*当前查找LR分析表中的状态为移进状态*/sp1+;stack1sp1=lr1;if(n1.sy1!=tempsyssp+;num+;sstackssp.sy1=n1.sy1; /*将变量名压栈*/sstackssp.pos=n1.pos; /*将变量名地址压栈*/n1.sy1=ibufnum.sy1;n1.pos=ibufnum.pos;lrparse1(num;if(lr1>=100&&(lr1,105 /*当前查找LR分析表中的状态为归约状态*/switch(lr1case 10

41、0: /* SE */break;case 101: /* EE+E */E.pos=newtemp(;gen("+",sstackssp-2,sstackssp,E.pos+100;ssp=ssp-2;sstackssp.sy1=tempsy;sstackssp.pos=E.pos;sp1=sp1-3;break;case 102: /* EE*E */E.pos=newtemp(;gen("*",sstackssp-2,sstackssp,E.pos+100;ssp=ssp-2;sstackssp.sy1=tempsy;sstackssp.pos=E

42、.pos;sp1=sp1-3; /* EE+E产生式右部长度为3,故归约后栈指针减3 */break;case 103: /* E(E) */E.pos=sstackssp-1.pos;ssp=ssp-2;sstackssp.sy1=tempsy;sstackssp.pos=E.pos;sp1=sp1-3;break;case 104: /* Ei */E.pos=sstackssp.pos;sp1-;break;n1.sy1=tempsy; /* 归约后为非终结符*/n1.pos=E.pos;lrparse1(num;if(lr1=ACC&&(stack1sp1=1 /*赋值

43、语句Ai:= E的归约*/gen(":=",sstackssp,oth,ibuf0.pos;ssp=ssp-3;sp1=sp1-3;2.3 布尔表达式处理的语义加工程序根据布尔表达式文法中产生式对应的语义动作,相应的加工处理程序如下:lrparse2(int numint templabel;lr1=action2stack1sp1change2(n1.sy1;if(lr1=-1if(sign=2 printf("nwhile语句出错!n"if(sign=3 printf("nif语句出错!n"getch(;exit(0;if(lr1

44、<16&&(lr1>=0 /*当前查找LR分析表中的状态为移进状态*/sp1+;stack1sp1=lr1;ssp+;sstackssp.sy1=n1.sy1;sstackssp.pos=n1.pos;if(n1.sy1!=tempsy&&(n1.sy1!=EA&&(n1.sy1!=E0 num+;n1.sy1=ibufnum.sy1;n1.pos=ibufnum.pos;lrparse2(num;if(lr1>=100&&(lr1<109 /*当前查找LR分析表中的状态为归约状态*/switch(lr1c

45、ase 100: /* S B */break;case 101: /* Bi */ntab2label.tc=nxq;ntab2label.fc=nxq+1;gen("jnz",sstackssp,oth,0;gen("j",oth,oth,0;sp1-;ssp-;label+;n1.sy1=tempsy;break;case 102: /* Bi rop i */ntab2label.tc=nxq;ntab2label.fc=nxq+1;switch(sstackssp-1.poscase 0:gen("j<=",sstac

46、kssp-2,sstackssp,0;break;case 1:gen("j<",sstackssp-2,sstackssp,0;break;case 2:gen("j>=",sstackssp-2,sstackssp,0;break;case 3:gen("j>",sstackssp-2,sstackssp,0;break;case 4:gen("j<>",sstackssp-2,sstackssp,0;break;case 5:gen("j=",sstackss

47、p-2,sstackssp,0;break;gen("j",oth,oth,0;ssp=ssp-3;sp1=sp1-3;label+;n1.sy1=tempsy;break;case 103: /* B(B */label=label-1;ssp=ssp-3;sp1=sp1-3;label+;n1.sy1=tempsy;break;case 104: /* Bnot B */label=label-1;templabel=ntab2label.tc;ntab2label.tc=ntab2label.fc;ntab2label.fc=templabel;ssp=ssp-2;s

48、p1=sp1-2;label+;n1.sy1=tempsy;break;case 105: /* AB and */backpatch(ntab2label-1.tc,nxq;label=label-1;ssp=ssp-2;sp1=sp1-2;label+;n1.sy1=EA;break;case 106: /* BAB */label=label-2;ntab2label.tc=ntab2label+1.tc;ntab2label.fc=merg(ntab2label.fc,ntab2label+1.fc;ssp=ssp-2;sp1=sp1-2;label+;n1.sy1=tempsy;br

49、eak;case 107: /* OB or */backpatch(ntab2label-1.fc,nxq;label=label-1;ssp=ssp-2;sp1=sp1-2;label+;n1.sy1=E0;break;case 108: /* B0B */label=label-2;ntab2label.fc=ntab2label+1.fc;ntab2label.tc=merg(ntab2label.tc,ntab2label+1.tc;ssp=ssp-2;sp1=sp1-2;label+;n1.sy1=tempsy;break;lrparse2(num;if(lr1=ACC return 1;2.4 程序语句的语义加工程序程序语句的语义加工包含前述算术表达式和布尔表达式语义加工程序的调用,最终形成各种程序语句对应的四元式序列,即实现整个源程序的翻译。程序语句的语义加工处理程序如下:/* 程序语句处理 */lrparse(int i1=0;int num=0; /*指向算术或布尔表达式缓冲区指针初始化*/if(test(n.sy1if(stacksp.sy1=sy_while sign=2;elseif(stacksp.sy1=s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论