所以我需要一个递归函数,它在找到一对匹配的括号时返回 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/