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

📄 grammartree.cpp

📁 正则表达式由一些普通字符和一些元字符(metacharacters)组成。普通字符包括大小写的字母和数字
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					Current=Current->Left;
					Data.AddLeft(Current);
					Current->Left->Data.Data=L'-';
					Current->Left->Data.Type=Operator;
					Data.AddLeft(Current->Left);
					Current->Left->Left->Data.Data=L'Z'+1;
					Current->Left->Left->Data.Type=CharGroup;
					Data.AddRight(Current->Left);
					Current->Left->Right->Data.Data=L'a'-1;
					Current->Left->Right->Data.Type=CharGroup;
					Data.AddRight(Current);
					Current->Right->Data.Data=L'-';
					Current->Right->Data.Type=Operator;
					Data.AddLeft(Current->Right);
					Current->Right->Left->Data.Data=L'z'+1;
					Current->Right->Left->Data.Type=CharGroup;
					Data.AddRight(Current->Right);
					Current->Right->Right->Data.Data=(wchar_t)65535;
					Current->Right->Right->Data.Type=CharGroup;
				}
				++Expression;
			}
			else
			{
				SetErrorMessage(L"表达式非法结束,\\ 操作符非法连接右操作数");
				return 0;
			}
		}
		else if (Expression!=0 && Expression[0]==L'[')
		{
			++Expression;
			if (Expression==0 || Expression[0]==L'\0')
			{
				SetErrorMessage(L"表达式非法结束,[ 操作符缺少右操作数");
				return 0;
			}
			if (Expression!=0 && Expression[0]==L'^')
			{
				Current->Data.Data=Expression[0];
				Current->Data.Type=Operator;
				Current=Data.AddLeft(Current);
				++Expression;
				Current=GetE(Current);
				if (IsError())
					return 0;
				else
				{
					Base->Left=Current;
					Base->Right=0;
				}
			}
			else
			{
				Current=GetE(Current);
				if (IsError())
					return 0;
				else Base=Current;
			}
			if (Expression==0 || Expression[0]!=L']')
			{
				SetErrorMessage(L"表达式非法结束,缺少 ]");
				return 0;
			}
			++Expression;
		}
		else
		{
			Current->Data.Data=Expression[0];
			Current->Data.Type=Char;
			++Expression;
		}
		return Base;
	}
}


// E = EF
// E = F

TreeNode<CharType>* GrammarTree::GetE(TreeNode<CharType>* Current)
{
	if (IsError())
		return 0;
	else
	{
		TreeNode<CharType>* Base=Current;
		Current=GetF(Current);
		if (IsError())
			return 0;
		else
		{
			Base=Current;
			if (Expression[0]==L'|' || Expression[0]==L'+' || Expression[0]==L'*' || Expression[0]==L'?')
			{
				SetErrorMessage(L"表达式[]中不可出现 "+LytWString(Expression[0]));
				return 0;
			}
			while (Expression!=0 && Expression[0]!=L'\0' && Expression[0]!=L')' && Expression[0]!=L']')
			{
				Current=Data.MoveLeft(Base);
				Base=Current;
				Current->Data.Data=L'|';
				Current->Data.Type=Operator;
				Current=Data.AddRight(Current);
				Current=GetF(Current);
			}
		}
		return Base;
	}
}


// F = char '-' char
// F = char
// F = '\' char

TreeNode<CharType>* GrammarTree::GetF(TreeNode<CharType>* Current)
{
	if (IsError())
		return 0;
	else
	{
		TreeNode<CharType>* Base=Current;
		if (Expression[0]==L'\\')
		{
			++Expression;
			if (Expression==0 || Expression[0]==L'\0')
			{
				SetErrorMessage(L"表达式非法结束,\\ 操作符缺少右操作数");
				return 0;
			}
			if (Expression[0]==L'\\' || Expression[0]==L'+' || Expression[0]==L'*' || Expression[0]==L'?' || Expression[0]==L'(' || Expression[0]==L')' || Expression[0]==L'[' || Expression[0]==L']' || Expression[0]==L'^' || Expression[0]==L'-')
			{
				Current->Data.Data=Expression[0];
				Current->Data.Type=Char;
				++Expression;
			}
			else if (Expression[0]==L'r' || Expression[0]==L'n' || Expression[0]==L't')
			{
				Current->Data.Data=Expression[0];
				Current->Data.Type=Transferred;
				++Expression;
			}
			else if (Expression[0]==L'w' || Expression[0]==L'd' || Expression[0]==L'l' || Expression[0]==L'W' || Expression[0]==L'D' || Expression[0]==L'L')
			{
				if (Expression[0]==L'w')
				{
					Current->Data.Data=L'|';
					Current->Data.Type=Operator;
	
					Data.AddLeft(Current);
					Current->Left->Data.Data=L'|';
					Current->Left->Data.Type=Operator;
					Data.AddRight(Current);
					Current->Right->Data.Data=L'_';
					Current->Right->Data.Type=Char;
	
					Current=Current->Left;
					Data.AddLeft(Current);
					Current->Left->Data.Data=L'|';
					Current->Left->Data.Type=Operator;
					Data.AddRight(Current);
					Current->Right->Data.Data=L'-';
					Current->Right->Data.Type=Operator;
					Data.AddLeft(Current->Right);
					Current->Right->Left->Data.Data=L'0';
					Current->Right->Left->Data.Type=CharGroup;
					Data.AddRight(Current->Right);
					Current->Right->Right->Data.Data=L'9';
					Current->Right->Right->Data.Type=CharGroup;

					Current=Current->Left;
					Data.AddLeft(Current);
					Current->Left->Data.Data=L'-';
					Current->Left->Data.Type=Operator;
					Data.AddLeft(Current->Left);
					Current->Left->Left->Data.Data=L'A';
					Current->Left->Left->Data.Type=CharGroup;
					Data.AddRight(Current->Left);
					Current->Left->Right->Data.Data=L'Z';
					Current->Left->Right->Data.Type=CharGroup;
					Data.AddRight(Current);
					Current->Right->Data.Data=L'-';
					Current->Right->Data.Type=Operator;
					Data.AddLeft(Current->Right);
					Current->Right->Left->Data.Data=L'a';
					Current->Right->Left->Data.Type=CharGroup;
					Data.AddRight(Current->Right);
					Current->Right->Right->Data.Data=L'z';
					Current->Right->Right->Data.Type=CharGroup;
				}
				else if (Expression[0]==L'd')
				{
					Current->Data.Data=L'-';
					Current->Data.Type=Operator;

					Data.AddLeft(Current);
					Current->Left->Data.Data=L'0';
					Current->Left->Data.Type=CharGroup;
					Data.AddRight(Current);
					Current->Right->Data.Data=L'9';
					Current->Right->Data.Type=CharGroup;
				}
				else if (Expression[0]==L'l')
				{
					Current->Data.Data=L'|';
					Current->Data.Type=Operator;

					Data.AddLeft(Current);
					Current->Left->Data.Data=L'-';
					Current->Left->Data.Type=Operator;
					Data.AddLeft(Current->Left);
					Current->Left->Left->Data.Data=L'A';
					Current->Left->Left->Data.Type=CharGroup;
					Data.AddRight(Current->Left);
					Current->Left->Right->Data.Data=L'Z';
					Current->Left->Right->Data.Type=CharGroup;
					Data.AddRight(Current);
					Current->Right->Data.Data=L'-';
					Current->Right->Data.Type=Operator;
					Data.AddLeft(Current->Right);
					Current->Right->Left->Data.Data=L'a';
					Current->Right->Left->Data.Type=CharGroup;
					Data.AddRight(Current->Right);
					Current->Right->Right->Data.Data=L'z';
					Current->Right->Right->Data.Type=CharGroup;
				}
				else if (Expression[0]==L'W')
				{
					Current->Data.Data=L'|';
					Current->Data.Type=Operator;

					Data.AddLeft(Current);
					Current->Left->Data.Data=L'|';
					Current->Left->Data.Type=Operator;
					Data.AddRight(Current);
					Current->Right->Data.Data=L'-';
					Current->Right->Data.Type=Operator;
					Data.AddLeft(Current->Right);
					Current->Right->Left->Data.Data=(wchar_t)0;
					Current->Right->Left->Data.Type=CharGroup;
					Data.AddRight(Current->Right);
					Current->Right->Right->Data.Data=L'0'-1;
					Current->Right->Right->Data.Type=CharGroup;

					Current=Current->Left;
					Data.AddLeft(Current);
					Current->Left->Data.Data=L'|';
					Current->Left->Data.Type=Operator;
					Data.AddRight(Current);
					Current->Right->Data.Data=L'-';
					Current->Right->Data.Type=Operator;
					Data.AddLeft(Current->Right);
					Current->Right->Left->Data.Data=L'9'+1;
					Current->Right->Left->Data.Type=CharGroup;
					Data.AddRight(Current->Right);
					Current->Right->Right->Data.Data=L'A'-1;
					Current->Right->Right->Data.Type=CharGroup;

					Current=Current->Left;
					Data.AddLeft(Current);
					Current->Left->Data.Data=L'|';
					Current->Left->Data.Type=Operator;
					Data.AddRight(Current);
					Current->Right->Data.Data=L'-';
					Current->Right->Data.Type=Operator;
					Data.AddLeft(Current->Right);
					Current->Right->Left->Data.Data=L'Z'+1;
					Current->Right->Left->Data.Type=CharGroup;
					Data.AddRight(Current->Right);
					Current->Right->Right->Data.Data=L'_'-1;
					Current->Right->Right->Data.Type=CharGroup;

					Current=Current->Left;
					Data.AddLeft(Current);
					Current->Left->Data.Data=L'-';
					Current->Left->Data.Type=Operator;
					Data.AddLeft(Current->Left);
					Current->Left->Left->Data.Data=L'z'+1;
					Current->Left->Left->Data.Type=CharGroup;
					Data.AddRight(Current->Left);
					Current->Left->Right->Data.Data=(wchar_t)65535;
					Current->Left->Right->Data.Type=CharGroup;
					Data.AddRight(Current);
					Current->Right->Data.Data=L'-';
					Current->Right->Data.Type=Operator;
					Data.AddLeft(Current->Right);
					Current->Right->Left->Data.Data=L'_'+1;
					Current->Right->Left->Data.Type=CharGroup;
					Data.AddRight(Current->Right);
					Current->Right->Right->Data.Data=L'a'-1;
					Current->Right->Right->Data.Type=CharGroup;
				}
				else if (Expression[0]==L'D')
				{
					Current->Data.Data=L'|';
					Current->Data.Type=Operator;

					Data.AddLeft(Current);
					Current->Left->Data.Data=L'-';
					Current->Left->Data.Type=Operator;
					Data.AddLeft(Current->Left);
					Current->Left->Left->Data.Data=(wchar_t)0;
					Current->Left->Left->Data.Type=CharGroup;
					Data.AddRight(Current->Left);
					Current->Left->Right->Data.Data=L'0'-1;
					Current->Left->Right->Data.Type=CharGroup;
					Data.AddRight(Current);
					Current->Right->Data.Data=L'-';
					Current->Right->Data.Type=Operator;
					Data.AddLeft(Current->Right);
					Current->Right->Left->Data.Data=L'9'+1;
					Current->Right->Left->Data.Type=CharGroup;
					Data.AddRight(Current->Right);
					Current->Right->Right->Data.Data=(wchar_t)65535;
					Current->Right->Right->Data.Type=CharGroup;
				}
				else if (Expression[0]==L'L')
				{
					Current->Data.Data=L'|';
					Current->Data.Type=Operator;

					Data.AddLeft(Current);
					Current->Left->Data.Data=L'|';
					Current->Left->Data.Type=Operator;
					Data.AddRight(Current);
					Current->Right->Data.Data=L'-';
					Current->Right->Data.Type=Operator;
					Data.AddLeft(Current->Right);
					Current->Right->Left->Data.Data=(wchar_t)0;
					Current->Right->Left->Data.Type=CharGroup;
					Data.AddRight(Current->Right);
					Current->Right->Right->Data.Data=L'A'-1;
					Current->Right->Right->Data.Type=CharGroup;

					Current=Current->Left;
					Data.AddLeft(Current);
					Current->Left->Data.Data=L'-';
					Current->Left->Data.Type=Operator;
					Data.AddLeft(Current->Left);
					Current->Left->Left->Data.Data=L'Z'+1;
					Current->Left->Left->Data.Type=CharGroup;
					Data.AddRight(Current->Left);
					Current->Left->Right->Data.Data=L'a'-1;
					Current->Left->Right->Data.Type=CharGroup;
					Data.AddRight(Current);
					Current->Right->Data.Data=L'-';
					Current->Right->Data.Type=Operator;
					Data.AddLeft(Current->Right);
					Current->Right->Left->Data.Data=L'z'+1;
					Current->Right->Left->Data.Type=CharGroup;
					Data.AddRight(Current->Right);
					Current->Right->Right->Data.Data=(wchar_t)65535;
					Current->Right->Right->Data.Type=CharGroup;
				}
				++Expression;
			}
			else
			{
				SetErrorMessage(L"表达式非法结束,\\ 操作符非法连接右操作数");
				return 0;
			}
		}
		else
		{
			Current->Data.Data=Expression[0];
			Current->Data.Type=Char;
			++Expression;
			if (Expression!=0 && Expression[0]==L'-')///////////////////////////////////////
			{
				++Expression;
				if (Expression==0 || Expression[0]==L'\0')
				{
					SetErrorMessage(L"表达式非法结束,- 操作符缺少右操作数");
					return 0;
				}
				Current->Data.Type=CharGroup;
				--Expression;
				Current=Data.MoveLeft(Current);
				Base=Current;
				Current->Data.Data=Expression[0];
				Current->Data.Type=Operator;
				++Expression;
				if (Expression[0]<=Current->Left->Data.Data)
				{
					SetErrorMessage(L"表达式非法结束,- 中左操作数不小于右操作数");
					return 0;
				}
				Current=Data.AddRight(Current);
				Current->Data.Data=Expression[0];
				Current->Data.Type=CharGroup;
				++Expression;
			}
		}
		return Base;
	}
}

⌨️ 快捷键说明

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