1 扩充功能的总体概述
增加处理更多语法成分的功能:一维数组,++,+=,–,-=,*=,/=,<>,for-to,repeat-util,if-then-else,floor向下取整,ceil向上取整,pow2求二次方,pow3求三次方,float类型,出错展示等。
1、修改PL/0编译程序的头文件pl0.h:
(1)关键字的个数norw扩展到24,其中新增已经实现else, for, repeat, to, until, array,float,floor,ceil,pow2,pow3;
(2)在enum symbol中新加入共19个单词种别(numberf,elsesym,forsym,tosym,repeatsym,untilsym,twoplus,pluseql,twominus,minuseql,timeseql,slasheql,lbrack,rbrack,flosym,floorsym,ceilsym,pow2sym,pow3sym),同时将symnum改为51。
(3)在名字表中的类型enum object中加入array,flo。
(4)在虚拟机代码中新增STA,LDA,LTF用于一维数组,同时将fctnum改为11。
2、修改PL/0编译程序的源文件pl0.c初始化部分:
(1)设置新增单字符符号
ssym['['] = lbrack;
ssym[']'] = rbrack;
(2)重新设置保留字名字,并按照字母顺序重新排列,便于折半查找
strcpy(&(word[0][0]), "begin");
strcpy(&(word[1][0]), "call");
strcpy(&(word[2][0]), "ceil");//新增ceil
strcpy(&(word[3][0]), "const");
strcpy(&(word[4][0]), "do");
strcpy(&(word[5][0]), "else");//新增else
strcpy(&(word[6][0]), "end");
strcpy(&(word[7][0]), "float");//新增float
strcpy(&(word[8][0]), "floor");//新增floor
strcpy(&(word[9][0]), "for");//新增for
strcpy(&(word[10][0]), "if");
strcpy(&(word[11][0]), "odd");
strcpy(&(word[12][0]), "pow2");//新增pow2
strcpy(&(word[13][0]), "pow3");//新增pow3
strcpy(&(word[14][0]), "procedure");
strcpy(&(word[15][0]), "read");
strcpy(&(word[16][0]), "repeat");//增加repeat
strcpy(&(word[17][0]), "then");
strcpy(&(word[18][0]), "to");//新增to
strcpy(&(word[19][0]), "until");//新增until
strcpy(&(word[20][0]), "var");
strcpy(&(word[21][0]), "while");
strcpy(&(word[22][0]), "write");
(3)设置新增保留字符号
wsym[0] = beginsym;
wsym[1] = callsym;
wsym[2] = ceilsym;
wsym[3] = constsym;
wsym[4] = dosym;
wsym[5] = elsesym;
wsym[6] = endsym;
wsym[7] = flosym;
wsym[8] = floorsym;
wsym[9] = forsym;
wsym[10] = ifsym;
wsym[11] = oddsym;
wsym[12] = pow2sym;
wsym[13] = pow3sym;
wsym[14] = procsym;
wsym[15]

3万+

被折叠的 条评论
为什么被折叠?



