Директива line

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Директива line

Сообщение Дож » 06.11.2012 15:28:32

Вот в C++ есть директива #line, которая позволяет изменить номер строки и имя файла для печати сообщений при ошибках компиляции. Это полезно при кодогенерации, чтобы компилятор печатал номер строки исходного файла, а не сгенерированного.

А есть ли нечто такое во Free Pascal?

Добавлено спустя 21 час 11 минут 4 секунды:
Я «залез под капот» и понял, что такой фичи в языке нет, но её относительно несложно добавить. Потребуется в scanner.pas добавить новую директиву, в tscannerfile.linebreak немного подправить алгоритм подсчёта номера строки, а имя указанного файла зарегистрировать в tinputfilemanager.register_file. Что делать с номером символа не совсем понятно, наверно, оставить как есть…

Дизайн директив видится таким:
Код: Выделить всё
{$FIXLINEINFO line_no "filename"} // фиксируем информацию, отключаем автоинкрементацию номера строки
{$CORRECTLINEINFO line_no "filename"} // меняем информацию, автоинкрементация не отключается
// filename в обоих дериктивах можно не указывать, будет автоматом подставлен текущий файл
{$CORRECTLINEINFO} // включает автоинкрементацию начиная со следующей строки


Таким образом, если одна строка псевдоязыка развернётся в несколько строк на паскале, то можно будет «схлопнуть» номера этих строк:
Код: Выделить всё
{$FIXLINEINFO 398 "foo.vasyapupkinlang"}
if A is TCircle then TCircle(A).Render else
if A is TRectangle then TRectangle(A).Render else
if A is TTeapot then TTeapot(A).Render else
{$CORRECTLINEINFO}
Writenl('ERROR: UNKNOWN CLASS A');


Ошибки как-то так:
Код: Выделить всё
foo.vasyapupkinlang(398,4) Error: Identifier not found "A"
foo.vasyapupkinlang(398,30) Error: Identifier not found "A"
foo.vasyapupkinlang(398,4) Error: Identifier not found "A"
foo.vasyapupkinlang(398,40) Error: Identifier not found "A"
foo.vasyapupkinlang(398,4) Error: Identifier not found "A"
foo.vasyapupkinlang(398,30) Error: Identifier not found "A"
foo.vasyapupkinlang(399,1) Error: Identifier not found "Writenl"


Кто-нибудь может мне подсказать, когда я это доделаю, то куда обращаться на тему добавления фичи в fpc?
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Директива line

Сообщение Дож » 08.11.2012 21:16:41

Подправил исходники, осуществил задуманное :D
Код: Выделить всё
[doj@korica ~/temp]$ cat li.pas
begin
{$FIXLINEINFO 56 'li.petya'}
    I;
    J;
    Q;
{$CORRECTLINEINFO 700}
    A;
    B;
    C;
{$CORRECTLINEINFO 900 'li.petya'}
    X;
{$FIXLINEINFO 900 'li.petya'}
    Y;
{$CORRECTLINEINFO 0 'li.petya'}
    K;
    L;
end;
[doj@korica ~/temp]$ fpc li.pas
li.petya(56,6) Error: Identifier not found "I"
li.petya(56,6) Error: Identifier not found "J"
li.petya(56,6) Error: Identifier not found "Q"
li.pas(700,6) Error: Identifier not found "A"
li.pas(701,6) Error: Identifier not found "B"
li.pas(702,6) Error: Identifier not found "C"
li.petya(900,6) Error: Identifier not found "X"
li.petya(900,6) Error: Identifier not found "Y"
li.petya(901,6) Error: Identifier not found "K"
li.petya(902,6) Error: Identifier not found "L"
li.petya(903,4) Fatal: Syntax error, "." expected but ";" found
Fatal: Compilation aborted
Error: /usr/local/bin/ppc386 returned an error exitcode (normal if you did not specify a source file to be compiled)


Дорогое сообщество, подскажите пожалуйста новичку как это вывести на обсуждение, как и кому сдать фичу на ревью, куда коммитить и прочее?
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Директива line

Сообщение Максим » 08.11.2012 23:35:38

Мне, честно говоря, не очень ясно, зачем всё это нужно в Паскале. Поэтому я рекомендовал бы обсудить эту фичу в списке рассылки fpc-devel.
Аватара пользователя
Максим
энтузиаст
 
Сообщения: 598
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Re: Директива line

Сообщение Дож » 09.11.2012 05:14:37

Мне, честно говоря, не очень ясно, зачем всё это нужно в Паскале.

При кодогенерации. Не я один использую m4, например.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9

Рейтинг@Mail.ru