微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?