• 大小: 10.68MB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2023-11-17
  • 语言: C/C++
  • 标签: 编译原理  

资源简介

山东大学计算机专业编译原理实验——构造一个pl0文法语言的编译器,用c++写的。其中语法分析和解释执行部分有点bug,有兴趣的同学可以参考一下。另外本人菜鸟一枚,代码写得比较乱,望各位大佬亲喷!

资源截图

代码片段和文件信息

#include “Iterpreter.h“

#define STACK_SIZE 100

Iterpreter::Iterpreter(const char* filename){

readPl0(filename);//读取pl0文件

ip = 0;
sp = -1;
bp = 0;

lev = 0;
SL.push_back(0);//主程序的静态链是0

stack = new int[STACK_SIZE];
for (int i = 0; i < STACK_SIZE; i++){
stack[i] = 0;
}

run();

}


void Iterpreter::readPl0(const char* filename){

FILE *fp = fopen(filename “rb“);//打开.pl0文件
int i = 0;

if (!fp){
cout << “打开.pl0文件失败!“ << endl;
exit(-1);
}


while (!feof(fp)){
codeSeg.push_back(CODE());//先push一个空的
fread(&codeSeg[i++] sizeof(CODE) 1 fp);
}

}


void Iterpreter::run(){

while (ip < codeSeg.size()){

runInst();
}

cout << “代码翻译并执行完毕!“ << endl;

}


void Iterpreter::runInst(){

inst = codeSeg.at(ip++);//取指
int temp;

switch (inst.fun){

case LIT: //常量放栈顶
stack[++sp] = inst.offset;
break;

case LOD: //变量放栈顶
{
int tempBp = stack[bp + 2];
int levOffset = inst.lev;

while (levOffset-- != 0){//沿着静态链往外层找
tempBp = stack[tempBp + 2];
}

temp = stack[tempBp + inst.offset];
stack[++sp] = temp;
break;
}


case STO: //栈顶内容存到变量中
{
int tempBp = stack[bp + 2];
int levOffset = inst.lev;

while (levOffset-- != 0){//沿着静态链往外层找
tempBp = stack[tempBp + 2];
}

temp = stack[sp];
stack[tempBp + inst.offset] = temp;


break;

}


case CAL:
stack[sp + 1] = bp;//push bp.老bp,即动态链
stack[sp + 2] = ip;//返回地址
stack[sp + 3] = SL[lev - inst.lev];//静态链

lev = lev - inst.lev;


SL.push_back(bp); //保存当前运行的bp.每call一次保存一次
bp = sp + 1;//记录被调用过程的基地址
ip = inst.offset;
break;

case INT:
sp += inst.offset;//栈顶加a
break;

case JMP:
ip = inst.offset;//ip转到a
break;

case JPC:

if (!stack[sp])//栈顶布尔值为非真
ip = inst.offset;//转到a的地址
break;

case OPR://关系和算术运算
{
switch (inst.offset)
{
case OPR::ADD:
temp = stack[sp - 1] + stack[sp];
stack[--sp] = temp;
break;

case OPR::SUB:
temp = stack[sp - 1] - stack[sp];
stack[--sp] = temp;
break;

case OPR::DIV:
temp = stack[sp - 1] / stack[sp];
stack[--sp] = temp;
break;

case OPR::MINUS:
stack[sp] = -stack[sp];
break;

case OPR::MUL:
temp = stack[sp - 1] * stack[sp];
stack[--sp] = temp;
break;

case OPR::EQ:
temp = (stack[sp - 1] - stack[sp] == 0);
stack[--sp] = temp;
break;

case OPR::UE:
temp = (stack[sp - 1] - stack[sp] != 0);
stack[--sp] = temp;
break;

case OPR::GE:
temp = (stack[sp - 1] - stack[sp] >= 0);
stack[--sp] = temp;
break;

case OPR::GT:
temp = (stack[sp - 1] - stack[sp] > 0);
stack[--sp] = temp;
break;

case OPR::LE:
temp = (stack[sp - 1] - stack[sp] <= 0);
stack[--sp] = temp;
break;

case OPR::LT:
temp = (stack[sp - 1] - stack[sp]< 0);
stack[--sp] = temp;
break;

case OPR::ODD: //判断栈顶操作数是否为奇数
stack[sp] = (stack[sp] %

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       4779  2017-12-16 09:58  compile_ex2\compile_ex2\compile_ex2.vcxproj

     文件       1777  2017-12-16 09:58  compile_ex2\compile_ex2\compile_ex2.vcxproj.filters

     文件       5527  2017-12-30 09:58  compile_ex2\compile_ex2\Debug\compile_ex2.log

     文件   14680064  2017-12-30 09:58  compile_ex2\compile_ex2\Debug\compile_ex2.pch

     文件       3452  2017-12-30 09:58  compile_ex2\compile_ex2\Debug\compile_ex2.tlog\cl.command.1.tlog

     文件      26574  2017-12-30 09:58  compile_ex2\compile_ex2\Debug\compile_ex2.tlog\CL.read.1.tlog

     文件       6308  2017-12-30 09:58  compile_ex2\compile_ex2\Debug\compile_ex2.tlog\CL.write.1.tlog

     文件        196  2017-12-30 09:58  compile_ex2\compile_ex2\Debug\compile_ex2.tlog\compile_ex2.lastbuildstate

     文件       2090  2017-12-30 09:58  compile_ex2\compile_ex2\Debug\compile_ex2.tlog\link.command.1.tlog

     文件       3594  2017-12-30 09:58  compile_ex2\compile_ex2\Debug\compile_ex2.tlog\link.read.1.tlog

     文件       1278  2017-12-30 09:58  compile_ex2\compile_ex2\Debug\compile_ex2.tlog\link.write.1.tlog

     文件     531460  2017-12-30 09:58  compile_ex2\compile_ex2\Debug\Iterpreter.obj

     文件     419079  2017-12-30 09:58  compile_ex2\compile_ex2\Debug\stdafx.obj

     文件     905048  2017-12-30 09:58  compile_ex2\compile_ex2\Debug\SyntaxAnal.obj

     文件     437248  2017-12-30 09:58  compile_ex2\compile_ex2\Debug\vc120.idb

     文件     716800  2017-12-30 09:58  compile_ex2\compile_ex2\Debug\vc120.pdb

     文件     560444  2017-12-30 09:58  compile_ex2\compile_ex2\Debug\WordAnal.obj

     文件       4824  2017-12-30 09:22  compile_ex2\compile_ex2\Iterpreter.cpp

     文件        675  2017-12-30 09:24  compile_ex2\compile_ex2\Iterpreter.h

     文件        487  2018-01-01 23:45  compile_ex2\compile_ex2\ReadMe.txt

     文件        435  2017-12-16 16:12  compile_ex2\compile_ex2\stdafx.cpp

     文件       2401  2017-12-30 09:45  compile_ex2\compile_ex2\stdafx.h

     文件      23807  2017-12-30 09:25  compile_ex2\compile_ex2\SyntaxAnal.cpp

     文件       1308  2017-12-30 10:21  compile_ex2\compile_ex2\SyntaxAnal.h

     文件        236  2017-10-08 21:51  compile_ex2\compile_ex2\targetver.h

     文件       5668  2017-12-30 09:19  compile_ex2\compile_ex2\WordAnal.cpp

     文件        615  2017-12-30 10:20  compile_ex2\compile_ex2\WordAnal.h

     文件    9437184  2017-12-30 10:45  compile_ex2\compile_ex2.sdf

     文件        979  2017-10-08 21:51  compile_ex2\compile_ex2.sln

    ..A..H.     52736  2017-12-30 10:45  compile_ex2\compile_ex2.v12.suo

............此处省略15个文件信息

评论

共有 条评论