ccode.cpp

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

CPP
145
字号

#include "CCode.h"
#include "SymSet.h"
#include "PL0Compiler.h"
#include <iostream>
#include <fstream>
using namespace std;

CCode::CCode(PL0Compiler *p)
{
	//lnNum = 0;
	idxOfStringStack=-1;
	pl0Compiler = p;
	IP = 0;
	PC = IP + 1;
}

void CCode::gen(OPCode insCode, int lev, float val)
{
	Instruction temp;
	if(insCode == WRTSTR)
	{
		temp.code = insCode;
		temp.l = 0;
		temp.a = val;
	}
	else
	{
		temp.code = insCode;
		temp.l = lev;
		temp.a = val;
	}
	
	codeStack.push_back(temp);
	//lnNum++;
}

void CCode::list()
{
	cout<<"code stack"<<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 WRTCH:	cout<<i<<'\t'<<"WRTCH";	break;
		case WRTR:	cout<<i<<'\t'<<"WRTR";	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 CCode::stringEnter(string str)
{
	stringStack.push_back(str);
	idxOfStringStack++;
}

void CCode::writeToFile(string outFileName)
{
	ofstream ostream(outFileName.c_str());
	vector<string>::iterator s = stringStack.begin();
	vector<string>::iterator end = stringStack.end();
	for( ; s!=end; s++)
	{
		ostream<<*s<<endl;
	}
	ostream<<"*code as follow*"<<endl;
	CodeStack::iterator iter = codeStack.begin();
	CodeStack::iterator iter_end = codeStack.end();
	for( ; iter!=iter_end; iter++)
	{
		ostream<<iter->code<<'\t'<<iter->l<<'\t'<<iter->a<<'\t';
		switch(iter->code)
		{
			case WRTI:	ostream<<'\t'<<"WRTI";	break;
			case WRTR:	ostream<<'\t'<<"WRTR";	break;
			case WRTCH:	ostream<<'\t'<<"WRTCH";	break;
			case WRTSTR:ostream<<'\t'<<"WRTSTR";break;
			case READI:	ostream<<'\t'<<"READI";	break;
			case READR:	ostream<<'\t'<<"READR";	break;
			case JMP:	ostream<<'\t'<<"JMP";	break;
			case JPC:	ostream<<'\t'<<"JPC";	break;
			case RTN:	ostream<<'\t'<<"RTN";	break;
			case ALOC:	ostream<<'\t'<<"ALOC";	break;
			case CALL:	ostream<<'\t'<<"CALL";	break;
			case STO:	ostream<<'\t'<<"STO";	break;
			case LODI:	ostream<<'\t'<<"LODI";	break;
			case LODR:	ostream<<'\t'<<"LODR";	break;
			case LODCH:	ostream<<'\t'<<"LODCH";	break;
			case LITI:	ostream<<'\t'<<"LITI";	break;
			case LITCH:	ostream<<'\t'<<"LITCH";	break;
			case LITR:	ostream<<'\t'<<"LITR";	break;
			case REV:	ostream<<'\t'<<"REV";	break;
			case ADD:	ostream<<'\t'<<"ADD";	break;
			case MIN:	ostream<<'\t'<<"MIN";	break;
			case TIM:	ostream<<'\t'<<"TIM";	break;
			case DIV:	ostream<<'\t'<<"DIV";	break;
			case DIVI:	ostream<<'\t'<<"DIVI";	break;
			case EQU:	ostream<<'\t'<<"EQU";	break;
			case NEQU:	ostream<<'\t'<<"NEQU";	break;
			case LES:	ostream<<'\t'<<"LES";	break;
			case LESEQ:	ostream<<'\t'<<"LESEQ";	break;
			case GRT:	ostream<<'\t'<<"GRT";	break;
			case GRTEQ:	ostream<<'\t'<<"GRTEQ";	break;
			default:break;
		}
		ostream<<'\t'<<iter->l<<'\t'<<iter->a<<endl;
	}
	ostream.close();
}

⌨️ 快捷键说明

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