pl0语言的扩充之repeat-until语句

repeat语句系列的扩充可以仿照while-do语句,但要注意repeat语句系列没有无条件跳转,while-do语句有。程序按顺序执行,在条件语句后存在一个条件跳转指令,跳转地址未定,当条件判断为假时回到repeat后面的循环开始位置,所以循环体语句开始位置要保存记录,当条件为真时,语句结束。


具体代码更改如下
头文件:

#define norw 16     /* 关键字个数 */

符号:

/* 符号 */
enum symbol {nul,         ident,     number,     plus,      minus,times,       slash,     oddsym,     eql,       neq,lss,         leq,       gtr,        geq,       lparen,rparen,      comma,     semicolon,  period,    becomes,beginsym,    endsym,    ifsym,      thensym,   whilesym,writesym,    readsym,   dosym,      callsym,   constsym,varsym,      procsym,   elsesym,    repeatsym, untilsym,
};
#define symnum 35

pl0.c:
保留字更改

/* 设置保留字名字,按照字母顺序,便于折半查找 */strcpy(&(word[0][0]), "begin");strcpy(&(word[1][0]), "call");strcpy(&(word[2][0]), "const");strcpy(&(word[3][0]), "do");strcpy(&(word[4][0]), "else");strcpy(&(word[5][0]), "end");strcpy(&(word[6][0]), "if");strcpy(&(word[7][0]), "odd");strcpy(&(word[8][0]), "procedure");strcpy(&(word[9][0]), "read");strcpy(&(word[10][0]), "repeat");//添加的 strcpy(&(word[11][0]), "then");strcpy(&(word[12][0]), "until");//添加的 strcpy(&(word[13][0]), "var");strcpy(&(word[14][0]), "while");strcpy(&(word[15][0]), "write");

保留字符号

/* 设置保留字符号 */wsym[0] = beginsym;wsym[1] = callsym;wsym[2] = constsym;wsym[3] = dosym;wsym[4] = elsesym;wsym[5] = endsym;wsym[6] = ifsym;wsym[7] = oddsym;wsym[8] = procsym;wsym[9] = readsym;wsym[10] = repeatsym;//添加的wsym[11] = thensym;wsym[12] = untilsym;//添加的wsym[13] = varsym;wsym[14] = whilesym;wsym[15] = writesym;

repeat-until语句:

 else{if(sym == repeatsym) {cx1=cx;//记录循环体开始位置 getsymdo;//根据词法规则识别及组合单词,进行词法检查 memcpy(nxtlev, fsys, sizeof(bool)*symnum);//内存拷贝函数 nxtlev[untilsym] = true; //后跟符号为untilstatementdo(nxtlev, ptx, lev);//处理循环体语句 if(sym == untilsym){getsymdo;conditiondo(nxtlev, ptx, lev);  /* 调用条件处理 */gendo(jpc,0,cx1);//生成条件跳转指令 ,不满足条件时则跳转至循环开始位置 }else{error(19);//缺少until }}

修改完成,最后可用一个具体的pl0语言写的程序验证结果。
例如:

const a=10;
var b, c;procedure p;beginc:=b+aend;beginrepeat beginread(b);if b>10 then write(b*2)else write(b)end  until b=0
end.

最终结果:

pl0语言的扩充之repeat-until语句相关推荐

  1. 编译原理课程设计-对pl0语言进行扩充

    文章目录 一. 设计目的及要求 1.1 设计目的 1.2 设计要求 1.2.1 要求一 1.2.2 要求二 1.2.3 要求三 二.程序设计 2.1 程序的组织结构 2.1.1 PL/0编译程序函数定 ...

  2. 中山大学编译原理实验——实现PL0语言的编译程序(无坑有缩进版)

    PL0-Compiler 代码传送门 ps:吐槽一下,老师给的代码实在是太烂了.又没缩进又多编译错误,除此之外还有很多细节漏掉关键字,总之就很多坑,所以这里发一个无坑带缩进版,方便大家学习. 中山大学 ...

  3. 基于C++的PL0语言编译器及功能扩充

    文章目录 一.实验介绍 1. PL0文法说明 2. PL0主函数 3. 词法分析函数 4. 语法语义分析 二.功能扩展 1. 功能扩充后的EBNF表示 2. 功能扩充后的语法表述图 3. 新增部分功能 ...

  4. 编译原理大作业-PL0语言编译器

    编译原理大作业-PL0语言编译器 一.实验目的 二.源码说明 1.头文件pl0.h (1 词法分析主要数据结构(通过enum symbol类实现) 1.保留字(13+4个): 2.运算符及界符(16+ ...

  5. C语言入门练习 - 第二期 判断语句与循环语句(题解)

    比赛地址:C语言入门练习 - 第二期 判断语句与循环语句 A.入门--基础语法(for) #include<stdio.h> int main(){int n,i;scanf(" ...

  6. golang语言学习第三课 条件语句

    if 是一个条件语句.if 语句的语法为: if condition { } 与其他语言不同, 其他语言 if后面有()括号,但是go语言是没有的. if 语句后面可以接可选的 else if 和 e ...

  7. c语言中结束本次循环的语句是什么

    c语言中结束本次循环的语句是"continue".控制语句continue只能作用于循环体中,其作用是结束本次循环,跳到判断循环的位置,即重新开始下一次循环. 在C语言中,控制语句 ...

  8. python选择语句是什么语句_Python语言中的三种选择语句

    本文将详细介绍Python语言中的三种选择语句:if语句,if/else语句和if/elif/else语句.对于每种语句,我们都提供了相应的流程图.与此同时,我们给出许多简单的示例程序,以帮助读者加深 ...

  9. r语言中对向量求条件语句_R中的条件语句

    r语言中对向量求条件语句 To advance with programming, we need to be able to control the flow of the program exec ...

最新文章

  1. Python-函数的各种器
  2. 远程管理MAC OS
  3. 怎样把一个项目加入微服务器,构建微服务:快速搭建Spring Boot项目
  4. php如何获取ajax请求,php-从ajax调用获取json数据
  5. hibernate持久化对象
  6. nfs需要开通什么端口_创业板开通需要什么条件?开通创业板门槛,要怎么样开通创业板?...
  7. ssh重装ubuntu_Ubuntu环境下SSH的安装及使用详解
  8. PHP工程师最佳学习路线!【重磅推出】
  9. 毛子说PostgreSQL 需要实现多主
  10. 浅谈ARP攻击现象和处理办法
  11. QT QPainter
  12. (转)protein 数据库
  13. 通过路由器管理界面刷openwrt
  14. 基于C++实现家谱管理系统
  15. python 换行打印
  16. mysql左连接和右连接_MYSQL 左连接与右连接
  17. 微信app支付服务端开发记录
  18. 【嵌入式】SIM808/SIM900发送短信AT指令0X1A
  19. 计算幻术之路(二):增强现实的现实
  20. 数据挖掘知识点整理(期末复习版)

热门文章

  1. In-memory Computing with SAP HANA读书笔记 - 第七章:Business continuity and resiliency for SAP HANA
  2. Python爬虫验证码识别四
  3. Android Developers:支持不同的屏幕大小
  4. 什么手机杀毒软件最好用?3款很棒的手机用杀毒软件推荐给你
  5. cadworx管道设计基础到精通教程
  6. 读 Herbert George Wells 之 A Short History of The World
  7. VMware 黑苹果开机失败 磁盘修复
  8. QQ空间日志说说类网站织梦模板(带手机端)
  9. IEEE39+比利时20天然气节点+热网6节点的电气热综合能源系统,包含了CHP、EB、燃气轮机等
  10. Docker 搭建容器合集