资源简介
山东大学计算机专业编译原理实验——构造一个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\li
文件 3594 2017-12-30 09:58 compile_ex2\compile_ex2\Debug\compile_ex2.tlog\li
文件 1278 2017-12-30 09:58 compile_ex2\compile_ex2\Debug\compile_ex2.tlog\li
文件 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个文件信息
- 上一篇:C++图像伪彩色处理源代码
- 下一篇:华中科技大学-C++实验 共6次-源代码+报告
相关资源
- 简单函数绘图语言的解释器
- Lex和Yacc从入门到精通.pdf
- 简易词法分析器——基于C语言
- LL(1)文法的实现-mfc-编译原理学习
- 词法分析代码内有报告
- 编译原理LL1文法的mfc实现含消除左递
- 编译原理词法分析实验
- pl/0语言的编译器
- C++实现编译原理自动机、LL1文法、及
- 编译原理语义分析程序 c++实现
- 编译原理 课程设计 DAG 报告+源码C++版
- 编译原理课程设计----语法分析器(
- 编译原理简单的编译器源码
- C语言实现一个编译器-编译原理南开大
- 编译原理课程实验报告词法分析器及
- 编译原理与技术李文生:LR分析法C+
- C语言简化编译器前端 编译原理 LR1
- C-Minus编译器 编译原理实验
- LL1文法
- 现代编译原理C语言描述-高清-完整目
- TINY扩充语言的语法分析(实现 while、
- 编译原理课程设计词法语法分析器
- 编译原理课程设计整个项目和报告
- 编译原理LL1语法分析器C++版源代码
- 编译原理之算符优先算法-迭代法
- 编译原理词法分析器实验报告含源代
- 编译原理词法分析器C++版源代码
- 现代编译原理-c语言描述虎书
- 合工大编译原理实验报告
- LL1文法消除左递归编译原理mfc实现完
评论
共有 条评论