【问题标题】:Line numbers with template toolkit带有模板工具包的行号
【发布时间】:2010-12-23 21:28:03
【问题描述】:

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

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

【问题讨论】:

    标签: perl template-toolkit


    【解决方案1】:

    蛮力解决方案:

    #!/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 $!;
    

    更好的是,在线测试[%,只在必要时打印#lines。

    【讨论】:

      【解决方案2】:

      看起来 Template::Toolkit 本身并不支持这一点。您可以做的一件事是让您的程序也将生成的行映射到相应模板中的行,以便您可以使用简单的脚本查找错误。

      【讨论】:

      • 让 C-x ` 在生成的代码中跳转到您的错误,并映射另一个键来调用一个脚本,该脚本在您的行中查找相应的条目。你甚至可以在 Emacs 中创建一个特殊的条目来为你做这两件事。
      【解决方案3】:

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

      而不是自己计算模板中的行数,即使使用模板预处理器,您也可以这样做。我会为模板的不同部分“发明”文件名,并用你可以数出的小数字为这些行编号。

      然后错误消息可能会显示“... in line 2 of div id='topleft'”

      【讨论】:

        【解决方案4】:

        在我看来 Template::Parser 的 location 方法返回了一个合适的 #line 指令,但我没有看到任何内置函数将其包含在输出中。您必须扩展 Template Toolkit 才能做到这一点。

        【讨论】:

        • 我接受没有办法做到这一点,只需使用通过预处理器在任何地方添加行指令的蛮力方法。
        猜你喜欢
        • 2012-10-03
        • 2020-08-18
        • 2011-02-28
        • 2011-05-18
        • 2013-10-06
        • 2012-07-03
        • 1970-01-01
        • 2013-06-15
        • 2011-06-17
        相关资源
        最近更新 更多