Что за Магия стоит за символом Escape(\)
-
11-07-2019 - |
Вопрос
Как компилятор C / C ++ манипулирует управляющим символом ["\"] в исходном коде?Как написана грамматика компилятора для обработки этого символа?Что делает компилятор после обнаружения этого символа?
Решение
Большинство компиляторов делятся на части: внешний интерфейс компилятора называется лексическим анализатором или сканер. Эта часть компилятора читает фактические символы и создает токены. Он имеет конечный автомат, который решает, увидев escape-символ, является ли он подлинным (например, когда он появляется внутри строки), или он изменяет следующий символ. Токен выводится соответственно как escape-символ или какой-либо другой токен (например, табуляция или новая строка) для следующей части компилятора ( парсер ). Конечный автомат может сгруппировать несколько символов в токен.
Другие советы
Интересная заметка на эту тему: включен. Доверие Доверие [PDF ссылка] .
В статье описан один способ, которым компилятор мог бы точно решить эту проблему, показано, как компилятор c-написано в c не имеет явного перевода кодов в значения ASCII; и как загрузить новый escape-код в компилятор так, чтобы понимание значения ASCII для нового кода также было неявным.
Обычно он экранирует следующий символ:
- В строковом литерале или символьном литерале это означает экранирование следующего символа.
\a
означает "оповещение" (мигание терминала, звуковой сигнал или что-то еще).,\n
означает "перевод строки",\xNUM
означает, например, шестнадцатеричное число. - Если он отображается как последний видимый символ перед переводом строки, будь то в строке или нет (и даже в комментарии длиной в строку!), он действует как продолжение строки:Следующий символ перевода строки игнорируется, а следующая строка объединяется с текущей строкой.
escape-символ со следующим символом (например, \ n
) является отдельным символом для компилятора C - сканер представляет его синтаксическому анализатору как символьный токен, поэтому нет необходимости в специальных синтаксических правилах для синтаксического анализатора для экранирующий символ.