Компиляция обычно происходит в несколько этапов: лексический анализ, синтаксический анализ и т. Д. Скажем, на языке C я написал

a=24;

Без объявления a как int. Теперь, на каком этапе компиляции обнаруживается ошибка? На этапе синтаксического анализа? Если это так, то что делает лексический анализатор? Просто токенизация исходного кода?

2
AV94 16 Фев 2015 в 16:16

2 ответа

Лучший ответ

Если говорить об общей форме компилятора, очевидно, что ошибка возникнет на этапе синтаксического анализа, когда синтаксический анализатор будет искать символ в записях таблицы символов , и на последующих этапах - только при дальнейшей обработке после восстановления после ошибки .

Книга драконов также ясно говорит об этом. Это указано на странице, где указаны типы ошибок. Тема, которую необходимо тщательно изучить, чтобы понять эту проблему, приведена в разделе 4.1.3 - Обработка синтаксических ошибок .

a = 24;   // without declaring a as an int type variable.

Здесь работа лексической фазы заключается просто в доступе к символам и токенам форм и последующей передаче их на дальнейшие этапы, то есть на синтаксический анализ на этапе синтаксического анализа и т. Д.

3
Am_I_Helpful 16 Фев 2015 в 22:55

Я не знаю вашего компилятора, но в целом это будет этап синтаксического анализа (синтаксический анализ), а не лексический этап (токенизация). Большинство компиляторов C будут написаны с использованием варианта lex / yacc, что делает вышеприведенное предположение более правдоподобным. Если вы хотите узнать подробности, погрузитесь в книгу драконов, отличный ресурс.

Если бы я написал компилятор, я бы лексический анализатор выдавал токены (в данном случае: a, =, 24 и, наконец;). Синтаксический анализатор будет поддерживать таблицу символов и, увидев символ, будет проверять, есть ли этот символ в таблице; если нет (как в вашем примере), это сигнализирует об ошибке.

1
Karel Kubat 16 Фев 2015 в 13:22