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

Loading…
Cancel
Save