Что такое магия за побегом (\) персонажа - PullRequest
5 голосов
/ 27 ноября 2008

Как компилятор C / C ++ манипулирует escape-символом ["\"] в исходном коде? Как написана грамматика компилятора для обработки этого символа? Что делает компилятор после обнаружения этого символа?

Ответы [ 4 ]

14 голосов
/ 27 ноября 2008

Большинство компиляторов разделены на части: интерфейс компилятора называется лексическим анализатором или сканером. Эта часть компилятора читает фактические символы и создает токены. Он имеет конечный автомат, который, увидев управляющий символ, решает, является ли он подлинным (например, когда он появляется внутри строки), или он изменяет следующий символ. Токен выводится соответственно как escape-символ или какой-либо другой токен (например, табуляция или новая строка) для следующей части компилятора ( анализатор ). Конечный автомат может сгруппировать несколько символов в токен.

5 голосов
/ 27 ноября 2008

Интересная заметка на эту тему: О доверии [PDF ссылка] .

В статье описан один способ, которым компилятор мог бы точно решить эту проблему, показано, как компилятор c-написано в c не имеет явного перевода кодов в значения ASCII; и как загрузить новый escape-код в компилятор так, чтобы понимание значения ASCII для нового кода также было неявным.

2 голосов
/ 27 ноября 2008

Обычно экранирует следующий символ:

  • В строковом литерале или символьном литерале это означает экранирование следующего символа. \a означает «предупреждение» (мигание терминала, звуковой сигнал или что-то еще), \n означает «перевод строки», \xNUM означает, например, шестнадцатеричное число.
  • Если он отображается как последний видимый символ перед новой строкой, независимо от того, находится ли он внутри строки или нет (и даже внутри комментария по всей строке!), Он действует как продолжение строки: следующий символ новой строки игнорируется, и следующая строка объединяется с текущей строкой.
1 голос
/ 27 ноября 2008

управляющий символ со следующим символом (например, \n) является одним символом для компилятора C - сканер представляет его анализатору как символьный токен, поэтому нет необходимости в специальных синтаксических правилах в анализаторе для управляющего символа.

...