?? calculate.cpp
字號:
// Calculate.cpp: implementation of the CCalculate class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Calculator.h"
#include "Calculate.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CCalculate::CCalculate()
{
pCur=0;
for(int i=0;i<100;i++)
input[i]=0;
lookahead=0;
yylval=0;
m_strDisplay="";// 顯示串
}
CCalculate::~CCalculate()
{
}
void CCalculate::init()
{
pCur=0;
for(int i=0;i<100;i++)
input[i]=0;
lookahead=0;
yylval=0;
m_strDisplay="";// 顯示串
}
// 詞法分析器,讀入一個記號
int CCalculate::yylex()
{
char num[20];
int temp = 0;
// 過濾掉空白
while ( input[pCur]==' ' )//pCur在OnBnClickedButtonEqa()函數內已經被賦成了0。
{
pCur++;
}
// 如果是數字,那么把這個記號的數值計算出來放在 yylval 中
//這里還是在處理單個字符。也就是說是字符串是一個一個字符讀入的,一個一個分析的。
while (input[pCur] >= '0' && input[pCur] <= '9'||input[pCur]=='.')
{
num[temp++] = input[pCur++];
}
if (temp >0)
{
sscanf(num, "%f", &yylval);//做了類型轉換,把類型由char轉換到int。
return NUM;//把num返回給lookahead.
}
// 其他記號的處理
// 如果讀入的不是數字字符,則判斷是以下的哪個運算符。
else
switch (input[pCur++]) // 注意:這里指針往前移了一位
{
case '+': return ADD;//把add返回給lookahead.
case '-':return SUB;
case '*':return MUL;//把mul返回給lookahead.
case '/':return DIV;
case '(':return LBRACE;//把lbrace返回給lookahead.
case ')':return RBRACE;//把rbrace返回給lookahead.
case '\0': return END;//把end返回給lookahead.
default: return OTHER;//把other返回給lookahead.
}
}
// 匹配函數,若當前記號與參數相同,則讀入下一個記號
void CCalculate::Match(int t)
{
if (lookahead == t)
lookahead = yylex();
else
{
m_strDisplay =" ERROR!!!";
}
}
// 處理 E-->GE'
float CCalculate::E()
{
switch (lookahead)
{
case LBRACE: // FIRST(TE')={(,num}
case NUM:
return T()+E_();
default:
m_strDisplay =" ERROR!!!";
}
return 0;
}
// 處理 E'-->+TE'|e
float CCalculate::E_()
{
switch (lookahead)
{
case ADD: // E'-->+TE' 的情況, FIRST(E')={+,e}
Match(ADD);
return T() + E_();
case RBRACE:// E'-->e 的情況,這個時候需要處理 FOLLOW集合, FOLLOW(E')={), $}
case SUB:
case DIV:
case END:
return 0;
default:
m_strDisplay =" ERROR!!!";
}
return 0;
}
//處理T->ST'
float CCalculate::T()
{
switch (lookahead)
{
case LBRACE:
case NUM:
return S()-T_();
default:
m_strDisplay =" ERROR!!!";
}
return 0;
}
//處理T'->-ST'|e
float CCalculate::T_()
{
switch (lookahead)
{
case SUB:
Match(SUB); return S() - T_();
case RBRACE:
case ADD:
case DIV:
case END:
return 0;
default:
m_strDisplay =" ERROR!!!";
}
return 0;
}
//處理S->GS'
float CCalculate::S()
{
switch (lookahead)
{
case LBRACE:
case NUM:
return G()/S_();
default:
m_strDisplay =" ERROR!!!";
}
return 0;
}
//處理S'->/GS'|e
float CCalculate::S_()
{
switch (lookahead)
{
case DIV:
Match(DIV);
return F() / G_();
case ADD:
case SUB:
case MUL:
case RBRACE:
case END:
return 1;
default:
m_strDisplay =" ERROR!!!";
}
return 0;
}
// 處理 G-->FG'
float CCalculate::G()
{
switch (lookahead)
{
case LBRACE: // FIRST(FG')={(,num}
case NUM:
return F()*G_();
default:
m_strDisplay =" ERROR!!!";
}
return 0;
}
// 處理 G'-->*FG'|e
float CCalculate::G_()
{
switch (lookahead)
{
case MUL: // FIRST(*FG')={*}
Match(MUL);
return F() * G_();
case ADD: // T'-->e 的情況,這個時候需要處理 FOLLOW集合, FOLLOW(T')={+,),$}
case SUB:
case DIV:
case RBRACE:
case END:
return 1;
default:
m_strDisplay =" ERROR!!!";
}
return 0;
}
// 處理 F-->(E)|num
float CCalculate::F()
{
float 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:
m_strDisplay =" ERROR!!!";
}
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -