Является ли шаг семантического анализа в Clang неотъемлемой частью компилятора?

Я пытаюсь понять все тонкости Clang, и я не очень уверен в библиотеке "Sema". Находится ли семантический анализ на пути, по которому компилятор компилирует программу? Или он используется только программистом для анализа своего кода?

Из того, что я понял, синтаксический анализатор создает AST, а затем есть «потребители AST», которые используют AST для разных целей. Итак, библиотека генерации кода превращает AST в IR. А библиотека семантического анализа использует AST для анализа кода. Верно ли это понимание, или для компиляции тоже используется семантический анализатор?


person Hassan    schedule 16.07.2012    source источник
comment
Clang — довольно странная штука: Sema не только проверяет AST и вставляет неявные приведения типов/декларации/что угодно, но также отвечает за построение самого AST. Это не очень типичная схема для компилятора.   -  person SK-logic    schedule 18.07.2012
comment
@SK-logic Он отвечает за создание AST? Но что делает парсер? И как синтаксический анализатор передает свои выводы семантическому анализатору?   -  person Hassan    schedule 18.07.2012
comment
парсер сразу же вызывает Sema для каждого полного выражения или инструкции. Есть некоторые промежуточные структуры (например, для представления проанализированных, но еще не разрешенных типов), но окончательный Clang AST создается Sema.   -  person SK-logic    schedule 18.07.2012
comment
@SK-logic Это довольно хорошая идея. Итак, если синтаксический анализатор сам по себе строит AST, будет ли более подходящим термином «дерево синтаксического анализа»?   -  person Hassan    schedule 18.07.2012
comment
да, его часто называют деревом синтаксического анализа, а все дальнейшие преобразованные промежуточные представления называются AST. Хотя эта разница весьма неопределенна. В clang нет отдельного дерева разбора, он сразу строит семантически проверенный (и несколько трансформированный) AST (якобы из соображений производительности).   -  person SK-logic    schedule 18.07.2012
comment
@SK-logic Итак, в более традиционном компиляторе семантический анализатор получит дерево синтаксического анализа, затем разрешит идентификаторы в переменные, вставит неявные приведения и т. д.? Затем полученный AST отправится в генератор кода?   -  person Hassan    schedule 18.07.2012
comment
Да, большинство компиляторов будут иметь отдельные проходы синтаксического анализа и семантического анализа, по крайней мере, с детализацией операторов верхнего уровня (структуры/функции в C).   -  person SK-logic    schedule 18.07.2012
comment
@SK-logic Хорошо, спасибо, что ответили на мои вопросы, это было очень полезно.   -  person Hassan    schedule 18.07.2012


Ответы (1)


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

Другими словами, когда дело доходит до семантического анализа, компилятор уже уверен, что в программе используются допустимые слова (лексические), и что предложения построены правильно, в соответствии с заданной грамматикой языка (синтаксисом). Остается только проверить, имеют ли эти предложения смысл — проверка типов данных, возвращаемых значений, границ размера, неинициализированных переменных и т. д.

Мои знания о процессе компиляции более общие, чем конкретные о Clang, но я думаю, что семантический анализ определенно присутствует в анализе кода.

person MatijaSh    schedule 16.07.2012
comment
Это было бы правильно, если бы синтаксис C++ был полностью независим от типов. К сожалению, вы даже не можете правильно разобрать a * b;, не зная, является ли a типом или нет. - person fredoverflow; 04.06.2016