PL/0编译器设计扩展

本文介绍了对PL/0编译器的扩展,包括添加语句注释、条件及短路计算、else语句、for循环、exit和break语句、多维数组以及输入输出的支持。详细阐述了实现过程,并通过测试案例分析了扩展功能的正确性和效率。
摘要由CSDN通过智能技术生成
一.扩展完成功能
  1. 语句注释;
  2. 扩展条件及短路计算;
  3. else语句实现;
  4. for语句实现;
  5. exit及break语句实现;
  6. 多维数组实现;
  7. 输入输出语句实现。
二.词法分析修改情况
  1. 原始PL0中的FIRST(S)集与FOLLOW(S)集情况如下表:
    1
    扩展之后做了以下修改:
    1)语句(statement)的FIRST(S)添加以下元素:for,break,exit
    2)条件(condition)的follow(S)添加了以下元素:not,or,and
  2. 对于保留字、符号、指令的添加如下:
    2
    1)保留字:
    对应的整形符号:
    3
    2)指令:
    4
    增加的各指令作用为:
    JPNC:满足条件则跳转;
    LDA :加载数组值到栈顶;
    STA :存储数组值到偏移地址上;
    RDA :读取数组指令;
    WTA :打印数组指令;
    READ:读取变量值;
    WRITE:打印变量值。
    5
    oprcode在原有13条指令的基础上,额外添加了5条:
    OPR_NOT:对栈顶值取非;
    OPR_WEN:打印空格指令;
    OPR_WRITE:打印栈顶常数指令;
    OPR_ADDPLUS: 进行+=运算;
    OPR_SUBPLUS: 进行-=运算。
    3)符号:
    6
    ‘&’,‘|’,‘!’其作用和and,or,not作用一样,可以用符号代替,而‘[’和‘]’用于数组的判断,‘%’用于求模运算。
三.实现过程
  1. 注释
    在getsym( )函数中添加以下条件
    7
    当ch == ‘/’时如果,下一个字符是’*’,然后一直循环直到找到‘’*”,然后再取下一个字符‘/’。这样就跳过了/**/之间的所有字符,然后调用getsym( )取下一个符号
    8
    当连续出现两个//时,则令cc=ll,代表跳过该行的所有字符。然后继续getsym( )取下一个字符。

  2. 条件扩展
    添加了”or”,”and”,”not”关键字。
    同时添加了以下全局变量:
    9
    下面看条件扩展代码:
    通过重写ex_condition( )函数,调用condition( )函数。
    注意: condition( )的follow(S)需要添加 sym_or,sym_and,sym_not;

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值