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

📄 re_syntex.inl

📁 正则表达式。利用模板完成
💻 INL
📖 第 1 页 / 共 3 页
字号:
				const re_char * szTemp = szSave;
				if(m_Leaf->match(pattern,szSave,result))
				{
					if(szSave == szTemp)
					{//有些无穷循环的在分析阶段没有检测到
						pattern.eError = ree_recursion_always;
						pattern._break();
						return false;
					}
				}
				else
				{
					break;
				}
			}
			
			sz = szSave;
			return true;
		}
	};
	//+
	struct rp_repeat_more_one_greed : public rp_base
	{
		rp_base *	m_Leaf;
		virtual ~rp_repeat_more_one_greed(){
			delete m_Leaf;
		}
		virtual bool match(re_match_temp & pattern,const re_char * & sz,result_type & result){
			const re_char * szSave = sz;
			if(pattern._is_end(szSave) || m_Leaf->match(pattern,szSave,result) == false)
				return false;
			for(;!pattern._is_end(szSave);)
			{
				const re_char * szTemp = szSave;
				if(m_Leaf->match(pattern,szSave,result))
				{
					if(szSave == szTemp)
					{//有些无穷循环的在分析阶段没有检测到
						pattern.eError = ree_recursion_always;
						pattern._break();
						return false;
					}
				}
				else
				{
					break;
				}
			}

			sz = szSave;
			return true;
		}
	};
	//?
	struct rp_repeat_zero_one_greed : public rp_base
	{
		rp_base *	m_Leaf;
		virtual ~rp_repeat_zero_one_greed(){
			delete m_Leaf;
		}
		virtual bool match(re_match_temp & pattern,const re_char * & sz,result_type & result){
			if(!pattern._is_end(sz))
				m_Leaf->match(pattern,sz,result);
			return true;
		}
	};
	//!
	struct rp_not_regular : public rp_base
	{
		rp_base *	m_Leaf;
		virtual ~rp_not_regular(){
			delete m_Leaf;
		}
		virtual bool match(re_match_temp & pattern,const re_char * & sz,result_type & result){
			const re_char * szSave = sz;
			result_type r;
			if(!m_Leaf->match(pattern,szSave,r))
			{
				sz = Next(sz);
				return true;
			}
			return false;
		}
	};
	//|
	struct rp_or_regular : public rp_base
	{
		rp_base *	m_First;
		rp_base *	m_Second;
		virtual ~rp_or_regular(){
			delete m_First;
			delete m_Second;
		}
		virtual bool match(re_match_temp & pattern,const re_char * & sz,result_type & result){
			const re_char * szSave = sz;
			if(m_First->match(pattern,sz,result))
				return true;
			sz = szSave;
			if(m_Second->match(pattern,sz,result))
				return true;
			return false;
		}
	};
	//&
	struct rp_and_regular : public rp_base
	{
		rp_base *	m_First;
		rp_base *	m_Second;
		virtual ~rp_and_regular(){
			delete m_First;
			delete m_Second;
		}
		virtual bool match(re_match_temp & pattern,const re_char * & sz,result_type & result){
			const re_char * sz1 = sz;
			const re_char * sz2 = sz;
			if(!m_First->match(pattern,sz1,result))
				return false;
			if(!m_Second->match(pattern,sz2,result))
				return false;
			if(sz1 == sz2)
			{
				sz = sz1;
				return true;
			}
			return false;
		}
	};

//-----------------------------------------------------------------------------

	re_error _match(re_match_temp & pattern,const re_char * sz,result_type & result) const
	{
		if(m_Syntex == NULL)
			return ree_noparse;
		while(pattern._is_break() == false && !pattern._is_end(sz))
		{
			const re_char * szTemp = sz;
			if(m_Syntex->match(pattern,szTemp,result))
			{
				result.m_Match.begin = sz;
				result.m_Match.end = szTemp;
				return ree_ok;
			}
			sz = Next(sz);
		}

		return pattern.eError == ree_ok ? ree_nomatch : pattern.eError;
	}

//-----------------------------------------------------------------------------
	
public:
	// 分析的结果
	re_error				m_eError;
	re_flags				m_eFlags;
	rp_array *				m_Syntex;
	// 分析时的临时变量
	size_t					m_nGroupId;
	std::vector<rp_array *>	m_Syntexes;

	// parser
	void _push_syntex(rp_array * pSyntex){
		m_Syntexes.push_back(m_Syntex);
		m_Syntex = pSyntex;
	}
	void _pop_syntex(){
		m_Syntex = m_Syntexes.back();
		m_Syntexes.pop_back();
	}
	void _break(){
		m_bBreak = true;
	}
	void _optimize(){
	}
	size_t _get_escape_char(re_block * root,const re_char * & sz)
	{
		size_t c = ToSize_t(sz);
		const re_char * szSave = sz;
		sz = Next(sz);
		switch(c)
		{
		case rt_return:
			if(option() & rf_return)
				return '\r';
			return c;
		case rt_enter:
			return '\n';
		case rt_tab:
			return '\t';
		case rt_hex_prefix:
		case rt_hex_prefix2:
			{
				if(root->_is_end(sz))
					return c;
				re_char * szEnd;
				long lHex = to_hex(sz,root->szEnd,&szEnd);
				if(sz == szEnd)
					return c;
				sz = szEnd;
				return (size_t)lHex;
			}
			break;
		case rt_oct_prefix:
		case rt_oct_prefix2:
			{
				if(root->_is_end(sz))
					return c;
				re_char * szEnd;
				long lHex = to_oct(sz,root->szEnd,&szEnd);
				if(sz == szEnd)
					return c;
				sz = szEnd;
				return (size_t)lHex;
			}
			break;
		default:
			if(IsDigit(szSave))
			{
				re_char * szEnd;
				long lDigit = to_int(szSave,root->szEnd,&szEnd);
				sz = szEnd;
				return (size_t)lDigit;
			}
			break;
		}
		return c;
	}
	re_error _parse_not_range(re_block * root,const re_char * & sz)
	{
		sz = Next(sz);
		if(root->_is_end(sz))
			return ree_syntex;

		rp_range * Syntex;
		if(rt_not_range == ToSize_t(sz))
		{
			sz = Next(sz);
			if(root->_is_end(sz))
				return ree_syntex;
			Syntex = new rp_not_range;
		}
		else
		{
			Syntex = new rp_range;
		}

		m_Syntex->m_Syntex.push_back(Syntex);
		return _parse_range(root,sz,*Syntex);
	}
	re_error _parse_range(re_block * root,const re_char * & sz,rp_range & Syntex)
	{
		if(root->_is_end(sz))
			return ree_syntex;
		
		size_t old = ToSize_t(sz);
		do
		{
			sz = Next(sz);
			size_t begin = old;
			if(rt_range_end == begin)
				break;
			if(rt_escape == begin)
			{
				if(root->_is_end(sz))
					return ree_syntex;
				begin = _get_escape_char(root,sz);
			}
			if(root->_is_end(sz))
				return ree_syntex;

			old = ToSize_t(sz);
			if(rt_range_sign == old)
			{//范围
				sz = Next(sz);
				if(root->_is_end(sz))
					return ree_syntex;
				
				old = ToSize_t(sz);
				if(rt_range_end == old)
					return ree_syntex;
				if(rt_escape == old)
				{
					sz = Next(sz);
					if(root->_is_end(sz))
						return ree_syntex;
					old = _get_escape_char(root,sz);
				}
				else
					sz = Next(sz);
				
				range_range	rr;
				if(begin < old)
				{
					rr.begin = begin;
					rr.end = old;
				}
				else
				{
					rr.begin = old;
					rr.end = begin;
				}
				Syntex.m_Range.push_back(rr);
				
				if(!root->_is_end(sz))
					old = ToSize_t(sz);
			}
			else
			{
				Syntex.m_In.push_back(begin);
			}
		}
		while(!root->_is_end(sz));
		
		if(Syntex.m_In.size() == 0 && Syntex.m_Range.size() == 0)
			return ree_syntex;
		
		std::sort(Syntex.m_In.begin(),Syntex.m_In.end());
		return ree_ok;
	}
	re_error _parse_begin_line(const re_char * & sz)
	{
		rp_base * Syntex;
		if(option() & rf_multi_line)
			Syntex = new rp_begin_line;
		else
			Syntex = new rp_begin_all;
		m_Syntex->m_Syntex.push_back(Syntex);
		sz = Next(sz);
		return ree_ok;
	}
	re_error _parse_end_line(const re_char * & sz)
	{
		rp_base * Syntex;
		if(option() & rf_multi_line)
			Syntex = new rp_end_line;
		else
			Syntex = new rp_end_all;
		m_Syntex->m_Syntex.push_back(Syntex);
		sz = Next(sz);
		return ree_ok;
	}
	re_error _parse_any(const re_char * & sz)
	{
		sz = Next(sz);
		rp_base * Syntex;
		if(option() & rf_multi_line)
			Syntex = new rp_any_multi_line;
		else
			Syntex = new rp_any_single_line;
		m_Syntex->m_Syntex.push_back(Syntex);
		return ree_ok;
	}
	re_error _parse_more_zero(re_block * root,const re_char * & sz)
	{
		if(m_Syntex->m_Syntex.size() == 0)
			return ree_syntex;
		sz = Next(sz);
		if(!root->_is_end(sz))
		{
			if(rt_zero_one == ToSize_t(sz))
			{
				rp_repeat_more_zero * Syntex = new rp_repeat_more_zero;
				Syntex->m_Leaf = m_Syntex->m_Syntex.back();
				m_Syntex->m_Syntex.back() = Syntex;
				sz = Next(sz);
				
				rp_array * pNew = new rp_array;
				Syntex->m_Next = pNew;
				m_Syntex->m_Syntex.push_back(pNew);
				_push_syntex(pNew);
				const re_char * szSave = root->szStart;
				root->szStart = sz;
				re_error e = _parse_array(root);
				root->szStart = szSave;
				_pop_syntex();

				sz = root->szEnd;

				return e;
			}
		}

		rp_repeat_more_zero_greed * Syntex = new rp_repeat_more_zero_greed;
		Syntex->m_Leaf = m_Syntex->m_Syntex.back();
		m_Syntex->m_Syntex.back() = Syntex;

		return ree_ok;
	}
	re_error _parse_more_one(re_block * root,const re_char * & sz)
	{
		if(m_Syntex->m_Syntex.size() == 0)
			return ree_syntex;
		sz = Next(sz);
		if(!root->_is_end(sz))
		{
			if(rt_zero_one == ToSize_t(sz))
			{
				rp_repeat_more_one * Syntex = new rp_repeat_more_one;
				Syntex->m_Leaf = m_Syntex->m_Syntex.back();
				m_Syntex->m_Syntex.back() = Syntex;
				sz = Next(sz);
				
				rp_array * pNew = new rp_array;
				Syntex->m_Next = pNew;
				m_Syntex->m_Syntex.push_back(pNew);
				_push_syntex(pNew);
				const re_char * szSave = root->szStart;
				root->szStart = sz;
				re_error e = _parse_array(root);
				root->szStart = szSave;
				_pop_syntex();

				sz = root->szEnd;

				return e;
			}
		}

		rp_repeat_more_one_greed * Syntex = new rp_repeat_more_one_greed;
		Syntex->m_Leaf = m_Syntex->m_Syntex.back();
		m_Syntex->m_Syntex.back() = Syntex;

		return ree_ok;
	}
	re_error _parse_not(re_block * root,const re_char * & sz)
	{
		if(m_Syntex->m_Syntex.size() == 0)
			return ree_syntex;
		sz = Next(sz);

		rp_not_regular * Syntex = new rp_not_regular;
		Syntex->m_Leaf = m_Syntex->m_Syntex.back();
		m_Syntex->m_Syntex.back() = Syntex;

		return ree_ok;
	}
	re_error _parse_zero_one(re_block * root,const re_char * & sz)
	{
		if(m_Syntex->m_Syntex.size() == 0)
			return ree_syntex;
		sz = Next(sz);
		if(!root->_is_end(sz))
		{
			if(rt_zero_one == ToSize_t(sz))
			{
				rp_repeat_zero_one * Syntex = new rp_repeat_zero_one;
				Syntex->m_Leaf = m_Syntex->m_Syntex.back();
				m_Syntex->m_Syntex.back() = Syntex;
				sz = Next(sz);
				
				rp_array * pNew = new rp_array;
				Syntex->m_Next = pNew;
				m_Syntex->m_Syntex.push_back(pNew);
				_push_syntex(pNew);
				const re_char * szSave = root->szStart;
				root->szStart = sz;
				re_error e = _parse_array(root);
				root->szStart = szSave;
				_pop_syntex();

				sz = root->szEnd;

				return e;
			}
		}

		rp_repeat_zero_one_greed * Syntex = new rp_repeat_zero_one_greed;
		Syntex->m_Leaf = m_Syntex->m_Syntex.back();

⌨️ 快捷键说明

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