行号与模板工具包

时间:2009-12-07 04:59:03

标签: perl template-toolkit

我正在使用Perl Template Toolkit生成C文件。我非常希望能够在我的C代码中包含#line指令,以便来自C编译器的错误消息将我发送到正确的位置(模板文件)而不是错误的位置(模板输出)。但是,我不知道该怎么做。我从谷歌获得的唯一结果是在Template Toolkit邮件列表中没有回复的消息。

我可以想象一个折磨的解决方案,比如自己阅读模板文件并添加行号,但是有没有人有技巧甚至是一种明智的方法来获取模板工具包中原始文件的行号?

4 个答案:

答案 0 :(得分:2)

在我看来,像Template :: Parser的location方法返回一个合适的#line指令,但是我没有看到任何内置函数在输出中包含它。你必须扩展Template Toolkit才能实现它。

答案 1 :(得分:0)

由于#line指令中的数字和“文件名”完全组成(无论你想要什么), 我建议使用稍微不同的上下文将#line指令放在模板中。

您可以自己计算模板中的行数,即使使用模板预处理器也是如此。我会'发明'模板的不同部分的文件名,并用可以计算的小数字编号。

然后一条错误消息可能会说“......在div id ='topleft'的第2行”

答案 2 :(得分:0)

它看起来不像Template :: Toolkit本身支持这一点。您可以做的一件事是让您的程序还在适当的模板中将生成的行的映射写入其行中,以便您可以使用简单的脚本查看错误中的错误。

答案 3 :(得分:0)

蛮力解决方案:

#!/usr/local/bin/perl
use warnings;
use strict;
my $file = "something.c";
open my $input, "<", $file or die $!;
while (<$input>) {
    print "#line $. \"$file\"\n";
    print;
}
close $input or die $!;

更好的是,在该行上测试[%并仅在必要时打印#line