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

📄 expression.cpp

📁 C++轻量级分析器
💻 CPP
字号:
#include "..\..\..\Library\Platform\VL_Console.h"
#include "..\..\..\Library\Data\Data\VL_Data_List.h"
#include "..\..\..\Library\Data\Grammar2\Combinator\VL_CpKernel.h"
#include "..\..\..\Library\Data\Grammar2\Combinator\VL_CpString.h"

using namespace vl;
using namespace vl::platform;
using namespace vl::grammar;
using namespace vl::collection;

VInt Negative(VInt Input)
{
	return -Input;
}

VInt Calculate(const VL_CpPair<VInt , VL_CpList<VL_CpPair<VWChar , VInt>>>& Input)
{
	VInt Result=Input.First;
	VL_CpList<VL_CpPair<VWChar , VInt>>::Node::Ptr Current=Input.Second.Head;
	while(Current)
	{
		switch(Current->Data.First)
		{
		case L'+':
			Result+=Current->Data.Second;
			break;
		case L'-':
			Result-=Current->Data.Second;
			break;
		case L'*':
			Result*=Current->Data.Second;
			break;
		case L'/':
			Result/=Current->Data.Second;
			break;
		}
		Current=Current->Next;
	}
	return Result;
}

typedef VL_CpParser<PCWChar , VInt>	ExpParser;

VL_AutoPtr<ExpParser> CreateParser()
{
	_Wrapper<PCWChar , VInt> Factor,Term,Expr;

	Factor	= _uInt || (Negative <<= _Chs(L"-") > Factor) || (_Chs(L"(") > Expr < _Chs(L")"));
	Term	= Calculate <<= Factor + **(_Chs(L"*/") + Factor);
	Expr	= Calculate <<= Term + **(_Chs(L"+-") + Term);

	return new ExpParser(Expr);
}

PCWChar Expression_Content=L"(11+22)*(33+44)-6/(-2)";

void Expression_Main()
{
	GetConsole()->WriteLine(L"开始计算表达式\""+VUnicodeString(Expression_Content)+L"\"的结果:");
	
	VL_AutoPtr<ExpParser> Parser=CreateParser();
	VInt Result=Parser->Parse(Expression_Content).Head->Data.First;

	GetConsole()->WriteLine(L"分析结果:"+VUnicodeString(Result));
	GetConsole()->WriteLine(L"正确结果:"+VUnicodeString((11+22)*(33+44)-6/(-2)));
}

⌨️ 快捷键说明

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