亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? mathlex.cpp

?? 這是在wince下面可以跑的一個(gè)畫(huà)函數(shù)的軟件
?? CPP
字號(hào):
//////////////////////////////////////////////////////////////////////
//
//	Graphite For WinCE(Pocket PC)
//  Initially Written By Hyouck "Hawk" Kim, peakhunt@yahoo.com
//	2002, All Rights Reserved
//
//	This is GPLed, open source based, software development project.
//	For more question about GPL,
//	visit http://www.gnu.org/licenses/gpl.txt
//
//	
//	Revision History
//	Nov/30/2002,		Initial Release		hkim	
//
//
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
//
// This file has implementation for Mathematical Parser and
// Lexical Analizer.
//
// Lexical Analyzer is implemented as CMathLex.
// It is state-machine based lexical analyzer.
// For every token recognized, the scanner creates and
// returns a CMathToken type object.
// So, the user of this lexical analyzer should FREE the token
// or he or she will get some memory leak.
//
// Mathematical Parser is implemented as CMathParser.
// Since YACC is not available on WinCE,
// CMathParser is implemented using simple RDP technique.
// For syntax validation, it's using typical syntax.
// For semantic analysis, all it does is convert infix to postfix and
// make the postfix linked list, which is just a chain of CMathToken objects.
//
// Right now, CMathParser is the only user of CMathLexer.
//
// During development, one interesting/challenging thing I confronted was
// it's quite difficult to de-allocate useless CMathToken returned by scanner.
// The problem might be partly due to the syntax of the grammar and
// partly due to the awkward implementation of the parser.
// Anyway, to prevent worst case scenario, as you know, the memory leak
// What I did is
// keep track of all tokens created by scanner in a list and
// after parsing completes, release all tokens.
// that's it.
// 
// In future release,
// probably, we may need to completely re-write those parser and lexer.
//
// Happy Graphying!!!
// H.Kim
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "mathlex.h"
#include "stackmachine.h"

CMathToken::CMathToken(CString& str, MathTokenType type)
{
	m_str	=	str;
	m_type	=	type;
}

CMathToken::CMathToken(const CMathToken& rhs)
{
	this->m_str = rhs.m_str;
	this->m_type = rhs.m_type;
}


CMathLex::CMathLex(CString& str)
{
	m_input = str;
	m_ndx	= 0;
}

CMathLex::~CMathLex(void)
{
}

typedef enum mathLexState
{
	MATH_LEX_STATE_IDLE		= 0xfff0,
	MATH_LEX_STATE_NUMBER,
	MATH_LEX_STATE_FUNC_VAR,
} MathLexState;

CMathToken* CMathLex::getNextToken(void)
{
	CMathToken* token = NULL;
	MathLexState state = MATH_LEX_STATE_IDLE;
	CString tmp = "";
	bool dot_appeared = false;

	while(m_ndx < m_input.GetLength())
	{
		switch(state)
		{
		case MATH_LEX_STATE_IDLE:
			state = (MathLexState)m_input.GetAt(m_ndx);
			if(isalpha(state))
			{
				state = MATH_LEX_STATE_FUNC_VAR;
			}
			else if(isdigit(state))
			{
				state = MATH_LEX_STATE_NUMBER;
			}
			else if(state == ' ' || state == '\t')
			{
				m_ndx++;
				state = MATH_LEX_STATE_IDLE;
			}
			break;

		case '-':
		case '+':
		case '*':
		case '/':
		case '^':			
			tmp += m_input.GetAt(m_ndx++);
			token = new CMathToken(tmp, MATH_TOKEN_TYPE_OP);
			return token;
		case '(':
			tmp += m_input.GetAt(m_ndx++);
			token = new CMathToken(tmp, 
				MATH_TOKEN_TYPE_OPENING_PAREN);
			return token;
		case ')':
			tmp += m_input.GetAt(m_ndx++);
			token = new CMathToken(tmp, 
				MATH_TOKEN_TYPE_CLOSING_PAREN);
			return token;

		case MATH_LEX_STATE_NUMBER:
			if(isdigit(m_input.GetAt(m_ndx)))
			{
				tmp += m_input.GetAt(m_ndx++);
			}
			else if(m_input.GetAt(m_ndx) == '.' && !dot_appeared)
			{
				tmp += m_input.GetAt(m_ndx++);
				dot_appeared = true;

			}
			else
			{
				token = new CMathToken(tmp, MATH_TOKEN_TYPE_NUM);
				return token;
			}
			break;

		case MATH_LEX_STATE_FUNC_VAR:
			if(isalpha(m_input.GetAt(m_ndx)))
			{
				tmp += m_input.GetAt(m_ndx++);
			}
			else
			{
				if(isReservedFunc(tmp))
					token = new CMathToken(tmp, MATH_TOKEN_TYPE_FUNC);
				else
					token = new CMathToken(tmp, MATH_TOKEN_TYPE_VAR);
				return token;
			}
			break;
		default:
			tmp += m_input.GetAt(m_ndx++);
			token = new CMathToken(tmp, MATH_TOKEN_TYPE_UNRECOGNIZED);
			return token;
		}
	}

	switch(state)
	{
	case MATH_LEX_STATE_FUNC_VAR:
		if(isReservedFunc(tmp))
			token = new CMathToken(tmp, MATH_TOKEN_TYPE_FUNC);
		else
			token = new CMathToken(tmp, MATH_TOKEN_TYPE_VAR);
		return token;

	case MATH_LEX_STATE_NUMBER:
		return new CMathToken(tmp, MATH_TOKEN_TYPE_NUM);
	}

	return token;
}


static struct reservedFunc
{
	TCHAR* str;
} reserved[] = 
{
	L"sin",
	L"cos",
	L"tan",
	L"sqrt",
	L"abs",
	L"neg",
	NULL,
};

bool CMathLex::isReservedFunc(CString& str)
{
	int i = 0;

	while(reserved[i].str != NULL)
	{
		if(str.Compare(reserved[i].str) == 0)
			return true;
		i++;
	}
	return false;
}


CMathParser::CMathParser(CString& str,CTokenList* list)
	: m_scanner(str)
{
	m_list = list;
	m_tokenParsed = NULL;
}

bool CMathParser::parse(void)
{
	m_tokenParsed = new CTokenList();

	m_success = true;
	arith();

	delete m_tokenParsed;
	m_tokenParsed = NULL;

	return m_success;
}

#define SET_PARSE_ERROR(b)\
	m_success = false;\
	m_errString = b;

//
// See Below
// Why I create a new Token
// Instead of using existing one.
//
#define LIST_ADD(_token)\
	if(m_list != NULL)\
	{\
		CMathToken* _nToken = new CMathToken(*_token);\
		m_list->addTail(_nToken);\
	}

#define MATCH(_var)\
	if(!match(_var))\
		return;

//
// With this kind of parser,
// Looks like this is the easiest way to prevent memory leak.
// Here, the concept is
// queue all the tokens parsed
// and when parsing ends, destroy all.
//
#define GET_NEXT_TOKEN()\
	{\
		m_lookahead = m_scanner.getNextToken();\
		if(m_lookahead)\
			m_tokenParsed->addTail(m_lookahead);\
	}


void CMathParser::arith(void)
{
	//m_lookahead = m_scanner.getNextToken();
	GET_NEXT_TOKEN();
	expr();
}

void CMathParser::expr(void)
{
	bool opPresent = false;

	term();
	while(1)
	{
		if(m_lookahead == NULL)
			return;

		switch(m_lookahead->m_type)
		{
		case MATH_TOKEN_TYPE_OP:
			if(m_lookahead->m_str.Compare(L"+") == 0 ||
				m_lookahead->m_str.Compare(L"-") == 0)
			{
				CMathToken* tmp;

				tmp = m_lookahead;
				MATCH(m_lookahead->m_str);
				term();
				LIST_ADD(tmp);
				opPresent = true;
				continue;
			}
		}
		return;
	}
}

void CMathParser::term()
{
	factor();
	while(1)
	{
		if(m_lookahead == NULL)
			return;

		switch(m_lookahead->m_type)
		{
		case MATH_TOKEN_TYPE_OP:
			if(m_lookahead->m_str.Compare(L"*") == 0 ||
				m_lookahead->m_str.Compare(L"/") == 0 ||
				m_lookahead->m_str.Compare(L"^") == 0)
			{
				CMathToken* tmp = m_lookahead;
				MATCH(m_lookahead->m_str);
				factor();
				LIST_ADD(tmp);
				continue;
			}
		}
		return;
	}
}

void CMathParser::factor()
{
	if(m_lookahead == NULL)
			return;

	switch(m_lookahead->m_type)
	{
	case MATH_TOKEN_TYPE_OPENING_PAREN:
		{
			CString s = ")";

			MATCH(m_lookahead->m_str);
			expr();
			MATCH(s);
		}
		break;

	case MATH_TOKEN_TYPE_NUM:
	case MATH_TOKEN_TYPE_VAR:
		LIST_ADD(m_lookahead);
		MATCH(m_lookahead->m_str);
		break;

	case MATH_TOKEN_TYPE_FUNC:
		{
			CString str2 = "(", str = ")";
			CMathToken* tmp = m_lookahead;

			MATCH(m_lookahead->m_str);
			MATCH(str2);
			expr();
			MATCH(str);
			LIST_ADD(tmp);
		}
		break;
	default:
		SET_PARSE_ERROR("Syntax Error");
	}
}

bool CMathParser::match(CString& str)
{
	if(m_lookahead == NULL)
	{
		SET_PARSE_ERROR("Syntax Error");
		return false;
	}

	if(m_lookahead->m_str.Compare(str) == 0)
	{
		GET_NEXT_TOKEN();
		//m_lookahead = m_scanner.getNextToken();
		return true;
	}
	else
	{
		SET_PARSE_ERROR("Syntax Error");
		return false;
	}
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本精品免费观看高清观看| 激情五月激情综合网| 678五月天丁香亚洲综合网| 99re热视频精品| 欧美福利电影网| 成人在线视频首页| 日韩中文字幕不卡| 亚洲欧美怡红院| 精品国产乱码久久久久久免费| 色综合久久久久久久| 精品夜夜嗨av一区二区三区| 亚洲精品欧美在线| 久久久高清一区二区三区| 欧美日韩国产美女| 亚洲国产综合人成综合网站| 国产精品丝袜在线| 欧美va日韩va| 91精品国产入口| 欧美色成人综合| 91色|porny| 日韩欧美亚洲国产另类| 国精产品一区一区三区mba桃花 | 国产成人综合视频| 欧美一区二区播放| 久久国产剧场电影| 国产精品美日韩| 在线观看一区二区视频| 在线播放国产精品二区一二区四区 | 亚洲国产精品二十页| 91精品午夜视频| 欧美色老头old∨ideo| 色婷婷久久综合| 日本韩国欧美一区二区三区| av电影在线不卡| 成人av第一页| 99精品国产一区二区三区不卡| 国产精品一区二区久久精品爱涩| 久久国产夜色精品鲁鲁99| 成人小视频免费在线观看| 亚洲一区二区三区中文字幕在线| 亚洲六月丁香色婷婷综合久久 | 国产精品不卡在线观看| 国产日韩精品一区二区三区在线| 久久青草国产手机看片福利盒子 | 欧美视频自拍偷拍| 欧美中文一区二区三区| 欧美视频在线观看一区| 色欧美88888久久久久久影院| 一本一本大道香蕉久在线精品| 不卡一区二区在线| 91麻豆精品一区二区三区| 一区二区三区在线播| 国产一区三区三区| 中文字幕一区免费在线观看| 国产精品嫩草99a| 中文字幕日韩av资源站| 亚洲综合免费观看高清完整版在线 | 国内精品在线播放| 国产综合色精品一区二区三区| 激情亚洲综合在线| www.欧美色图| 69堂精品视频| 欧美高清在线一区| 国产欧美一区视频| 国产精品久久看| 亚洲狼人国产精品| 亚洲一区二三区| 欧美日韩在线播| 91丨九色丨黑人外教| 色噜噜狠狠色综合中国| 精品久久免费看| 成人性生交大片免费看视频在线| 日本成人在线不卡视频| 国产精品拍天天在线| 亚洲一区二区偷拍精品| 蜜芽一区二区三区| 成人一区二区三区视频在线观看 | 欧美一区二区三区在线观看视频| 石原莉奈一区二区三区在线观看| 精品一区二区三区久久| av电影在线不卡| 日韩一区二区在线看| 日本一区二区免费在线观看视频 | 青草国产精品久久久久久| 国产伦精品一区二区三区视频青涩 | 欧美精品一二三四| 国产亚洲欧美在线| 一级女性全黄久久生活片免费| 麻豆国产91在线播放| 91久久一区二区| 日韩欧美一级精品久久| 亚洲丝袜另类动漫二区| 麻豆精品一区二区av白丝在线| 99精品久久只有精品| 亚洲黄网站在线观看| 一区二区三区中文字幕精品精品| 日本成人中文字幕在线视频| 成人h动漫精品一区二| 91精品国产品国语在线不卡| 久久精品人人做人人综合| 91电影在线观看| 99久久久国产精品| 国产精品青草综合久久久久99| 亚洲视频一区二区免费在线观看| 99国产精品久久| 日本黄色一区二区| 中文字幕乱码亚洲精品一区| 日韩电影免费在线观看网站| 国产精品国产三级国产| 日韩精品午夜视频| 在线观看三级视频欧美| 亚洲男人的天堂在线观看| 国产91精品欧美| 国产精品天美传媒| 欧美午夜一区二区| 欧美日韩美女一区二区| 国产精品视频麻豆| 国产精品乡下勾搭老头1| 91精品欧美久久久久久动漫| 一区二区三区四区在线免费观看 | 日韩久久精品一区| 亚洲一区二区欧美日韩 | 在线观看不卡一区| 成人免费在线视频观看| 丁香桃色午夜亚洲一区二区三区| 欧美成人女星排行榜| 欧美r级电影在线观看| 午夜精品久久久久久久久久久 | 成人性生交大合| 国产亚洲精久久久久久| 欧美日韩视频在线一区二区| 99精品国产91久久久久久 | 91免费观看视频| 91精品啪在线观看国产60岁| 亚洲成人你懂的| 欧美亚洲国产一区在线观看网站 | 中文字幕一区二区三区在线观看 | 777午夜精品视频在线播放| 亚洲伊人伊色伊影伊综合网| 日本道在线观看一区二区| 夜夜亚洲天天久久| 欧美三区在线观看| 日本午夜精品一区二区三区电影| 欧美二区乱c少妇| 青青草国产成人av片免费| 欧美一级在线观看| 久久久国际精品| 国产成人av影院| 国产精品免费av| 91视视频在线观看入口直接观看www | 国产精品久线观看视频| 自拍偷拍欧美激情| 欧美日韩一级黄| 亚洲人成在线观看一区二区| 欧美性受xxxx黑人xyx| www.av亚洲| 风间由美性色一区二区三区| 欧美日韩视频在线第一区| 成人激情免费视频| 韩国av一区二区三区在线观看| 首页欧美精品中文字幕| 丝袜美腿亚洲一区二区图片| 色婷婷av一区二区三区软件 | 亚洲午夜久久久| 欧美三级电影精品| 久久精品国产网站| 欧美激情自拍偷拍| 在线看国产日韩| 久久国产生活片100| 国产精品全国免费观看高清| 欧美色爱综合网| 国产一区二区美女诱惑| ㊣最新国产の精品bt伙计久久| 欧美伊人精品成人久久综合97 | 91看片淫黄大片一级| 日韩影视精彩在线| 国产亚洲成aⅴ人片在线观看| 色综合婷婷久久| 美女脱光内衣内裤视频久久网站 | 国产一区二区视频在线| 国产精品理论片在线观看| 国产99久久久国产精品潘金| 成人av在线资源| 欧美国产精品一区二区| 欧美日韩国产高清一区二区三区 | 亚洲精品视频一区| 日韩一区二区三区精品视频| 国产91丝袜在线播放| 日韩和欧美一区二区| 国产精品视频一二| 日韩欧美在线观看一区二区三区| av电影在线不卡| 国产专区综合网| 天天影视涩香欲综合网| 国产精品天干天干在线综合| 日韩欧美成人激情| 欧美日韩亚洲综合在线| 大美女一区二区三区| 国产日本亚洲高清| 日韩欧美国产综合|