PL/0简单编译系统(零)

本学期修了《编译原理》这门课。课程大作业是实现一个PL/0编译器。接下来将记录在实现过程中的心得、遇到的问题和解决办法,如有错误之处,欢迎指正。

PL/0语言描述

PL/0型语言是Pascal语言的一个子集。作为一门教学用程序设计语言,它比PASCAL语言简单,并作了一些限制。PL0的程序结构比较完全,相应的选择,不但有常量,变量及过程声明,而且分支和循环结构也是一应俱全。

PL/0文法的EBNF表示如下:

<程序> ::= <分程序>.
<分程序> ::= [<常量说明部分>][变量说明部分>][<过程说明部分>]<语句>
<常量说明部分> ::= const<常量定义>{,<常量定义>};
<常量定义> ::= <标识符>=<无符号整数>
<无符号整数> ::= <数字>{<数字>}
<标识符> ::= <字母>{<字母>|<数字>}
<变量说明部分>::= var<标识符>{,<标识符>};
<过程说明部分> ::= <过程首部><分程序>;{<过程说明部分>}
<过程首部> ::= procedure<标识符>;
<语句> ::= <赋值语句>|<条件语句>|<当型循环语句>|<过程调用语句>|<读语句>|<写语句>|<复合语句>|<重复语句>|<空>
<赋值语句> ::= <标识符>:=<表达式>
<表达式> ::= [+|-]<项>{<加法运算符><项>}
<项> ::= <因子>{<乘法运算符><因子>}
<因子> ::= <标识符>|<无符号整数>|'('<表达式>')‘
<加法运算符> ::= +|-
<乘法运算符> ::= *|/
<条件> ::= <表达式><关系运算符><表达式>|odd<表达式>
<关系运算符> ::= =|<>|<|<=|>|>=
<条件语句> ::= if<条件>then<语句>[else<语句>]
<当型循环语句> ::= while<条件>do<语句>
<过程调用语句> ::= call<标识符>
<复合语句> ::= begin<语句>{;<语句>}end
<重复语句> ::= repeat<语句>{;<语句>}until<条件>
<读语句> ::= read'('<标识符>{,<标识符>}')‘
<写语句> ::= write'('<标识符>{,<标识符>}')‘
<字母> ::= a|b|...|X|Y|Z
<数字> ::= 0|1|2|...|8|9

实现效果

运行界面

项目整个界面分为导航栏,代码区,token表区,符号表区,Pcode区以及控制台。各分区的功能如下:

分区 功能
导航栏 打开,关闭或保存文件;编译和执行代码
代码区 展示并编辑代码
Token表区 展示代码中的token
Symbol表区 展示代码编译过程中生成的symbol表
Pcode表区 展示代码生成的所有Pcode
控制台 输出编译信息

相关代码在shiyi001的PL/0编译器,运行环境为JRE1.8

NEXT ONE: PL/0简单编译系统(一)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,264评论 19 139
  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 12,418评论 0 27
  • 毫无意外 一早起来上厕所 外面真的在下雨 而且还不小 这该肿么办啊 摸摸膝盖还痛 捞起来看 都淤青肿了 但是走路感...
    jenffy阅读 4,162评论 0 0
  • 今年八月我正式步入高中殿堂,脱离了初中时的稚气。我听其他学姐学长们说到高中个个都是非常的痛苦,当然我也没抱多大...
    王若欣阅读 3,658评论 7 3
  • 小时候,和家人闹别扭,似乎话语越恶毒越能显示自己的能耐。长大后,在外边受到的所有不公,似乎都成为攻击对方的借口,并...
    青杏路涂阅读 1,504评论 2 2

友情链接更多精彩内容