Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Директивы и их обработка

273
14 марта 2007 года
3A3-968M
1.2K / / 22.12.2005
При написании компилятора наткнулся на следующую делему:
выносить обработки директив препроцессора в отдельный проход компилятора и формировать исходный файл для следующего этапа компиляции - лексического разбора, или просто засунуть обработку директив в лексический анализ. Просто хочу свести весь процесс компиляции к одному проходу. И ещё мне интересен следующий момент, пусть есть код:
 
Код:
[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.
273
16 марта 2007 года
3A3-968M
1.2K / / 22.12.2005
ну где же знатоки системного программирования??
2.4K
16 марта 2007 года
Lexogen
70 / / 18.05.2004
Гм... а что тут думать? Получить програмный код без директив препроцесора можна с помощью утилиты билдера cpp32. Вот пример:
сохраняем код:
 
Код:
int nValue =
#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: */
5
16 марта 2007 года
hardcase
4.5K / / 09.08.2005
К вопросу о проходах.
Можно просто направить выход препроцессора на вход лексическому анализатору, без создания промежуточного файла.
273
25 марта 2007 года
3A3-968M
1.2K / / 22.12.2005
Да оно и понятно, только один фиг препроцессор должен реализовывать простой лексический разбор. Но тогда получается, что будет два обхода исходного кода, т.к. препроцессор не генерирует лексемы и не группирует их в токены. Мне просто интересно, какой из этих подходов лучше. Лично я склоняюсь к компиляции за один проход.
5
26 марта 2007 года
hardcase
4.5K / / 09.08.2005
Цитата: 3A3-968M
Да оно и понятно, только один фиг препроцессор должен реализовывать простой лексический разбор. Но тогда получается, что будет два обхода исходного кода, т.к. препроцессор не генерирует лексемы и не группирует их в токены. Мне просто интересно, какой из этих подходов лучше. Лично я склоняюсь к компиляции за один проход.


Думаю, чем проще - тем лучше. Проще всего будет 2 прохода с разбором.

Но я пробовал делать так: препроцессор занимается разбиением входного текста на лексемы. Чего-то он там делает (подставляет макроопределения например) и результат в виде потока лексем подаёт на вход компилятору.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог