Парсерное восхитительное
Знающие язык Си, подумайте, что будет, если написать
#define FOO 1 // comment \
#define BAR 2
int baz() { return FOO + BAR; }Естественно, после препроцессора получится int baz() { return 1 + BAR; }потому что слияние строк через \ в конце строки всегда и везде выигрывает у комментария до конца строки, т.е. исходный текст эквивалентен#define FOO 1 // comment #define BAR 2
int baz() { return FOO + BAR; }А теперь - дискотека!
Есть язык Верилог с очень похожим на Си синтаксисом команд препроцессора (отличается тем, что вместо # пишется гравис (`) и нужно писать гравис перед именами макросов), с продолжением строк с помощью \, с идентичным Си синтаксисом комментариев (есть точно такие же комментарии до конца строки, записываемые через //, и многострочные с помощью /* и */), но с совершенно вычурной семантикой сочетания комментария и продолжения строк. В терминах Си это выглядело бы так:
#define ONE 1 // comment \
#define TWO 2
#define SUM 3 + // comment \
4
int foo() { return ONE + TWO + SUM; }
И это компилируется и работает, возвращая 10 (на первый взгляд кажется, что // попросту выигрывает у \, но это не так). Попробуйте объяснить на человеческом языке, как это должно работать, и реализовать препроцессор, который бы это обеспечивал. :)
Для вериложцев:
`define ONE 1 // comment \ `define TWO 2 `define SUM 3+ // comment \ 4 module foo; initial $display(`ONE + `TWO + `SUM); endmodule