一.扩展完成功能
- 语句注释;
- 扩展条件及短路计算;
- else语句实现;
- for语句实现;
- exit及break语句实现;
- 多维数组实现;
- 输入输出语句实现。
二.词法分析修改情况
- 原始PL0中的FIRST(S)集与FOLLOW(S)集情况如下表:
扩展之后做了以下修改:
1)语句(statement)的FIRST(S)添加以下元素:for,break,exit
2)条件(condition)的follow(S)添加了以下元素:not,or,and - 对于保留字、符号、指令的添加如下:
1)保留字:
对应的整形符号:
2)指令:
增加的各指令作用为:
JPNC:满足条件则跳转;
LDA :加载数组值到栈顶;
STA :存储数组值到偏移地址上;
RDA :读取数组指令;
WTA :打印数组指令;
READ:读取变量值;
WRITE:打印变量值。
oprcode在原有13条指令的基础上,额外添加了5条:
OPR_NOT:对栈顶值取非;
OPR_WEN:打印空格指令;
OPR_WRITE:打印栈顶常数指令;
OPR_ADDPLUS: 进行+=运算;
OPR_SUBPLUS: 进行-=运算。
3)符号:
‘&’,‘|’,‘!’其作用和and,or,not作用一样,可以用符号代替,而‘[’和‘]’用于数组的判断,‘%’用于求模运算。
三.实现过程
注释
在getsym( )函数中添加以下条件
当ch == ‘/’时如果,下一个字符是’*’,然后一直循环直到找到‘’*”,然后再取下一个字符‘/’。这样就跳过了/**/之间的所有字符,然后调用getsym( )取下一个符号
当连续出现两个//时,则令cc=ll,代表跳过该行的所有字符。然后继续getsym( )取下一个字符。条件扩展
添加了”or”,”and”,”not”关键字。
同时添加了以下全局变量:
下面看条件扩展代码:
通过重写ex_condition( )函数,调用condition( )函数。
注意: condition( )的follow(S)需要添加 sym_or,sym_and,sym_not;