📄 calculator.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 + -