使用C ++中的PDA检查给定的字符串是否属于上下文无关文法

问题描述

我有一个非常简单的CFG:

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 (将#修改为@)