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

📄 compiler.cpp

📁 一个用VC++开发的Pascal编译器. 包括词法分析 语法分析 语义分析 中间代码生成 对学习编译原理的同学有很大用途
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Compiler.cpp: implementation of the CCompiler class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "mini_Pascal.h"
#include "Mini_PascalDoc.h"
#include "Compiler.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CCompiler::CCompiler()
{
	CurType = INTEGER;
	Nonlicetwordnum = 0;
	NXQ = 1;
	m_bool.FC = -1;
	m_bool.TC = -1;
	IDAssginPosition = -1;
	IDAssgin = "";
	m_error = 0 ;
	m_sSourceStr = "" ;
	m_DualityModel.LineNo = 0 ;
	m_DualityModel.TokenString = "";
	m_DualityModel.TokenType = -1;
	m_eErrorTable.clear();
	tempnum = 0;
	CurStep = -1;
	CurLine = 1;
	m_QuadRuple.OP		= 0;
	m_QuadRuple.arg1	= 0;
	m_QuadRuple.arg2	= 0;
	m_QuadRuple.result	= 0;
	m_fourModel.push_back(m_QuadRuple);
}

CCompiler::~CCompiler()
{

}

void CCompiler::SetSourceStr(CString str)
{
	m_sSourceStr = str;
	m_sSourceStr += '#';
}

int CCompiler::LookUp(CString str)
{
	int flag = -1 ;
	for ( int i = 0 ; i < 11 ; i ++ )
	{
		if ( str.CompareNoCase( my_KeyWords [ i ].KeyWord ) ==0 ) 
		{
			flag = i ;
			break;
		}
	}
	return flag;
}

void CCompiler::CiFa()
{
	int length = m_sSourceStr.GetLength();
	int pointnum=0;//小数点数目
	int Line = 1 ;
	Initiate_Keywords_Table();
	char ch ;
	int c,j = 0 ,i = 0;
	while( j < length )
	{ 
		CString TOKEN('\0',20);
		ch = m_sSourceStr[ j++ ];
		if (isalpha( ch ))
		{
			TOKEN.SetAt( 0 , ch );
			ch = m_sSourceStr[ j++ ] ; 
			i = 1;
			while ( isalpha( ch )||isdigit( ch ))
			{
				TOKEN.SetAt( i , ch );
				i ++;
				ch = m_sSourceStr[ j++ ];
			}
			j --;
			c = LookUp(TOKEN);
			if ( c != -1 ) 
			{//识别到保留字
				m_DualityModel.LineNo = Line;
				m_DualityModel.TokenString = "";
				m_DualityModel.TokenType = c;
				m_dModel.push_back(m_DualityModel);
			}
			else
			{
				//识别到标识符
				m_DualityModel.LineNo = Line;
				m_DualityModel.TokenString = TOKEN;
				m_DualityModel.TokenType = ID;
				m_dModel.push_back(m_DualityModel);
			}
		}
		else if (isdigit( ch )||ch=='.')
		{
			TOKEN.SetAt( i , ch );
			if (ch=='.')	pointnum++;//识别的是实数
			CString num = "";
			num+=ch;
			ch = m_sSourceStr[ j++ ] ; 
			i = 1 ;
			while ( isdigit ( ch )||ch=='.' )
			{
				if( ch=='.')pointnum++;
				TOKEN.SetAt( i , ch ) ;
				num+=ch;
				i ++ ;
				ch = m_sSourceStr[ j++ ];
			}
			j --;
			//识别到数字
			m_DualityModel.LineNo = Line;
			m_DualityModel.TokenString = num;
			if(pointnum == 0) m_DualityModel.TokenType = INTNUM;
			if(pointnum == 1) m_DualityModel.TokenType = REALNUM;
			
			if(pointnum > 1) {
				Nonlicetwords.push_back(num);
				Nonlicetwordnum ++;
				Error(Nonlicetwordnum - 1, Nonlicetword, Line);
			}
			else m_dModel.push_back(m_DualityModel);
			pointnum = 0;
		}
		else 
		switch( ch )
		{
			case '<': 
				ch = m_sSourceStr[ j++ ];
				if ( ch == '=')
				{
					//识别到<=
					m_DualityModel.LineNo = Line;
					m_DualityModel.TokenString = "";
					m_DualityModel.TokenType = LE ;
					m_dModel.push_back(m_DualityModel);
				}
				else if (ch == '>' )
				{
					//识别到<>
					m_DualityModel.LineNo = Line;
					m_DualityModel.TokenString = "";
					m_DualityModel.TokenType = NE ;
					m_dModel.push_back(m_DualityModel);
				}
				else 
				{
					j -- ;
					//识别到<
					m_DualityModel.LineNo = Line;
					m_DualityModel.TokenString = "";
					m_DualityModel.TokenType = LT ;
					m_dModel.push_back(m_DualityModel);
				}
				break ; 
			case '=':
				////识别到=
				m_DualityModel.LineNo = Line;
				m_DualityModel.TokenString = "";
				m_DualityModel.TokenType = EQ ;
				m_dModel.push_back(m_DualityModel);
				break ; 
			case ':' :
				ch = m_sSourceStr[ j++ ];
				if(ch!='=')
				{
					//识别到:
					m_DualityModel.LineNo = Line;
					m_DualityModel.TokenString = "";
					m_DualityModel.TokenType = COLON ;
					m_dModel.push_back(m_DualityModel);
					j--;//回退一个字符
				}
				else
				{
					//识别到:=赋值语句
					m_DualityModel.LineNo = Line;
					m_DualityModel.TokenString = "";
					m_DualityModel.TokenType = ASSIGN ;
					m_dModel.push_back(m_DualityModel);
				}
			break;
			case ' ' ://空格
				break;
			case '#' ://结束符
				break;
			case '>':
				ch = m_sSourceStr[ j++ ];
				if ( ch == '=' )
				{
					//识别到>=
					m_DualityModel.LineNo = Line;
					m_DualityModel.TokenString = "";
					m_DualityModel.TokenType = GE ;
					m_dModel.push_back(m_DualityModel);
				}
				else
				{
					j --;
					//识别到>
					m_DualityModel.LineNo = Line;
					m_DualityModel.TokenString = "";
					m_DualityModel.TokenType = GT ;
					m_dModel.push_back(m_DualityModel);
				}
				break;
			case 13:
				Line ++ ;
				break;
			case 10:
				break;
			case 9:
				break;
			case ';':
				//识别到;
				m_DualityModel.LineNo = Line;
				m_DualityModel.TokenString = "";
				m_DualityModel.TokenType = SEMI ;
				m_dModel.push_back(m_DualityModel);
				break;
			case '+':
				//识别到+
				m_DualityModel.LineNo = Line;
				m_DualityModel.TokenString = "";
				m_DualityModel.TokenType = PLUS ;
				m_dModel.push_back(m_DualityModel);
			break;
			case '-':
				m_DualityModel.LineNo = Line;
				m_DualityModel.TokenString = "";
				m_DualityModel.TokenType = SUB ;
				m_dModel.push_back(m_DualityModel);
				//识别到-
			break;
			case '*':
				m_DualityModel.LineNo = Line;
				m_DualityModel.TokenString = "";
				m_DualityModel.TokenType = TIMES ;
				m_dModel.push_back(m_DualityModel);
				//识别到*
			break;
			case ',':
				//识别到,
				m_DualityModel.LineNo = Line;
				m_DualityModel.TokenString = "";
				m_DualityModel.TokenType = COMMA ;
				m_dModel.push_back(m_DualityModel);
				break;
			case '(':
				//识别到(
				m_DualityModel.LineNo = Line;
				m_DualityModel.TokenString = "";
				m_DualityModel.TokenType = LPAREN ;
				m_dModel.push_back(m_DualityModel);
				break;
			case ')':
				//识别到)
				m_DualityModel.LineNo = Line;
				m_DualityModel.TokenString = "";
				m_DualityModel.TokenType = RPAREN ;
				m_dModel.push_back(m_DualityModel);
				break;
			case '!':
				//识别到!
				m_DualityModel.LineNo = Line;
				m_DualityModel.TokenString = "";
				m_DualityModel.TokenType = NOT ;
				m_dModel.push_back(m_DualityModel);
				break;
			case '&':
				//识别到&
				m_DualityModel.LineNo = Line;
				m_DualityModel.TokenString = "";
				m_DualityModel.TokenType = AND ;
				m_dModel.push_back(m_DualityModel);
				break;
			case '|':
				//识别到|
				m_DualityModel.LineNo = Line;
				m_DualityModel.TokenString = "";
				m_DualityModel.TokenType = OR ;
				m_dModel.push_back(m_DualityModel);
				break;
			case '{':
				//识别到{
				m_DualityModel.LineNo = Line;
				m_DualityModel.TokenString = "";
				m_DualityModel.TokenType = LCUT ;
				m_dModel.push_back(m_DualityModel);
				break;
			case '}':
				//识别到}
				m_DualityModel.LineNo = Line;
				m_DualityModel.TokenString = "";
				m_DualityModel.TokenType = RCUT ;
				m_dModel.push_back(m_DualityModel);
				break;
			default :
				Error(j, Nonlicetchar, Line);
				//出现非法字符
			break ; 
		}//switch
	}
}

void CCompiler::Initiate_Keywords_Table()
{
	my_KeyWords [ 0 ].KeyWord = "program"; 
	my_KeyWords [ 1 ].KeyWord = "begin";
	my_KeyWords [ 2 ].KeyWord = "end";
	my_KeyWords [ 3 ].KeyWord = "var";
	my_KeyWords [ 4 ].KeyWord = "if";
	my_KeyWords [ 5 ].KeyWord = "then";
	my_KeyWords [ 6 ].KeyWord = "else";
	my_KeyWords [ 7 ].KeyWord = "while";
	my_KeyWords [ 8 ].KeyWord = "do";
	my_KeyWords [ 9 ].KeyWord = "integer";
	my_KeyWords [ 10 ].KeyWord = "real";
}



void CCompiler::Error(int position, int errortype, int line)
{
	if(errortype<=2) m_error = 1;	//词法错误
	else m_error = 2;				//语法错误
	error.Position = position;
	error.ErrorType = errortype;
	error.OccurLine = line;
	m_eErrorTable.push_back(error);	
}

void CCompiler::YuFa()
{
	Advance();
	MPROGRAM();
	//若词法分析无误,进行语法分析
}

void CCompiler::MPROGRAM()
{
	int TokenType = m_dModel[ CurStep ].TokenType;
	Match(PROGRAM);//匹配program
	Advance();
	Match(COLON);
	Advance();
	Match(LPAREN);
	Advance();
	Match(ID);
	Advance();
	Match(RPAREN);
	Advance();
	VARS();	
	Match(BEGIN);
	Advance();
	STL();
	Match(END);
	if(CurStep < m_dModel.size()-1){//end后仍有单词
		Error(CurStep, ExtraWordAfterEnd, CurLine);
	}
	return;
}

void CCompiler::VARS()
{
	Match(VAR);
	Advance();
	VARST();		
}

void CCompiler::VARST()
{
	if(Is(ID)) {
		m_Variable.push_back(CurToken);
		Advance();
		while(Is(COMMA)){//匹配逗号
			Advance();
			if(Is(ID)) {
				m_Variable.push_back(CurToken);
				Advance();
			}
			else{
				if(Is(INTEGER)||Is(REAL)){
					Error(CurStep, COLONMiss, CurLine);
				}
				else{
					Error(CurStep, IDExcept, CurLine);
				}
			}
		}
		Match(COLON);//匹配冒号
		Advance();
		TYPE();
		Match(SEMI);//匹配分号
		Advance();
		return;
	}
//	else
}

void CCompiler::TYPE()
{
	if(Is(INTEGER)){
		FillSymbolRecord(INTEGER);
		CurType = INTEGER;
		Advance();
		return;
	}
	if(Is(REAL)){
		FillSymbolRecord(REAL);
		CurType = REAL;
		Advance();
		return;
	}
	//出错未匹配类型
	Error(CurStep, LeadTypeExcept, CurLine);
}

Statement CCompiler::STL()
{
	Statement STL;
	Statement m_S;
	STL.Chain = 0;
	while(Is(IF)||Is(WHILE)||Is(ID)){//是语句的开始
		m_S = S();
		int p = m_S.Chain;
		if( Is(SEMI) ){//匹配;说明是语句序列
			Advance();
			if(Is(ELSE)){
				Error(CurStep, ExtraSEMI, CurStep);//多了分号
			}
			else{
				BackPatch(m_S.Chain, NXQ);
				int p1 = m_S.Chain;
				int a ;
				a = 0;
				STL.Chain = NXQ;
			}
		}
		else{
			if(Is(IF)||Is(WHILE)||Is(LCUT)||Is(ID)){
				Error(CurStep, SEMIMiss, CurStep);//少了分号
			}

		}
	}
	int pi = STL.Chain;
	return STL;
}

void CCompiler::Advance()
{
	CurStep++ ;
}

BOOL CCompiler::Match(int type)
{
	CurLine = m_dModel[ CurStep ].LineNo;
	if(m_dModel[ CurStep ].TokenType == type){
		CurToken = m_dModel[ CurStep ].TokenString;
		return TRUE;
	}
	switch(type){
	case PROGRAM:
		Error(CurStep, ProgramExpect, CurLine);
		Backward();
		break;
	case BEGIN:
		Error(CurStep, BeginExpect, CurLine);
		Backward();
		break;
	case END:
		Error(CurStep, EndExpect, CurLine);
		Backward();
		break;
	case VAR:
		Error(CurStep, VarExcept, CurLine);
		Backward();
		break;
	case INTEGER:
		Error(CurStep, LeadTypeExcept, CurLine);
		Backward();
		break;
	case REAL:
		Error(CurStep, LeadTypeExcept, CurLine);
		Backward();
		break;
	case ID:
		Error(CurStep, IDExcept, CurLine);
		Backward();
		break;
	case COMMA:
		Error(CurStep, COMMAExcept, CurLine);
		Backward();
		break;
	case SEMI:
		Error(CurStep, SEMIExcept, CurLine);
		Backward();
		break;
	case COLON:
		Error(CurStep, COLONExcept, CurLine);
		Backward();
		break;
	case ASSIGN:
		Error(CurStep, ASSIGNExcept, CurLine);
		Backward();
		break;
	case RPAREN:
		Error(CurStep, RPARENExcept, CurLine);
		Backward();
		break;
	case LPAREN:
		Error(CurStep, LPARENExcept, CurLine);
		Backward();
		break;
	default:
		break;
	}
	return FALSE;
}

Statement CCompiler::S()
{
	Statement DefaultS;
	DefaultS.Chain = 0;
	int TokenType = m_dModel[ CurStep ].TokenType;
	switch(TokenType){
	case ID://赋值语句
		{
			IDAssgin = m_dModel[ CurStep ].TokenString;
			if (VariableLegal(IDAssgin, -1)==0){
				//未定义的变量
				Error(CurStep, UndeclaredId, CurLine);
				SkipToSEMI();

⌨️ 快捷键说明

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