code.cpp

来自「pl0文法编译器」· C++ 代码 · 共 101 行

CPP
101
字号

#include "Code.h"
#include "IntpreSymset.h"
#include "Interpreter.h"
#include <string>
#include <iostream>
#include <fstream>
using namespace std;

Code::Code(Interpreter *p)
{
	idxOfStringStack=-1;
	interpreter = p;
	getCode();
}


void Code::list()
{
	StringStack::iterator iterStr = stringStack.begin();
	StringStack::iterator iterStr_end = stringStack.end();
	if(iterStr==iterStr_end)
		return;
	for( ; iterStr != iterStr_end; iterStr++)
	{
		cout<<*iterStr<<endl;
	}
	
	cout<<"*code stack as fellow*"<<endl;
	CodeStack::iterator iter = codeStack.begin();
	CodeStack::iterator iter_end = codeStack.end();
	int i = 0;
	for( ; iter != iter_end; iter++)
	{
		switch((*iter).code)
		{
		case WRTI:	cout<<i<<'\t'<<"WRT";	break;
		case WRTR:	cout<<i<<'\t'<<"WRTR";	break;
		case WRTCH:	cout<<i<<'\t'<<"WRTCH";	break;
		case WRTSTR:cout<<i<<'\t'<<"WRTSTR";break;
		case READI:	cout<<i<<'\t'<<"READI";	break;
		case READR:	cout<<i<<'\t'<<"READR";	break;
		case JMP:	cout<<i<<'\t'<<"JMP";	break;
		case JPC:	cout<<i<<'\t'<<"JPC";	break;
		case RTN:	cout<<i<<'\t'<<"RTN";	break;
		case ALOC:	cout<<i<<'\t'<<"ALOC";	break;
		case CALL:	cout<<i<<'\t'<<"CALL";	break;
		case STO:	cout<<i<<'\t'<<"STO";	break;
		case LODI:	cout<<i<<'\t'<<"LODI";	break;
		case LODR:	cout<<i<<'\t'<<"LODR";	break;
		case LODCH:	cout<<i<<'\t'<<"LODCH";	break;
		case LITI:	cout<<i<<'\t'<<"LITI";	break;
		case LITCH:	cout<<i<<'\t'<<"LITCH";	break;
		case LITR:	cout<<i<<'\t'<<"LITR";	break;
		case REV:	cout<<i<<'\t'<<"REV";	break;
		case ADD:	cout<<i<<'\t'<<"ADD";	break;
		case MIN:	cout<<i<<'\t'<<"MIN";	break;
		case TIM:	cout<<i<<'\t'<<"TIM";	break;
		case DIV:	cout<<i<<'\t'<<"DIV";	break;
		case DIVI:	cout<<i<<'\t'<<"DIVi";	break;
		case EQU:	cout<<i<<'\t'<<"EQU";	break;
		case NEQU:	cout<<i<<'\t'<<"NEQU";	break;
		case LES:	cout<<i<<'\t'<<"LES";	break;
		case LESEQ:	cout<<i<<'\t'<<"LESEQ";	break;
		case GRT:	cout<<i<<'\t'<<"GRT";	break;
		case GRTEQ:	cout<<i<<'\t'<<"GRTEQ";	break;
		default:break;
		}
		cout<<'\t'<<(*iter).l<<'\t'<<(*iter).a<<endl;
		i++;
	}
}

void Code::getCode()
{
	string temp;
	Instruction ins;
	int val;
	ifstream &instream = interpreter->inStream;
	getline(instream,temp,'\n');
	//if(temp.empty())
	//{
	//	cout<<"the object file is empty"<<endl;
	//	exit(0);
	//}
	while(temp.empty()||temp.at(0)!='*' )
	{
		stringStack.push_back(temp);
		getline(instream,temp,'\n');
	}
	while(!instream.eof())
	{
		instream>>val;
		ins.code = (OPCode)val;
		instream>>ins.l;
		instream>>ins.a;
		codeStack.push_back(ins);
		getline(instream,temp,'\n');
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?