括号分析的递归函数

时间:2014-10-04 23:42:26

标签: 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;
}

2 个答案:

答案 0 :(得分:1)

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

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

不确定为什么你调用你的函数Round(),我称之为match_block()

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

所以嵌套点是FIRST(block) == (REST(block) == ),但如果我们在块中找到(,那么预测另一个,所以再次匹配。

如果不为您编写,我认为您理解递归就像:

void foo() {

    foo();

}

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

答案 1 :(得分:0)

为了简单起见,我建议解决 only 包含括号的输入问题。在伪代码中,解决方案看起来像这样:

如果我看到一个开放的paren        消耗它并递归匹配parens        如果我看到一个亲密的人            返回true        其他            返回错误

请注意,此解决方案首先匹配打开括号,然后然后查找匹配的右括号。将其与您编写的代码进行对比。我认为这是你挣扎的原因之一。

现在,如果您可以对此进行编码并使其仅适用于包含括号的输出,请参阅使用其他字符可以执行的操作。同样,你想要保持简单。例如,尝试使用输入字符'(',')'和''来解决问题。假设这些是唯一输入字符并相应地进行测试。

当你可以使用空格和括号时,它应该是一个简单的步骤,最终允许任何文本。