Семантический анализ в компиляторах [закрыто]
Как семантический анализ выполняется компилятором (обычно)?
Я должен был ответить на этот вопрос во время моего последнего экзамена, этого было недостаточно для профессора.Я включил BNF (с примером) и синтаксические карты в свой ответ, на который он спросил меня: "что происходит, когда компилятор находит оператор, подобный int i;
?"
1 ответ:
Время внимательно прочитать книгу Ахо и Уллмана/Дракона.
Семантический анализ-это деятельность компилятора по определению того, каковы типы различных значений, как эти типы взаимодействуют в выражениях и являются ли эти взаимодействия семантически обоснованными. Например, вы не можете разумно умножить строку на имя класса, хотя никакой редактор не помешает вам написать"abc" * MyClass
Чтобы сделать это, компилятор должен сначала определить объявления и области, и обычно записывает результат этого шага в наборе таблиц символов. Это говорит ему, что означают конкретные идентификаторы в конкретных контекстах. Он также должен определять типы различных литеральных констант; " abc " -это другой тип, чем 12.2 e-5.
Затем он должен посетить все места, где используются идентификаторы и литералы, и проверить, что использование идентификатора/литерала и вычисленные результаты совместимы с определением языка (как в приведенном выше примере).Что касается как это сделано: обычно исходный код анализируется, строится некоторое представление программы (синтаксические деревья очень популярны), и это представление обходится ("посещается") элемент за элементом для сбора/проверки семантической информации. Таблица символов обычно представляет собой набор хэш-таблиц, связанных с синтаксическим деревом, представляющим область видимости, хеширование от идентификаторов к структурам, содержащим объявления типов.