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