资源简介
这次实验是用C语言对pl/0的编译器进行扩展,实现了一下几个功能:
(1)给PL/0语言增加像C语言那样的形式为/ …… /的注释。
(2)给PL/0语言增加带else子句的条件语句和exit语句。
(3)给PL/0语言增加输入输出语句。
(4)给PL/0语言增加带参数的过程。
(5)给PL/0语言增加布尔类型。
(6)给PL/0语言增加数组类型。
(7)给PL/0语言增加函数类型。
(8)给PL/0语言增加实数类型。
(9)分离解释器和编译器为两个独立的程序。
压缩包中还有实验要求以及参考文档等,希望对大家编写pl0编译器有帮助。
代码片段和文件信息
// pl/0 compiler with code generation
#include
#include
#include
#include
#include “pl0.h“
void error(long n){
long i;
printf(“ ****“);
for (i=1; i<=cc-1; i++){
printf(“ “);
}
printf(“^%2d\n“n);
err++;
}
void getch() { //输出源程序
if(cc==ll){
if(feof(infile)){
printf(“************************************\n“);
printf(“ program incomplete\n“);
printf(“************************************\n“);
exit(1);
}
ll=0; cc=0;
printf(“%5d “ cx);
while((!feof(infile))&&((ch=getc(infile))!=‘\n‘)){ //输出一行原代码
printf(“%c“ch);
ll=ll+1; line[ll]=ch;
}
printf(“\n“);
ll=ll+1; line[ll]=‘ ‘;
}
cc=cc+1; ch=line[cc];
}
void getsym(){
long ijk;
int flag=0;
double t=1.0; //标记小数点后的位数
double numt=0z=0; //小数部分的值
while(ch==‘ ‘||ch==‘\t‘){
getch();
}
if(isalpha(ch)){ // identified or reserved 开始进行词法分析
k=0;
do{
if(k a[k]=ch; k=k+1;
}
getch();
}while(isalpha(ch)||isdigit(ch));
if(k>=kk){
kk=k;
}else{
do{
kk=kk-1; a[kk]=‘ ‘;
}while(k }
strcpy(ida); i=0; j=norw-1; //把符号串(如var)放入id中
do{
k=(i+j)/2;
if(strcmp(idword[k])<=0){
j=k-1;
}
if(strcmp(idword[k])>=0){
i=k+1;
}
}while(i<=j); //此循环用于在保留字符表中找到对应的保留字
if(i-1>j){
sym=wsym[k]; // sym返回词法单元的类型 如果i-1》j是保留字
}else{
sym=ident; //否则是定义的标识符
}
}else if(isdigit(ch)){ // number
k=0; num=0;
do{
num=num*10+(ch-‘0‘);
k=k+1; getch();
}while(isdigit(ch));
if(ch==‘.‘){ //遇到小数点说明是实型数据
getch();
if(isdigit(ch)){
while(isdigit(ch)){
t/=10;
num=num+(ch-‘0‘)*t;
k++;
getch();
}
sym=realsym;
}
else if(ch==‘.‘){ //又遇到一个点说明是数组的定义
sym=intersym;
cc=cc-2;
}
else{
error(57);
}
}
else{
sym=intersym;
}
if(k>nmax){
error(31);
}
}else if(ch==‘:‘){
getch();
if(ch==‘=‘){
sym=becomes; getch();
}else{
sym=nul;
}
}else if(ch==‘/‘){ //新增
getch();
if(ch==‘*‘){
flag++;
getch();
while(flag>0){
while(ch!=‘*‘){
getch();
}
getch();
if(ch==‘/‘)
flag--;
}
getch();
getsym();
}
else{
sym=ssym[(unsigned char)‘/‘];
}
}
else if(ch==‘*‘){
getch();
if(ch==‘/‘){
getch();
if(ch==‘*‘){
flag=0;
sym=ssym[(unsigned char)‘*‘];
flag++;
getch();
while(flag>0){
while(ch!=‘*‘){
getch();
}
getch();
if(ch==‘/‘)
flag--;
}
getch();
}
else{
printf(“a superflous note symbol “);
sym=nul;
}
}
else{
sym=ssym[(unsigned char)‘*‘];
}
}
else if(ch==‘<‘){
getch();
if(ch==‘=‘){
sym=leq; getch();
}else if(ch==‘>‘){
sym=neq; getch();
}else{
sym=lss;
}
}else i
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 37694 2011-05-15 16:49 PB08210256\编译器\pl0.c
文件 4636 2011-05-15 09:50 PB08210256\编译器\pl0.h
文件 143432 2011-05-15 15:21 PB08210256\编译器\PL0编译器.exe
文件 6239 2011-05-15 10:45 PB08210256\解释器\interpret.cpp
文件 476 2011-05-15 10:06 PB08210256\解释器\pl0.h
文件 217160 2011-05-15 10:48 PB08210256\解释器\pl0解释器.exe
目录 0 2011-05-15 16:51 PB08210256\编译器
目录 0 2011-05-15 16:51 PB08210256\解释器
目录 0 2011-05-15 16:51 PB08210256
文件 20992 2011-05-09 00:50 测试程序.doc
文件 15360 2011-05-15 16:56 错误记号.doc
文件 169374 2011-04-14 09:59 project参考资料.pdf
文件 23552 2011-04-29 00:26 课程实践 (1).doc
----------- --------- ---------- ----- ----
638915 13
评论
共有 条评论