c++ - 括号分析的递归函数

标签 c++ file-io recursion

所以我需要一个递归函数,它在找到一对匹配的括号时返回 true。我设法做的是下面。当找到第一个括号时,从外部调用该函数。对于像 (TEXT) 这样的简单示例,它工作得很好,但我需要修改它,以便它可以使用嵌套大括号。类似于 (T(E)XT)。我就是不知道该怎么做。而且我一开始就不太擅长递归。而且我不能使用堆栈或队列或类似的东西。最聪明的 stackowerflow,你能帮帮我吗?

bool Round(ifstream &infile, char s)
{
    bool ret;
    if (s==')') 
    {
        cout<<s;
        return true;
    }
    if (s=='(')
    {
    //I DON'T KNOW WHAT SHOULD HAPPEN HERE
    }
    else 
    {

        cout<<s;
        infile>>s;
        ret=Round(infile,s);
    }
return ret;
}

最佳答案

递归下降解析的思想是将责任委托(delegate)给函数,每个函数都知道如何解析它们的语法部分,并且它们可以嵌套(即相互调用,或调用它们自己)。

在扫描的任何时候,如果流中的下一个字符是状态(N) 的FIRST 字符,则预测 状态(N),那你必须做什么?匹配状态(N)(解析或使用它)。

不确定您为什么将函数称为 Round(),我将其称为 match_block()

在该状态的匹配函数中,扫描字符,查找该状态的 REST,但也递归扫描任何其他合法嵌套状态的 FIRST 字符。在你的情况下它很简单,你可以期待空格,()

所以嵌套的重点是FIRST(block) == ( and REST(block) == ),但如果我们还在一个 block 中找到 (,则预测另一个 block ,因此再次匹配它。

无需为您编写它,我假设您了解递归非常简单:

void foo() {

    foo();

}

显然你不希望这样,它是无限递归的。但那是递归部分。逻辑是你已经知道的部分(如何匹配“括号”)

关于c++ - 括号分析的递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26198243/

相关文章:

c++ - shared_ptr 的隐式转换

c++ - 用于有序迭代、有序推送和移除的排序数据结构(仅从顶部开始的 N 个元素)

file-io - 在 Julia 1.0.0 中将大型数字输出保存到 native 文件

c++ - 递归 C++ 调用中的内存分配

algorithm - 能用递归解决的问题都能用循环解决吗?

algorithm - 用迭代代替递归

c++ - 访问一个类的成员。此类的对象从未实例化。所有成员都是静态类型

c++ - 如何构建应用程序框架

python - 将列表的字符串转换为列表类型对象

Python在读取文件时创建对象