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

📄 parse.cpp

📁 PL编译器
💻 CPP
字号:
// Parse.cpp: implementation of the CParse class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "PascalCompiler.h"
#include "Parse.h"
#include "Tokenize.h"


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

extern FILE *pfile;					//指向输入文件的指针

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

CParse::CParse()
{
	flag = 0;
}

CParse::~CParse()
{

}

void CParse::PASCALparse()
{
	fscanf(pfile,"%s %s\n",tokenSign,tokenValue);
	program();
	fclose(pfile);
}

int CParse::match(int temp)
{
	int tmp=atoi(tokenSign);

	if (temp == tmp)
		return 1;
	else
		return 0;
}
	
void CParse::advance()
{
	fscanf(pfile,"%s %s\n",tokenSign,tokenValue);
}

CString CParse::returnError()
{
	switch(flag)
	{
	case 1:		return mStr[1];			break;
	case 2:		return mStr[2];			break;
	case 3:		return mStr[3];			break;
	case 4:		return mStr[4];			break;
	case 5:		return mStr[5];			break;
	case 6:		return mStr[6];			break;
	case 7:		return mStr[7];			break;
	case 8:		return mStr[8];			break;
	case 9:		return mStr[9];			break;
	case 10:	return mStr[10];		break;
	case 11:	return mStr[11];		break;
	case 12:	return mStr[12];		break;
	case 13:	return mStr[13];		break;
	case 14:	return mStr[14];		break;
	case 15:	return mStr[15];		break;
	case 16:	return mStr[16];		break;
	default:	return mStr[0];			break;
	}
}

//<program> → <declaration_list>BEGIN<statement_list>END.
void CParse::program()
{
	declaration_list();

	match(SYN_BEGIN);

	statement_list();

	if(match(SYN_END))
		advance();
	else
	{
		mStr[1]=mErr.Error(SYN_END);
		flag=1;
	}

	if(match(SYN_PERIOD))
	{
		mStr[0]="Grammer Analysis Successful!";
		flag=0;
	}

	else
	{
		mStr[2]=mErr.Error(SYN_PERIOD);
		flag=2;
	}
}

//<declaration_list> → VAR<variable_list>:INTEGER; |ε
void CParse::declaration_list()
{
	if(!match(SYN_VAR))
		return;

	if(match(SYN_VAR))
		advance();
	else
	{
		mStr[3]=mErr.Error(SYN_VAR);
		flag=3;
	}

	varible_list();

	if(match(SYN_COLON))
		advance();
	else
	{
		mStr[4]=mErr.Error(SYN_COLON);
		flag=4;
	}

	if(match(SYN_INTEGER))
		advance();
	else
	{
		mStr[5]=mErr.Error(SYN_INTEGER);
		flag=5;
	}

	if(match(SYN_SEMI))
		advance();
	else
	{
		mStr[6]=mErr.Error(SYN_SEMI);
		flag=6;
	}
}

//<varible_list> →ID A
void CParse::varible_list()
{
	if(match(SYN_ID))
		advance();
	else
	{
		mStr[7]=mErr.Error(SYN_ID);
		flag=7;
	}

	A();
}
	
//A →  ,ID A |ε
void CParse::A()
{
	if(!match(SYN_COMMA))
		return;

	if(match(SYN_COMMA))
		advance();
	else
	{
		mStr[8]=mErr.Error(SYN_COMMA);
		flag=8;
	}

	if(match(SYN_ID))
		advance();
	else
	{
		mStr[9]=mErr.Error(SYN_ID);
		flag=9;
	}

	A();
}

//<statement_list> → <statement>B
void CParse::statement_list()
{
	statement();
	B();
}

//B →;<statement_list> |ε
void CParse::B()
{
	if(!match(SYN_SEMI))
		return;

	match(SYN_SEMI);

	statement_list();
}

//<statement> → <assignment_stat> | <conditional_stat> | <while_stat> | <compound_stat>
void CParse::statement()
{
	advance();

	if(match(SYN_ID))
		assignment_stat();

	if(match(SYN_IF))
		conditional_stat();

	if(match(SYN_WHILE))
		while_stat();

	if(match(SYN_BEGIN))
		compound_stat();
}

//<assignment_stat> → ID:=<arithmetic_expr>
void CParse::assignment_stat()
{
	if(match(SYN_ID))
		advance();
	else
	{
		mStr[10]=mErr.Error(SYN_ID);
		flag=10;
	}

	if(match(SYN_COLE))
		advance();
	else
	{
		mStr[11]=mErr.Error(SYN_COLE);
		flag=11;
	}

	arithmetic_expr();
}

//<conditional_stat> → IF<relational_expr>THEN<statement>ELSE<statement>
void CParse::conditional_stat()
{
	if(match(SYN_IF))
		advance();
	else
	{
		mStr[12]=mErr.Error(SYN_IF);
		flag=12;
	}

	relational_expr();

	match(SYN_THEN);
	statement();

	match(SYN_ELSE);
	statement();
}

//<while_stat> → WHILE<relational_expr>DO<statement>
void CParse::while_stat()
{
	if(match(SYN_WHILE))
		advance();
	else
	{
		mStr[13]=mErr.Error(SYN_WHILE);
		flag=13;
	}

	relational_expr();

	match(SYN_DO);

	statement();
}

//<compound_stat> → BEGIN<statement_list>END
void CParse::compound_stat()
{
	match(SYN_BEGIN);
	statement_list();

	if(match(SYN_END))
		advance();
	else
	{
		mStr[14]=mErr.Error(SYN_END);
		flag=14;
	}
}

//<arithmetic_expr> → <item>C
void CParse::arithmetic_expr()
{
	item();
	C();
}

//C → +<item>C | -<item>C |ε
void CParse::C()
{
	if(match(SYN_PLUS) || match(SYN_SUB))
	{
		advance();
		item();
		C();
	}

	else
		return;
}

//<item> → <factor>D
void CParse::item()
{
	factor();
	D();
}

//D → *<factor>D | /<factor>D |ε
void CParse::D()
{
	if(match(SYN_MUL) || match(SYN_DIV))
	{
		advance();
		factor();
		D();
	}

	else
		return;
}

//<factor> → ID | NUM | (<arithmetic_expr>)
void CParse::factor()
{
	if(match(SYN_ID) || match(SYN_NUM))
	{
		advance();
	}

	else
	{
		if(match(SYN_LPAREN))
			advance();
		else
		{
			mStr[15]=mErr.Error(SYN_LPAREN);
			flag=15;
		}

		arithmetic_expr();

		if(match(SYN_RPAREN))
			advance();
		else
		{
			mStr[16]=mErr.Error(SYN_RPAREN);
			flag=16;
		}
	}
}

//<relational_expr> → <arithmetic_expr><<arithmetic_expr>
//<relational_expr> → <arithmetic_expr><=<arithmetic_expr>
//<relational_expr> → <arithmetic_expr>==<arithmetic_expr>
//<relational_expr> → <arithmetic_expr>><arithmetic_expr>
//<relational_expr> → <arithmetic_expr>>=<arithmetic_expr>
//<relational_expr> → <arithmetic_expr><><arithmetic_expr>
void CParse::relational_expr()
{
	arithmetic_expr();

	if(match(SYN_LT) || match(SYN_LE) || match(SYN_EQ) || match(SYN_LG) || match(SYN_ME) || match(SYN_NE))
	{
		advance();
		arithmetic_expr();
	}
}

⌨️ 快捷键说明

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