📄 grammartree.cpp
字号:
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 + -