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 + -
显示快捷键?