修复了运算符优先级的bug

main
PeterAlbus 3 years ago
parent 00b817ff04
commit 16f9c3e0ef

@ -6,7 +6,29 @@ c++实现的正则表达式识别器。包含正则转换NFA和NFA转换DFA过
## 注意事项 ## 注意事项
+ 时间原因,正则表达式不支持转移符号,也不支持 . 来表示全体字符。因此该程序不支持对 | ( ) +等字符的识别。 + 时间原因,正则表达式不支持转移符号,也不支持 . 来表示全体字符。因此该程序不支持对 | ( ) +等字符的识别。
+ 设计原因,正则表达式中或的优先级高于连接符,如果需要表示 aa|bb需要使用(aa)|(bb)的形式
+ 使用时若需表示空串,使用`替代,因此本程序不支持对该字符的识别 + 使用时若需表示空串,使用`替代,因此本程序不支持对该字符的识别
正则表达式示例:(a|b)*bb(((>|<)(=|`))|((!|=)=))1
## 程序运行示例
+ 正规式r(a|b)*bb((>|<)(=|$\epsilon$)|(!|=)=)1
+ 运行编写的程序输入正规式生成NFA初态为第一行
![image-20220408075822086](https://file.peteralbus.com/assets/blog/imgs/blogimg/image-20220408075822086.png)
+ 程序将生成的NFA转换为DFA
![image-20220408075900260](https://file.peteralbus.com/assets/blog/imgs/blogimg/image-20220408075900260.png)
+ 对DFA进行化简并输出终态集合和支持输入的字符
![image-20220408080001436](https://file.peteralbus.com/assets/blog/imgs/blogimg/image-20220408080001436.png)
+ 读取txt文件内的内容作为输入进行识别测试
![image-20220408080106552](https://file.peteralbus.com/assets/blog/imgs/blogimg/image-20220408080106552.png)
+ 识别结果符合预期,自动机生成成功。
![image-20220408080147909](https://file.peteralbus.com/assets/blog/imgs/blogimg/image-20220408080147909.png)

Binary file not shown.

@ -57,11 +57,6 @@ public:
} }
return ptr; return ptr;
} }
NFANode* next()
{
auto itr=nextMap.begin();
return *(itr->second.begin());
}
map<char,set<NFANode*>> getNextMap() map<char,set<NFANode*>> getNextMap()
{ {
return nextMap; return nextMap;
@ -107,10 +102,19 @@ public:
for(int i=0;i<regex.length();i++) for(int i=0;i<regex.length();i++)
{ {
char c=regex[i]; char c=regex[i];
if(c=='('||c=='+'||c=='|') if(c=='(')
{ {
operatorStack.push(c); operatorStack.push(c);
} }
else if(c=='+'||c=='|')
{
while(!operatorStack.empty()&&operatorStack.top()=='~')
{
operatorStack.pop();
calculate('~');
}
operatorStack.push(c);
}
else if(c=='*') else if(c=='*')
{ {
NFANode* node=nfaMapStack.top(); NFANode* node=nfaMapStack.top();
@ -185,7 +189,7 @@ public:
list<NFANode*> outputList; list<NFANode*> outputList;
outputList.push_back(nfaMapStack.top()); outputList.push_back(nfaMapStack.top());
outedStateSet.insert(nfaMapStack.top()->getState()); outedStateSet.insert(nfaMapStack.top()->getState());
while(!outputList.empty()) while(!outputList.empty()&&outputList.front()!=nullptr)
{ {
NFANode* nfaNode=outputList.front(); NFANode* nfaNode=outputList.front();
outputList.pop_front(); outputList.pop_front();
@ -452,13 +456,14 @@ public:
} }
} }
} }
void match(const string& temp) void match(string& temp)
{ {
int currentState=0; int currentState=0;
for(char c:temp) for(char & c : temp)
{ {
if(c==';') if(c==';')
{ {
c = '\0';
break; break;
} }
if(c==' ') if(c==' ')
@ -469,11 +474,11 @@ public:
} }
if(endStates.count(currentState)) if(endStates.count(currentState))
{ {
cout<<temp<<"--yes"<<endl; cout<<setw(15)<<temp<<"--yes"<<endl;
} }
else else
{ {
cout<<temp<<"--no"<<endl; cout<<setw(15)<<temp<<"--no"<<endl;
} }
} }
}; };
@ -496,7 +501,6 @@ int main()
dfa.outputEndStates(); dfa.outputEndStates();
cout<<"supported char:"<<endl; cout<<"supported char:"<<endl;
dfa.outputCharSet(); dfa.outputCharSet();
while(true) while(true)
{ {
cout<<"please input string to test(input 'exit' to quit):"; cout<<"please input string to test(input 'exit' to quit):";

Loading…
Cancel
Save