Номера строк с набором шаблонов - PullRequest
5 голосов
/ 07 декабря 2009

Я использую Perl Template Toolkit для генерации C-файлов. Я очень хочу иметь возможность включать директивы #line в мой код C, чтобы сообщения об ошибках от компилятора C отправляли меня в правильное место (файл шаблона), а не в неправильное место (вывод шаблона). Однако я не знаю, как это сделать. Единственный результат, который я получил от Google, - это оставленное без ответа сообщение в списке рассылки Template Toolkit.

Я могу представить себе замученное решение, такое как собственное чтение файла шаблона и добавление номеров строк, но есть ли у кого-нибудь хитрость или даже разумный способ получения номеров строк исходного файла в Template Toolkit?

Ответы [ 4 ]

2 голосов
/ 07 декабря 2009

Мне кажется, что метод определения местоположения Template :: Parser возвращает подходящую директиву #line, но я не вижу встроенной функции, которая бы включала это в вывод. Чтобы сделать это, вам нужно расширить Template Toolkit.

0 голосов
/ 07 декабря 2009

Решение для перебора:

#!/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 s только при необходимости.

0 голосов
/ 07 декабря 2009

Не похоже, что Template :: Toolkit изначально поддерживает это. Одна вещь, которую вы могли бы сделать, это заставить вашу программу также записать сопоставление сгенерированных строк в их строки в соответствующем шаблоне, чтобы вы могли просматривать ошибки с помощью простого скрипта.

0 голосов
/ 07 декабря 2009

Поскольку число и «имя файла» полностью составлены (что вы хотите) в директиве #line, Я предлагаю помещать директивы #line в шаблон, используя немного другой контекст.

Вместо того, чтобы подсчитывать строки в шаблоне самостоятельно, что вы могли бы сделать, даже используя препроцессор шаблона. Я бы «придумал» имена файлов для разных разделов шаблона и количество строк с небольшими числами, которые вы можете сосчитать.

Тогда сообщение об ошибке может сказать «... в строке 2 div id = 'topleft'"

...