有帮助的话,请给一个Star⭐呦
为学习和理解编译原理,通过对PL\0 语言编译器源代码的阅读,讨论,查阅资料,实现了对 PL/0 编译器的分析和扩展,扩展包括:注释、自增自减运算符、复合运算符、 if-else、repeat-until、for、取模、取反、变量名包含下划线、一维数组、错误提示。
-
词法分析
词法分析子程序名为
getsym
,功能是从源程序中读出一一个单词符号(token),把它的信息放入全局变量sym
、id
和num中
,语法分析器需要单词时,直接从这三个变量中获得。 -
语法分析
语法分析使用自上向下的递归子程序法语法分析主要有分程序分析过程
block
,常量定义分析过程constdeclaration
, 变量定义分析过程vardeclaration,语句处理过程statement
,表达式处理过程expression
,项处理过程term
, 因子处理过程factor
,条件处理过程condition
,出错报告过程error
,代码生成过程gen
, 测试代码合法性及错误恢复过程test
,查询名字表函数position
,输出目标代码清单listcode
。 -
目标代码结构和代码生成
PL/0编译程序所产生的目标代码是一种栈式机的语言,此类栈式机没有累加器和通用寄存器,有一个栈式存储器,有四个控制寄存器(指令寄存器 I,指令地址寄存器 P,栈顶寄存器 T 和基址寄存器 B),算术逻辑运算都在栈顶进行。
-
错误处理的原理和技术
首先,错误处理的原则一是尽可能准确指出错误位置和错误属性,二是尽可能进行校正。PL/0编译程序根据这两种原则,对语法错误的处理采用了两种办法:
- 对于丢失标点类的等容易矫正的错误,就指出出错位置,并加以矫正。
- 对于难以矫正的错误,为了使该错误不影响到整个程序后续的编译,把错误尽量的局限在一个局部的语法单位中
- testcase文件夹下放有PL\0语言例程,运行src下的pl0.c按照提示即可完成PL\0程序的编译和执行。