2012-06-17 3 views
3

Статья Уолтера Брайта о компиляции на C++ рассказывает об этих двух фразах:Каковы различные типы токенов в компиляции C++?

«Преобразование в маркеры предварительной обработки».
Что такое начальный токен? Как выглядит токен предварительной обработки?

«Преобразование токенов предварительной обработки в токены C++» Что это за C++-токен и почему он не был преобразован в него сначала?

Ссылка: http://www.drdobbs.com/blogs/cpp/228701711

ответ

4

Маркер предварительной обработки представляет собой элемент грамматики препроцессора. Из [lex.pptoken] в C++ стандарт:

предобработки-маркер:

  • заголовок имя-
  • идентификатор
  • рр номер
  • символ-буквал
  • определяемого пользователь символы-буквальный
  • строка-буквальный
  • определяемого пользователь строка-буквальный
  • предобработка-оп-или-Punc
  • друг без -белый пробел, который не может быть одним из вышеуказанных

...

Маркера предварительной обработки является минимальным лексическим элементом языка в фазах перевода с 3 по 6.

Таким образом, «преобразование в предварительных обработки маркеров» представляет собой процесс Lexing единицы трансляции и идентификации индивидуальные жетоны.

Значки C++ (действительно только «токены») указаны в [lex.Маркер]:

маркера:

  • идентификатор
  • ключевого слова
  • буквальным
  • оператор
  • punctuator

Они существуют только после того, как все другие фазы перевода произошли (макрорасширения и так далее).

Для получения дополнительной информации обо всем процессе, я предлагаю прочитать [lex.phases] в стандарте C++.

2

Проще объяснение.

И, вы знаете, многие компиляторы имеют процесс лексического анализа, где исходный код разделен на токены.

Этот исходный код:

void main() 
{ 
    int x = -3 - -5; 
    printf("Hello World"); 
} // void main() 

ли превратить во что-то похожее на это:

 
+--------------+------------------+ 
| TOKEN  | TEXT   | 
+--------------+------------------+ 
| void  | "void"   | 
+--------------+------------------+ 
| identifier | "main"   | 
+--------------+------------------+ 
| leftcurly | "{"    | 
+--------------+------------------+ 
| identifier | "int"   | 
+--------------+------------------+ 
| identifier | "x"    | 
+--------------+------------------+ 
| assign  | "="    | 
+--------------+------------------+ 
| minus  | "-"    | 
+--------------+------------------+ 
| integer  | "3"    | 
+--------------+------------------+ 
| minus  | "-"    | 
+--------------+------------------+ 
| minus  | "-"    | 
+--------------+------------------+ 
| integer  | "5"    | 
+--------------+------------------+ 
| semicolon | ";"    | 
+--------------+------------------+ 
| identifier | "printf"   | 
+--------------+------------------+ 
| leftpar  | "("    | 
+--------------+------------------+ 
| string  | "Hello World" | 
+--------------+------------------+ 
| rightpar | ")"    | 
+--------------+------------------+ 
| semicolon | ";"    | 
+--------------+------------------+ 
| rightcurly | "}"    | 
+--------------+------------------+ 
| comment  | "// void main()" | 
+--------------+------------------+ 

Каждая из этих частей текста под названием "жетоны", имеют смысл.


Иногда, в других частях процесса компиляции, маркеры могут быть заменены на anothers лексем:

 
+--------------+------------------+ 
| TOKEN  | TEXT   | 
+--------------+------------------+ 
| void  | "void"   | 
+--------------+------------------+ 
| functiondec | "main"   | 
+--------------+------------------+ 
| leftcurly | "{"    | 
+--------------+------------------+ 
| type  | "int"   | 
+--------------+------------------+ 
| variabledec | "x"    | 
+--------------+------------------+ 
| assign  | "="    | 
+--------------+------------------+ 
| negative | "-"    | 
+--------------+------------------+ 
| integer  | "3"    | 
+--------------+------------------+ 
| substract | "-"    | 
+--------------+------------------+ 
| negative | "-"    | 
+--------------+------------------+ 
| integer  | "5"    | 
+--------------+------------------+ 
| semicolon | ";"    | 
+--------------+------------------+ 
| functioncall | "printf"   | 
+--------------+------------------+ 
| leftpar  | "("    | 
+--------------+------------------+ 
| string  | "Hello World" | 
+--------------+------------------+ 
| rightpar | ")"    | 
+--------------+------------------+ 
| semicolon | ";"    | 
+--------------+------------------+ 
| rightcurly | "}"    | 
+--------------+------------------+ 
| comment  | "// void main()" | 
+--------------+------------------+ 

Переход от "минус" знак, чтобы, как «отрицательный sign token ", &" токен подделки ", является очень хорошим примером этого« токена препроцесса »для« финального токена ».

Это очень концептуальное объяснение. Вы можете прочитать более подробную техническую информацию о своей конкретной документации компилятора.

Cheers

+0

Спасибо за это. Я бы ожидал некоторых примеров препроцессора, но это тоже здорово. – unj2

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