编译原理Pl/0语言 简单编译器思路

本文介绍了如何构建一个简单的PL/0语言编译器,涉及词法分析和语法分析两个关键步骤。词法分析通过处理输入文件,识别标识符、数字、保留字和标点符号。语法分析则通过递归下降方式处理程序结构,生成中间代码,并进行变量声明、常量处理、过程声明和条件判断语句等操作。
摘要由CSDN通过智能技术生成
词法分析
变量声明:
length 保存一行字符的长度
point 输入一行的指针
构造函数:初始化mySYM,myID,myNUM,length;point指针初始=-1
调用词法分析函数Compile。
Compile:将文件(inputfile)保存到reader(字符 缓冲区BufferReader)。将缓冲区的一行存入Buffer以供操作,将该行长度保存到length中。当Buffer中数据没有处理完时进行循环调用调用GETSYS处理一个字符
GETSYS:
code存储种别码,strToken暂存字符串(可以拼接字母、数字)
调用GetChar()取得一个字符,调用GetBC(去掉空格);

处理完毕后检测ch中的字符
字母:检测到第一个字符为字母表示接下来应该是字母或数字组成的一个标识符。就将所有的后来的字母或数字与第一个字符连接起来。直到遇到一个非字母或数字输入,回退一个字符(因为前面向前查看了)
调用Reserve检查保留字表查看是否是保留字,将该标识符所属类加入到SYM表。

数字:检测到第一个字符为数字的时候检测后续是否都是数字,如果都是数字则将数字连接起来,直到遇到下一个不为数字的字符。将所有的数字连接起来插入到常量表,向SYM表加入一个INT表示一个常量。

是其他的标点符号:对不同的标点符号作相应的处理,把相应的符号加入到SYM。

GetChar:根据point指向位置从Buffer中取一个字符,当point指针小于length-1(Buffer从0开始,最后一个字符是length-1),指针后移。将point指向的Buffer中的字符保存到ch中,输出字符和其位置。如果此时point指向length-1,则表明该行将处理结束,isEnd=true。或者point指针>=length-1
也代表该行处理 结束,isEnd=true。
GetBC:如果当前ch中是换行则表明此行处理结束,isEnd=true;如果ch中是空格或制表符时再调用GetChar取得一个字符,直到ch中不再是制表符或空格。
在《算法+数据结构=程序》一书中,Niklaus Wirth 设计的 PL/0 语言编译器分成两部分,把源语言翻译成中间语言编译器和中间语言解释器,编译器用的是递归下降的预测分析方法中间语言是一种栈机器代码,其指令集是根据 PL/0 语言的需要来设计的。编译器源码及测试程序可从。一条指令由三个域组成: (1)操作码 f:上面已经列出了所有 8 种操作码。 (2)层次差 l:这里的层次差就是 5.3.2 节介绍嵌套深度时的 n p − n a 。该域仅用于存取指令和调用指令。 (3)多用途 a:在运算指令中,a 的值用来区分不同的运算;在其他情况,a 或是一个数(lit,int),或是一个程序地址(jmp,jpc,cal),或是一个数据地址(lod,sto)。 编译器PL/0 源程序进行一遍扫描,并逐行输出源程序。在源程序无错的情况下,编译器每编译完一个分程序,就列出该分程序的代码,这由编译器的 listcode 过程完成。每个分程序的第一条指令是 jmp 指令,其作用是绕过该分程序声明部分产生的代码(即绕过内嵌过程的代码)。listcode 过程没有列出这条代码。 解释器是编译器中的一个过程,若源程序无错,则编译结束时调用解释过程 interpret。由于 PL/0 语言没有输出语句,解释器按执行次序,每遇到对变量赋值时就输出该值。 由于 PL/0 语言是过程嵌套语言,因此程序运行时,活动记录栈中每个活动记录需要包含控制链和访问。活动记录栈的栈顶以外的存储空间作为代码执行过程中所需要的计算栈,无需另外设立计算栈。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值