- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个递归下降解析器,我有两个构建列表的规则:
ValueList -> TOKEN_IDENTIFER TOKEN_QUOTE ValueListP
ValueListP -> ValueList
| %EPSILON%
现在我知道您可以轻松地将这两个规则优化为带有循环的单个规则,但我也知道编译器可以并且将会在它看到它的地方执行尾调用优化。这是我当前的代码:
void Parser::grammarValueList( std::deque<std::unique_ptr<ValueNode>>& arg1 )
{
std::string var1 = m_currentToken.getValue().string;
if( acceptToken( Token::Type::TOKEN_IDENTIFIER ) )
{
std::string var2 = m_currentToken.getValue().string;
if( acceptToken( Token::Type::TOKEN_QUOTE ) )
{
arg1.push_back( std::unique_ptr<ValueNode>( new ValueNode( var1, var2 ) ) );
if( peekValueListP() )
{
return grammarValueListP( arg1 );
}
}
}
throw ParseException( "Error: did not expect \"" + m_currentToken.toString() + "\"" );
}
void Parser::grammarValueListP( std::deque<std::unique_ptr<ValueNode>>& arg1 )
{
if( peekValueList() )
{
return grammarValueList( arg1 );
}
else
{
return;
}
throw ParseException( "Error: did not expect \"" + m_currentToken.toString() + "\"" );
}
所以我有两个问题:
1) 我提供的代码是否利用尾调用优化?
2) 即使一段代码确实利用了尾调用优化,作为程序员,我们是否应该在微不足道的情况下尝试自己进行优化(删除递归并用循环代替)?
最佳答案
不,grammarValueList
不执行尾调用。
问题是有两个 std::string
类型的局部变量,它们有一个非平凡的析构函数。这些析构函数必须在方法返回之前调用,也就是在调用 grammarValueListP
之后。所以对 grammarValueListP
的调用不在尾部位置。
当然,可以访问析构函数定义的优化器可能会发现可以过早地析构 var1
和 var2
而不会改变函数的可见行为(假设这是可能的;它部分取决于 ValueNode
构造函数内部发生的情况)。但我不相信大多数 C++ 实现会努力优化尾调用。
就我个人而言,我会使用循环,因为即使您设法消除了析构函数调用,编译器仍有可能找不到 TCO。从这个看似简单的示例中可以看出,C++ 中的尾调用通常并不像表面上看起来那么微不足道,而且说服优化器产生尾调用可能出奇地困难。
关于c++ - 自顶向下递归下降解析 : Relying on tail call optimization,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47480501/
我有一个日志文件,想要创建一个网页(可能是Python,但不是严格意义上),该网页的工作方式类似于Unix的“tail -f filename”命令的工作方式(将新的日志行写入文件时显示)。 这样,该
当我为日志文件运行 tail -f 时,logrotate 旋转它但 tail -f 没有停止。它继续在新文件中显示日志。之后我手动尝试; mv my.log my.log.2 touch my.lo
您将如何在 bash 中实现这一点。这是我在面试中被问到的一个问题,我可以想到高级语言的答案,而不是 shell。 据我了解,tail 的真正实现是查找文件末尾,然后向后读取。 最佳答案 主要思想是保
例如: NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"hello: (.*)ABC"
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
为什么我不能tail tail 的结果?我可以调用head在序列 tail返回(和其他变体),但 tail在 tail不起作用(在 2017.10 中): > my $list = ; (a b c
A previous question如何讨论 Haskell 表达式的类型 ap zip tail可以翻译成\x -> zip x (tail x)的类型.这很有启发性,但是那里的问题和答案都没有涉
因为我试图保持容器运行,所以我在 docker compose 文件中将“tail -f/dev/null”指定为 command: version: '2' services: serviceN
以下是为拖尾“n”行文件编写的代码。 import java.io.RandomAccessFile; import java.util.HashMap; import java.util.Map
我有一个递归方案样式结构,我想获得所有子结构的列表,包括完整结构 - 即相当于 tails函数在 List 上执行.我认为可以通过调用 para 来实现这一点。 ,在每一步映射回原始结构,然后分别将原
编辑 这是一个 JSFiddle,其中注释掉了“tail”函数的代码。 Solar System JSFiddle 我有一个我正在研究的物体,它有一个围绕中心质量运行的物体。这非常有效。 我现在正尝试
我想跟踪一个文件,但 tail -f 始终从最后 10 行开始。有没有办法输出整个文件然后遵循? 我的目标是查找日志中出现的所有字符串,例如 tail -f Streaming_log | grep“
我试图在我的循环单向链表中将两端连接在一起。在文件名 file.txt 中,包含 ABCDEFGHIJKLMNOPQRSTUVWXYZ 作为文本,我能够分别打印出头部和尾部 A 和 Z。但是,我希望
我目前遇到命令问题 while sleep 0.3; do echo "1"; done | tail -n +3 | grep --line-buffered "1" 我想要一个看起来像这样的输出:
所以我想稍微了解一下 Linux 脚本,并从书中的一个简单示例开始。在这本书中,作者要我从 snort.conf 中获取“第 6 步:配置输出插件”之前的五行。 类似于作者,我确定了我想要的行的位置,
我想跟踪一个将不间断写入的日志文件,问题是在我的脚本中我不想指定行数或字节数等。要跟踪,我想在我的脚本中指定每次跟踪之前未跟踪的最后一行。我怎样才能在我的脚本中做到这一点?谢谢 最佳答案 我认为 20
Problem: Program to read the lines from infinite stream starting from its end of file. #解决方案: import
我想安装 Linux Tails。我已经将 ppa:tails-team/tails-installer 添加到我的源中,但是当我的 Ubuntu 软件中心尝试下载存储库信息时,我收到此错误: W:F
读取记录时间序列数据的 1 GB 文件并生成包含两列(一列时间,另一列数字)的实时图表的最佳方法是什么?我看到您有不同的方式来调整文件。 最佳答案 对于 RRDTool 来说听起来不错. 但如果您想坚
需要监视日志文件中的特定字符串“Server running at http”。在日志文件中找到该字符串后,我需要停止检查并想继续其余代码。 目前我正在使用 "tail -f my-file.log
我是一名优秀的程序员,十分优秀!