2009-09-29 2 views
0

Я пишу демо-компилятор для языка программирования игрушек в C.Лексический анализ и Макросы

Что могут возникнуть проблемы, если мы делаем обработку макросов в виде отдельной фазы между чтением программы и лексический анализ?

+0

Не могли бы вы объяснить, пожалуйста? Предварительная обработка уже является отдельным шагом в соответствии со спецификацией ISO C, но она обязательно включает лексический анализ (по его собственным правилам, поскольку токеры препроцессора C строго не соответствуют обычным C-маркерам C). –

ответ

0

«Препроцессор» - это инструмент, который преобразует коды перед тем, как главный компилятор его удержит.

Это лексики препроцессора (и, возможно, анализирует) источник на его правила, выполняет некоторые преобразования и выводит результат. Основные компиляторы lexes и анализируют результат работы препроцессора в соответствии с его правилами (которые могут отличаться от правил, используемых препроцессором).

Так что, если препроцессор работает с нетривиальными изменениями в тексте программы, сложно предсказать конечный результат с первого взгляда. Это справедливо для c с c-препроцессором, но (или, может быть, , таким образом,), соглашение гласит, что вы должны использовать препроцессор только несколькими способами, которые имеют достаточно предсказуемые результаты. ( Я считаю, что препроцессор c полностью завершен, поэтому нет предела тому, что может быть достигнуто, если вы не сойдете с ума, чтобы его отладить. Подумав о комментарии Павла, я не признаю никаких циклов, не рекурсии, нет так как это убивает его. Спасибо. Вы все еще можете уйти от брандеров, пытающихся отлаживать достаточно продвинутую кучу макросов.)

+0

Препроцессор C не является полным. –

+0

Очевидно, препроцессор C - это что-то вроде автомата выталкивания. http://www.ioccc.org/2001/herrmann1.hint –

1

Как упоминалось выше, препроцессор C довольно ограничен, поскольку он выполняет только основные преобразования текста, из-за ограничения на его языке. С другой стороны, глядя на макросистему в Common Lisp, вы можете увидеть преимущество наличия встроенной макросистемы на основной язык, поскольку она позволяет использовать основные средства языка в макросе.

Простой пример

(defmacro ntimes (data n) 
    `(loop for i from 1 to ,n collecting ,data)) 

(print (ntimes 'a 10)) 

Result : (A A A A A A A A A A) 

Это преобразование будет сделано во время компиляции (один из хороших вещей источника является его собственного AST). Это то, что не могло быть сделано отдельным препроцессором (если только препроцессор не содержал копию компилятора!)

Смежные вопросы