Директива line

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

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

Ответить
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Директива line

Сообщение Дож »

Вот в 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?
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

Подправил исходники, осуществил задуманное :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)


Дорогое сообщество, подскажите пожалуйста новичку как это вывести на обсуждение, как и кому сдать фичу на ревью, куда коммитить и прочее?
Аватара пользователя
Максим
энтузиаст
Сообщения: 599
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Сообщение Максим »

Мне, честно говоря, не очень ясно, зачем всё это нужно в Паскале. Поэтому я рекомендовал бы обсудить эту фичу в списке рассылки fpc-devel.
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

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

При кодогенерации. Не я один использую m4, например.
Ответить