Компиляция обычно происходит в несколько этапов: лексический анализ, синтаксический анализ и т. Д. Скажем, на языке C я написал
a=24;
Без объявления a
как int
. Теперь, на каком этапе компиляции обнаруживается ошибка? На этапе синтаксического анализа? Если это так, то что делает лексический анализатор? Просто токенизация исходного кода?
2 ответа
Если говорить об общей форме компилятора, очевидно, что ошибка возникнет на этапе синтаксического анализа, когда синтаксический анализатор будет искать символ в записях таблицы символов , и на последующих этапах - только при дальнейшей обработке после восстановления после ошибки .
Книга драконов также ясно говорит об этом. Это указано на странице, где указаны типы ошибок. Тема, которую необходимо тщательно изучить, чтобы понять эту проблему, приведена в разделе 4.1.3 - Обработка синтаксических ошибок .
a = 24; // without declaring a as an int type variable.
Здесь работа лексической фазы заключается просто в доступе к символам и токенам форм и последующей передаче их на дальнейшие этапы, то есть на синтаксический анализ на этапе синтаксического анализа и т. Д.
Я не знаю вашего компилятора, но в целом это будет этап синтаксического анализа (синтаксический анализ), а не лексический этап (токенизация). Большинство компиляторов C будут написаны с использованием варианта lex / yacc, что делает вышеприведенное предположение более правдоподобным. Если вы хотите узнать подробности, погрузитесь в книгу драконов, отличный ресурс.
Если бы я написал компилятор, я бы лексический анализатор выдавал токены (в данном случае: a, =, 24 и, наконец;). Синтаксический анализатор будет поддерживать таблицу символов и, увидев символ, будет проверять, есть ли этот символ в таблице; если нет (как в вашем примере), это сигнализирует об ошибке.
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.