inifile.cpp

来自「C++轻量级分析器」· C++ 代码 · 共 62 行

CPP
62
字号
#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_CpRegex.h"

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

#define LINE(CONTENT) L#CONTENT L"\r\n"

PCWChar IniFile_Content=
LINE([Section One])
LINE(KeyA=ValueA)
LINE(KeyB=ValueB)
LINE([Section Two])
LINE(KeyC=ValueC)
LINE(KeyD=ValueD)
;

typedef VL_CpPair<PCWChar , VInt>						IniString;
typedef VL_CpList<VL_CpPair<IniString , IniString>>		IniKeyValues;
typedef VL_CpList<VL_CpPair<IniString , IniKeyValues>>	IniStructure;

VUnicodeString ToString(IniString s)
{
	return VUnicodeString(s.First,s.Second);
}

void IniFile_Main()
{
	GetConsole()->WriteLine(L"开始分析以下INI文件内容:");
	GetConsole()->WriteLine(IniFile_Content);

	VL_CpParser<PCWChar , IniStructure> IniParser = 
		**(
			(_Regex(L"\\[") > _Regex(L"[^\\[\\]\\r\\n]+") < _Regex(L"\\]")) +
			(
				_Regex(L"[\\r\\n]+") >
				**(
					_Regex(L"[^=\\r\\n]+") + (_Regex(L"=") > _Regex(L"[^\\r\\n]+")) <
					Optx(_Regex(L"[\\r\\n]+"))
				)
			)
		);

	IniStructure Ini=IniParser.Parse(IniFile_Content).Head->Data.First;

	IniStructure::Node::Ptr SectionPtr=Ini.Head;
	while(SectionPtr)
	{
		GetConsole()->WriteLine(L"节名:"+ToString(SectionPtr->Data.First));
		IniKeyValues::Node::Ptr PairPtr=SectionPtr->Data.Second.Head;
		while(PairPtr)
		{
			GetConsole()->WriteLine(L"\t键("+ToString(PairPtr->Data.First)+L") = 值("+ToString(PairPtr->Data.Second)+L")");
			PairPtr=PairPtr->Next;
		}
		SectionPtr=SectionPtr->Next;
	}
}

⌨️ 快捷键说明

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