问题描述
S -> aaaaaa X
S -> bbbbbb X
S ->抄送 S 抄送
S -> X
X ->ε
我必须实现一个类似于PDA的简单程序,以检查给定的字符串是否属于此语法。想法是将已解析的字母存储在堆栈中,然后检查堆栈顶部的内容以及下一个字母是什么。
我遇到了一个问题,因为似乎无法正确识别字符串的空终止,所以它永远不会进入情况3。
#include <iostream>
#include <map>
#include <stack>
enum Symbols
{
TS_A,// a 1
NTS_S,// S 2
NTS_X,// X 3
TS_EPSILON,// 4
TS_INVALID,// 5
};
Symbols lexer(char c)
{
switch (c)
{
case 'a':
return TS_A;
case '\0':
return TS_EPSILON;
default:
return TS_INVALID;
}
}
bool check(std::string expression)
{
using namespace std;
map<Symbols,map<Symbols,int> > table;
stack<Symbols> ss;
bool flag;
ss.push(NTS_S);
table[NTS_S][TS_A] = 1; // S -> aaaaaaX
table[TS_A][TS_A] = 2;
table[NTS_X][TS_EPSILON] = 3; // X -> ε
while(ss.size() > 0) {
for (char &c : expression)
{
switch (table[ss.top()][lexer(c)])
{
case 1:
ss.pop();
ss.push(NTS_X);
ss.push(TS_A);
ss.push(TS_A);
ss.push(TS_A);
ss.push(TS_A);
ss.push(TS_A);
ss.push(TS_A);
break;
case 2:
ss.pop();
break;
case 3:
ss.pop();
flag = true;
break;
default:
return false;
break;
}
}
}
return flag;
}
int main()
{
std::string expression;
expression = "aaaaaa";
std::string solution = check(expression) ? "CORRECT" : "INCORRECT";
std::cout << solution << std::endl;
};
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)