[FONT=Courier New]int nValue = [/FONT]
[FONT=Courier New]#define pi [COLOR=blue]3.14[/COLOR] [/FONT]
[FONT=Courier New](int)pi;[/FONT]
Директивы и их обработка
выносить обработки директив препроцессора в отдельный проход компилятора и формировать исходный файл для следующего этапа компиляции - лексического разбора, или просто засунуть обработку директив в лексический анализ. Просто хочу свести весь процесс компиляции к одному проходу. И ещё мне интересен следующий момент, пусть есть код:
Код:
Вылезет ошибка? или же препроцессор уберёт директиву и заменит pi на число, получив следующую конструкцию: [FONT=Courier New]int nValue=(int)3.14[/FONT]; я к чему этот, вопрос...то есть получается препроцессор перебирает весь входной поток, встречает символ # и уже анализирует то что после него до символа конца строки или всё же производит простейший лексический разбор всего исходного кода (т.е. формирует лексемы), т.к. ведь он должен определить, что лексему pi следует заменить на лексему 3.14.
ну где же знатоки системного программирования??
сохраняем код:
Код:
int nValue =
#define pi 3.14
(int)pi;
#define pi 3.14
(int)pi;
в файл cpp.cpp
набираем:
cpp32 cpp.cpp
получаем:
Код:
/* cpp.cpp 1: */int nValue =
/* cpp.cpp 2: */
/* cpp.cpp 3: */(int)3.14;
/* cpp.cpp 4: */
/* cpp.cpp 2: */
/* cpp.cpp 3: */(int)3.14;
/* cpp.cpp 4: */
Можно просто направить выход препроцессора на вход лексическому анализатору, без создания промежуточного файла.
Да оно и понятно, только один фиг препроцессор должен реализовывать простой лексический разбор. Но тогда получается, что будет два обхода исходного кода, т.к. препроцессор не генерирует лексемы и не группирует их в токены. Мне просто интересно, какой из этих подходов лучше. Лично я склоняюсь к компиляции за один проход.
Цитата: 3A3-968M
Да оно и понятно, только один фиг препроцессор должен реализовывать простой лексический разбор. Но тогда получается, что будет два обхода исходного кода, т.к. препроцессор не генерирует лексемы и не группирует их в токены. Мне просто интересно, какой из этих подходов лучше. Лично я склоняюсь к компиляции за один проход.
Думаю, чем проще - тем лучше. Проще всего будет 2 прохода с разбором.
Но я пробовал делать так: препроцессор занимается разбиением входного текста на лексемы. Чего-то он там делает (подставляет макроопределения например) и результат в виде потока лексем подаёт на вход компилятору.