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

📄 calculator.cpp

📁 利用词法分析原理
💻 CPP
字号:
// Calculator.cpp : implementation file
//

#include "stdafx.h"
#include "MFCThird.h"
#include "Calculator.h"
#include "MFCThirdDlg.h"

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

//char string[100];
//CMFCThirdDlg ob;

/////////////////////////////////////////////////////////////////////////////
// CCalculator

IMPLEMENT_DYNCREATE(CCalculator, CCmdTarget)

CCalculator::CCalculator()
{

}

CCalculator::~CCalculator()
{

}

int CCalculator::yylex()
{
	char num[20];
	int temp = 0;

	// 过滤掉空白
	while ( string[pCur]==' ' ) pCur++;

	// 如果是数字,那么把这个记号的数值计算出来放在 yylval 中
	while (string[pCur] >= '0' && string[pCur] <= '9'){
		num[temp++] = string[pCur++];
	}
	if (temp >0) 
	{
		sscanf(num, "%d", &yylval);
		return NUM;
	}
	
	// 其他记号的处理
	switch (string[pCur++])	// 注意:这里指针往前移了一位
	{
		case '+': return ADD;
		case '*':return MUL;
		case '-': return SUB;
		case '/': return DIV;
		case '(':return LBRACE;
		case ')':return RBRACE;
		case '\0': return END;
		default: return OTHER;
	}
}

// 匹配函数,若当前记号与参数相同,则读入下一个记号
void CCalculator::Match(int t)
{
	if (lookahead == t) lookahead = yylex();
	else 
	{
		AfxMessageBox("ERROR!");
        exit(0);		
	}
}



// 处理 T-->FT'
long CCalculator::T()
{
	int temp1,temp2,PFlag;
	switch (lookahead)
	{
		case LBRACE:	// FIRST(FT')={(,num}
		case NUM:
			temp1=F();
			temp2=T_(&PFlag);
			if(PFlag==1) 
			return temp1*temp2;
			else 
			return temp1/temp2;
		default:
			AfxMessageBox("ERROR!");
            exit(0);	
	}
}

// 处理 E'-->+TE'|e
long CCalculator::E_()
{
	int i=0;
	switch (lookahead)
	{
		case ADD:	// E'-->+TE' 的情况, FIRST(E')={+,e}
			 Match(ADD); 
             //for(i=0;string[pCur+i]!=' ';i++);
			 if(string[pCur+i]=='+')
             return T() + E_();
			 else
			 return T() - E_();			 
        case SUB:
			 Match(SUB); 
             //for(i=0;string[pCur+i]!=' ';i++);
			 if(string[pCur+i]=='-')
             return T() + E_();
			 else
			 return T() - E_();
			 
		case RBRACE:// E'-->e 的情况,这个时候需要处理 FOLLOW集合, FOLLOW(E')={), $}
		case END:
			return 0;
		default:
			AfxMessageBox("ERROR!");
            exit(0);
	}	
}

long CCalculator::E_(int *PFlag)
{
	int i=0;
	switch (lookahead)
	{
		case ADD:	// E'-->+TE' 的情况, FIRST(E')={+,e}
			*PFlag=1;
			Match(ADD);			 
			//for(i=0;string[pCur+i]!=' ';i++);				 
			if(string[pCur+i]=='+')
             return T() + E_();
			 else
			 return T() - E_(); 
		case SUB:
			 *PFlag=0;Match(SUB); 
             //for(i=0;string[pCur+i]!=' ';i++);	
			 if(string[pCur+i]=='-')
             return T() + E_();
			 else
			 return T() - E_();
			 
		case RBRACE:// E'-->e 的情况,这个时候需要处理 FOLLOW集合, FOLLOW(E')={), $}
		case END:
			return 0;
		default:
			AfxMessageBox("ERROR!");
            exit(0);	
	}	
}

// 处理 E-->TE'
long CCalculator::E()
{   int temp1,temp2,PFlag;
	switch (lookahead)
	{
		case LBRACE:	// FIRST(TE')={(,num}
		case NUM:
			temp1=T();
			temp2=E_(&PFlag);
				if(PFlag==1) 
			return temp1+temp2;
				else 
					return temp1-temp2;
//		case END:		// FOLLOW(E)={),$}
//			return 0;
		default:
			AfxMessageBox("ERROR!");
            exit(0);	
	}		
}


// 处理 T'-->*FT'|e
long CCalculator::T_(int *PFlag)
{
	int i=0;
	switch (lookahead)
	{
		case MUL:	// FIRST(*FT')={*}
			*PFlag=1;
			Match(MUL);
			if(string[pCur+i]=='*')
             return F() * T_();
			 else
			 return F() / T_();	
		case DIV:
			*PFlag=0;
			Match(DIV);
            if(string[pCur+i]=='/')
            return F() * T_();
			else
			return F() / T_();	
		case SUB:
		case ADD:	// T'-->e 的情况,这个时候需要处理 FOLLOW集合, FOLLOW(T')={+,),$}
		case RBRACE:
		case END:
			return 1;
		default:
			AfxMessageBox("ERROR!");
            exit(0);
	}		
}


// 处理 T'-->*FT'|e
long CCalculator::T_()
{
	int i=0;
	switch (lookahead)
	{
		case MUL:	// FIRST(*FT')={*}
			Match(MUL);
			if(string[pCur+i]=='*')
             return F() * T_();
			 else
			 return F() / T_();	
		case DIV:
			Match(DIV);
            if(string[pCur+i]=='/')
            return F() * T_();
			else
			return F() / T_();	
		case SUB:
		case ADD:	// T'-->e 的情况,这个时候需要处理 FOLLOW集合, FOLLOW(T')={+,),$}
		case RBRACE:
		case END:
			return 1;
		default:
			AfxMessageBox("ERROR!");
            exit(0);
	}		
}

// 处理 F-->(E)|num
long CCalculator::F()
{
	int temp;
	switch(lookahead)
	{
		case LBRACE:	// FIRST((E))={(}
			Match(LBRACE);
			temp = E();
			Match(RBRACE);
			return temp;
		case NUM:		// FIRST(num) = {num}
			temp = yylval;
			Match(NUM);		    
			return temp;
		default:
			AfxMessageBox("ERROR!");
            exit(0);			
	}
}



BEGIN_MESSAGE_MAP(CCalculator, CCmdTarget)
	//{{AFX_MSG_MAP(CCalculator)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCalculator message handlers

⌨️ 快捷键说明

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