📄 rule.h
字号:
#include <iostream>
#include <cctype>
using namespace std;
#include <string.h>
#include<windows.h>
int table[26];
int table2[26];
int islid=1;
char iden;
int del1;
struct Rright
{
public:
char letter;//右部规则的一个字符
char id;//该符号是否被标记
Rright* nextletter;//指向下个字符
Rright(){nextletter=NULL;letter='\0';}
};
class Rule
{
public:
Rright* right;
Rright* tempr;
Rright* pre;
char temp;
char trule[255];
Rright* head;
char left;//规则左部
int a;//表示是几型正则文法.
int lid;//左部是否被标记 0为没标记,1为标记
int lid2;
int lid3;
int spilth;//标记规则是否多余 0为不多余,1为多余
Rule();
void inputr();
void outputr();
void isspilth();//设置该规则是否多余
void isspilth2();
void isspilth3();
void sign(char idn);
void sign21();
void sign22();
void dgz();
bool isrg();//是否是正则文法
};
Rule::Rule()
{
left='\0';lid=0;spilth=0;right=new(Rright);
head=right;tempr=head;lid2=0;lid3=1;del1=0;
}
void Rule::inputr()
{
cout<<"-----------------------------------------------"<<endl;
lab1:cout<<"请输入规则的左部:";
cin>>left;
while (cin.get()!='\n')
continue;
if (isalpha(left)!=1)
{cout<<"输入非大写字母,请重新输入!\n";
goto lab1;}
cout<<"请输入规则的右部:";
while (((right->letter=cin.get())!='\n'))
{
{right->nextletter=new(Rright);
pre=right;
right=right->nextletter;}
}
pre->nextletter=NULL;
cout<<"-----------------------------------------------"<<endl;
}
void Rule::outputr()
{
cout<<" "<<left<<"::=";
tempr=head;
do
{
cout<<tempr->letter;
}while ((tempr=tempr->nextletter)!=NULL);
cout<<endl;
tempr=head;
}
void Rule::isspilth()
{
if (lid==0&&spilth==0)
{spilth=1;del1+=1;}
}
void Rule::isspilth2()
{
if (lid2==0&&spilth==0)
{spilth=1;del1+=1;}
}
void Rule::isspilth3()
{
if (lid3==0&&spilth==0)
{spilth=1;del1+=1;}
}
void Rule::sign(char idn)
{
if (table[left-65]==1)
{lid=1;}
else if (left==idn)
{lid=1;}
if (lid==1)
{
while (tempr!=NULL)
{
if (tempr->letter>=65&&tempr->letter<=90)
{
table[tempr->letter-65]=1;
islid=1;
}
tempr=tempr->nextletter;
}
}
}
void Rule::sign21()
{
tempr=head;
if ((tempr->letter<65||tempr->letter>90)&&tempr->nextletter==NULL)
{
lid2=1;table2[left-65]=1;islid=1;
}
}
void Rule::sign22()
{
int t=1;
tempr=head;
while (tempr!=NULL)
{
if ((tempr->letter>=65&&tempr->letter<=90)&&table2[tempr->letter-65]!=1)
t=0;
tempr=tempr->nextletter;
}
if (t==1)
{lid2=1;table2[left-65]=1;islid=1;}
}
void Rule::dgz()
{
int t=1;
tempr=head;
while (tempr!=NULL)
{
if (tempr->letter!=left)
t=0;
tempr=tempr->nextletter;
}
tempr=head;
if (t==1)
lid3=0;
}
bool Rule::isrg()
{
tempr=head;
if ((head->letter<'A'||head->letter>'Z')&&head->nextletter==NULL)
{
return true;
}//U::=u的情况.
else
{
if (tempr->letter>='A'&&tempr->letter<='Z')
if (tempr->nextletter!=NULL)
{
if((tempr->nextletter->letter<'A'||tempr->nextletter->letter>'Z')&&tempr->nextletter->nextletter==NULL)
{return true;}
else return false;
}
else return false;
}
return false;
//U::=Uu的情况.
}
void SetColor()
{
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon,FOREGROUND_RED);
};
void SetColor2()
{
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon,FOREGROUND_GREEN);
}
void SetColorde()
{
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon,FOREGROUND_INTENSITY);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -