⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 daimashengcheng.cpp

📁 编译原理课程设计,语法分析.学校的课程设计,好象还有点用吧
💻 CPP
字号:
#include "Share.h"
#include<fstream>
#include <string>
#include <vector>
#include<iostream>
using namespace std;

struct tricode
{
	char tri[100];
	int len;
};
vector<int> para;
vector<tricode> code;
ifstream in;
ofstream out;
int k=0;
bool arrayPara=0;
extern Symbol_table table;

void asmCode()
{
	in.open("Code.txt");
	out.open("Code.asm",ios::app);
	out<<"data\tsegment"<<endl;
	int space=table.vSymbol_table[table.vSymbol_table.size()-1].iAddress+8;
	out<<"lab\tdb\t"<<space<<" dup(?)"<<endl;
	out<<"len\tdb\t40"<<endl;
	out<<"act\tdb\t?"<<endl;
	out<<"num\tdb\t40 dup(?)"<<endl;
	out<<"space\tdb\t0ah,0dh,'$'"<<endl;
	out<<"data\tends"<<endl;
	out<<"code\tsegment"<<endl;
	out<<"main\tproc\tfar"<<endl;
	out<<"\t\tassume\tcs:code,ds:data"<<endl;
	out<<"start:"<<endl;
	out<<"mov\tax,data"<<endl;
	out<<"mov\tds,ax"<<endl;
	out<<"mov\tbx,0"<<endl;
	getCodeAndTranslate();
	in.close();
	out.close();
}

void getCodeAndTranslate()
{
	tricode l;
	string e;
	int j=0;
	char temp[100]={0};
	while (!in.eof())
	{	
		in.getline(temp,100,'\n');
		strcpy(l.tri,temp);
		l.len=strlen(temp);
		code.push_back(l);
		//cout<<code[j].tri<<endl<<' '<<code[j].len<<endl;
		if (code[j].len==0)
			code.pop_back();
		j++;
	}
    while (strstr(code[k].tri,"proc")!=0)
	{
		//cout<<code[k].tri<<endl<<' '<<code[k].len<<endl;
		while (code[k].tri[0]!='e')
			k++;
		if (strstr(code[k].tri,"proc")==0)
			break;
		k++;
	}
	if (k==0)
		k=-1;
	for(int i=k+1;i<code.size();i++)
		translateCode(i,code[i].tri);
	out<<"l"<<code.size()<<":"<<endl;
	out<<"mov\tax,4c00h"<<endl;
	out<<"int 21h"<<endl;
	out<<"main\tendp"<<endl;
	out<<"in_put\tproc\tnear"<<endl
	   <<"push\tbx"<<endl
       <<"line:"<<endl
	   <<"lea\tdx,len"<<endl    
 	   <<"mov\tah,0ah"<<endl
 	   <<"int\t21h"<<endl
 	   <<"lea\tdx,space"<<endl  
 	   <<"mov\tah,09h"<<endl
 	   <<"int\t21h"<<endl
 	   <<"mov\tcl,act"<<endl   
 	   <<"mov\tch,0"<<endl       
 	   <<"lea\tbx,num"<<endl
	   <<"mov\tdx,0"<<endl  
   	   <<"push\tsi"<<endl            
   	   <<"mov\tsi,0"<<endl        
       <<"loop0:"<<endl   
 	   <<"mov\tal,[bx]"<<endl        
	   <<"cmp\tal,30h"<<endl
	   <<"mov\tah,0"<<endl
       <<"jl\terror"<<endl
 	   <<"cmp\tal,3ah"<<endl
       <<"jnl\terror"<<endl
 	   <<"sub\tal,30h"<<endl       
 	   <<"push\tax"<<endl           
 	   <<"inc\tsi"<<endl
 	   <<"inc\tbx"<<endl
       <<"loop\tloop0"<<endl                                                  
 	   <<"cmp\tbx,di"<<endl         
       <<"je\terror"<<endl
 	   <<"pop\tax"<<endl             
 	   <<"mov\tdi,ax"<<endl
 	   <<"dec\tsi"<<endl
 	   <<"cmp\tsi,0"<<endl           
       <<"je\tput_in"<<endl              
	   <<"pop\tax"<<endl           
 	   <<"mov\tdl,10"<<endl
	   <<"mul\tdl"<<endl
 	   <<"add\tdi,ax"<<endl         
 	   <<"dec\tsi"<<endl
	   <<"cmp\tsi,0"<<endl       
       <<"je\tput_in"<<endl               
 	   <<"pop\tax"<<endl            
 	   <<"mov\tdl,100"<<endl
 	   <<"mul\tdl"<<endl
 	   <<"add\tdi,ax"<<endl        
 	   <<"dec\tsi"<<endl
 	   <<"cmp\tsi,0"<<endl          
       <<"jne\terror"<<endl               
 	   <<"cmp\tdi,255"<<endl         
       <<"ja\terror"<<endl
       <<"put_in:"<<endl                  
 	   <<"pop\tsi"<<endl
	   <<"pop\tbx"<<endl
 	   <<"mov\tword ptr lab[bx+si],di"<<endl                  
       <<"jmp\tgo"<<endl
       <<"error:"<<endl
       <<"mov\tcx,si"<<endl        
       <<"loopn1:"<<endl
       <<"pop\tax"<<endl
       <<"loop\tloopn1"<<endl  
       <<"jmp\tline"<<endl
       <<"go:"<<endl
 	   <<"ret"<<endl
       <<"in_put\tendp"<<endl;
	out<<"out_put\tproc\tnear"<<endl 	           
	   <<"mov\tdl,100"<<endl
 	   <<"mov\tah,0"<<endl
	   <<"mov\tal,byte ptr lab[bx+si]"<<endl
 	   <<"div\tdl"<<endl
	   <<"mov\tsi,0"<<endl
 	   <<"cmp\tal,0"<<endl           
       <<"jnz\tgo_bai"<<endl
 	   <<"mov\tsi,1"<<endl         
       <<"shi:"<<endl
 	   <<"mov\tal,ah"<<endl          
 	   <<"mov\tah,0"<<endl
 	   <<"mov\tdl,10"<<endl
 	   <<"div\tdl"<<endl
	   <<"cmp\tal,0"<<endl         
       <<"jnz\tgo_shi"<<endl 
 	   <<"cmp\tsi,1"<<endl          
       <<"jne\tgo_shi"<<endl
       <<"g_e:"<<endl
 	   <<"add\tah,30h"<<endl       
 	   <<"mov\tdl,ah"<<endl
 	   <<"mov\tah,02h"<<endl
 	   <<"int\t21h"<<endl
	   <<"mov\tdl,20h"<<endl
 	   <<"mov\tah,02h"<<endl
 	   <<"int\t21h"<<endl
 	   <<"inc\tbx"<<endl
       <<"jmp\tend_o"<<endl                 
       <<"go_shi:"<<endl                   
 	   <<"push\tax"<<endl    
 	   <<"add\tal,30h"<<endl
 	   <<"mov\tdl,al"<<endl
	   <<"mov\tah,02h"<<endl
 	   <<"int\t21h"<<endl
	   <<"pop\tax"<<endl
       <<"jmp\tg_e"<<endl                  
       <<"go_bai:"<<endl                  
 	   <<"push\tax"<<endl
 	   <<"add\tal,30h"<<endl
	   <<"mov\tdl,al"<<endl
 	   <<"mov\tah,02h"<<endl
 	   <<"int\t21h"<<endl
 	   <<"pop\tax"<<endl
       <<"jmp\tshi"<<endl                  
       <<"end_o:"<<endl
 	   <<"ret"<<endl
       <<"out_put\tendp"<<endl;  
	if (k!=-1)
	{
		for (int p=0;p<=k;p++)
			translateCode(p,code[p].tri);
	}
	out<<"code\tends"<<endl;
	out<<"\tend\tstart"<<endl;
}

void translateCode(int k,string t)
{
    out<<"l"<<k<<":"<<endl;
	string token;
	switch (t[0])
	{
		case 'i':
			dealIf(code[k].tri);
			break;
		case 'g':
			dealGoto(code[k].tri);
			break;
		case 'p':
			if (strstr(t.c_str(),"proc")!=0)
			{
				token=strtok((char*)t.c_str()," ");
				token=strtok(NULL," ");
				out<<table.vSymbol_table[atoi(token.c_str())].cVarname<<"\tproc\tnear"<<endl;
			}
			else
			{
				token=strtok((char*)t.c_str()," ");
				token=strtok(NULL," ");
				if (strstr(token.c_str(),"[")!=0)
				{
					char* to=strtok((char*)token.c_str(),"[]");
					int st=table.vSymbol_table[atoi(to)].iAddress;
					to=strtok(NULL,"[]");
					out<<"mov\tbx,word ptr\tlab["<<table.vSymbol_table[atoi(to)].iAddress<<"]"<<endl;
					out<<"sal\tbx,1"<<endl;
					out<<"mov\tsi,"<<st<<endl;
					arrayPara=1;
				}
				else
				{
					int par=table.vSymbol_table[atoi(token.c_str())].iAddress;
					para.push_back(par);
				}
			}
			break;
		case 'e':
			token=strtok((char*)t.c_str()," ");
			token=strtok(NULL," ");
			out<<"ret"<<endl;
			out<<table.vSymbol_table[atoi(token.c_str())].cVarname<<"\tendp"<<endl;
			break;
		case 'c':
			token=strtok((char*)t.c_str()," ");
			token=strtok(NULL," ");
			if (strcmp(token.c_str(),"read\r")==0)
				readNum();	
			else if (strcmp(token.c_str(),"write\r")==0)
				writeNum();
			else
			{
				for (int q=table.vSymbol_table[atoi(token.c_str())].vParam.size()-1;q>=0;q--)
				{
					int b=para[para.size()-1];
					para.pop_back();
					out<<"mov\tax,word ptr lab["<<b<<"]"<<endl;
					out<<"mov\tword ptr lab["<<table.vSymbol_table[table.vSymbol_table[atoi(token.c_str())].vParam[q]].iAddress<<"],ax"<<endl;
				}
				out<<"call\t"<<table.vSymbol_table[atoi(token.c_str())].cVarname<<endl;
			}
			break;
		default:
			if (strstr(t.c_str(),"[")!=0)
				dealArray(code[k].tri);
			else
				dealVar(code[k].tri);
			break;	
	}
}

void dealIf(string s)
{
	string token=strtok((char*)s.c_str()," ");
	token=strtok(NULL," ");	
	out<<"mov\tbx,"<<table.vSymbol_table[atoi(token.c_str())].iAddress<<endl;
	out<<"mov\tax,word ptr\tlab[bx]"<<endl;
	token=strtok(NULL," ");
	string op;
	switch(token[0])
	{
		case 'L':
			op="jle";
			break;
		case 'G':
			op="jge";
			break;
		case 'E':
			op="je";
			break;
		case 'X':
			op="jne";
			break;
		case '<':
			op="jl";
			break;
		default:
			op="jg";
			break;
	}
	token=strtok(NULL," ");
	if (strstr(token.c_str(),".")!=0)
		out<<"mov\tdx,"<<atoi(token.c_str())<<endl;
	else 
	{
		out<<"mov\tbx,"<<table.vSymbol_table[atoi(token.c_str())].iAddress<<endl;
		out<<"mov\tdx,word ptr\tlab[bx]"<<endl;
	}
	token=strtok(NULL," ");
	token=strtok(NULL," ");
	out<<"cmp\tax,dx"<<endl;
    out<<op<<"\tl"<<atoi(token.c_str())<<endl;
}

void dealGoto(string s)
{
	string token=strtok((char*)s.c_str()," ");
	token=strtok(NULL," ");	
	out<<"jmp\tl"<<atoi(token.c_str())<<endl;
}

void dealArray(string s)
{
	string token=strtok((char*)s.c_str(),"[]");
	string stoken=token;
	token=strtok(NULL,"[]");
	string ttoken=token;
	token=strtok(NULL," ");
	token=strtok(NULL," ");
	if (strstr(token.c_str(),".")!=0)
		out<<"mov\tax,"<<atoi(token.c_str())<<endl;
	else
	{
		out<<"mov\tbx,"<<table.vSymbol_table[atoi(token.c_str())].iAddress<<endl;
		out<<"mov\tax,word ptr\tlab[bx]"<<endl;
	}
	out<<"mov\tbx,word ptr\tlab["<<table.vSymbol_table[atoi(ttoken.c_str())].iAddress<<"]"<<endl;
	out<<"sal\tbx,1"<<endl;
	out<<"mov\tword ptr\tlab["<<table.vSymbol_table[atoi(stoken.c_str())].iAddress<<"+bx],ax"<<endl;
}

void dealVar(string s)
{
	char* token=strtok((char*)s.c_str()," ");
	string dtoken=token;
	token=strtok(NULL," ");
	token=strtok(NULL," ");
	string op;
	if (token[0]=='!')
		op="not";
	else if (token[0]=='-')
		op="neg";
	else if (strstr(token,".")!=0)
		out<<"mov\tax,"<<atoi(token)<<endl;
	else
	{
		//cout<<table.vSymbol_table[atoi(token)].iAddress<<endl;
		out<<"mov\tbx,"<<table.vSymbol_table[atoi(token)].iAddress<<endl;
		out<<"mov\tax,word ptr\tlab[bx]"<<endl;
	}
	token=strtok(NULL," ");
	if (token==NULL)
	{
		out<<"mov\tword ptr\tlab+"<<table.vSymbol_table[atoi(dtoken.c_str())].iAddress<<",ax"<<endl;
		return;
	}
	else if (token[0]=='+')
		op="add";
	else if (token[0]=='-')
		op="sub";
	else if (token[0]=='*')
		op="mul";
	else if (token[0]=='/'||token[0]=='g')
		op="div";		
	else if (token[0]=='m')
		op="div";
	else if (token[0]=='&')
		op="and";
	else if (token[0]=='|')
		op="or";
	else if (strstr(token,".")!=0)
		out<<"mov\tax,"<<atoi(token)<<endl;
	else
	{
		out<<"mov\tbx,"<<table.vSymbol_table[atoi(token)].iAddress<<endl;
		out<<"mov\tax,word ptr\tlab[bx]"<<endl;
	}
	char* otoken=token;
	token=strtok(NULL," ");
	if (token==NULL)
	{
		out<<op<<"\tax"<<endl;
		out<<"mov\tword ptr\tlab+"<<table.vSymbol_table[atoi(dtoken.c_str())].iAddress<<",ax"<<endl;
		return;
	}
	else if (strstr(token,".")!=0)
		out<<"mov\tcx,"<<atoi(token)<<endl;
	else
	{
		out<<"mov\tbx,"<<table.vSymbol_table[atoi(token)].iAddress<<endl;
		out<<"mov\tcx,word ptr\tlab[bx]"<<endl;
	}
	if (otoken[0]=='+'||otoken[0]=='-'||otoken[0]=='&'||otoken[0]=='|')
	{
		out<<op<<"\tax,cx"<<endl;
		out<<"mov\tword ptr\tlab+"<<table.vSymbol_table[atoi(dtoken.c_str())].iAddress<<",ax"<<endl;
	}
	else if (otoken[0]=='*')
	{
		out<<"mul\tcx"<<endl;
		out<<"mov\tword ptr\tlab+"<<table.vSymbol_table[atoi(dtoken.c_str())].iAddress<<",ax"<<endl;
	}
	else if (otoken[0]=='/'||otoken[0]=='g')
	{
		out<<"mov\tdx,0"<<endl;
		out<<"div\tcx"<<endl;
		out<<"mov\tword ptr\tlab+"<<table.vSymbol_table[atoi(dtoken.c_str())].iAddress<<",ax"<<endl;
	}
	else if (otoken[0]=='m')
	{
		out<<"mov\tdx,0"<<endl;
		out<<"div\tcx"<<endl;
		out<<"mov\tword ptr\tlab+"<<table.vSymbol_table[atoi(dtoken.c_str())].iAddress<<",dx"<<endl;
	}
}
void readNum()
{
	if (!arrayPara)
	{
		int b=para[para.size()-1];
		para.pop_back();
		out<<"mov\tbx,"<<b<<endl;
		out<<"mov\tsi,0"<<endl;
	}
	out<<"call\tin_put"<<endl;
}
void writeNum()
{
	if (!arrayPara)
	{
		int b=para[para.size()-1];
		para.pop_back();
		out<<"mov\tbx,"<<b<<endl;
		out<<"mov\tsi,0"<<endl;
	}
	out<<"call\tout_put"<<endl;
}

⌨️ 快捷键说明

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