Существует множество схем для определения семантики языков программирования:
денотационная семантика (которая отображает синтаксис в функции, которые вычисляют состояние программы);
операционная семантика (что означает создание переводчиков для вашего языка),
трансформационная семантика (что означает перевод вашего языка на другой язык
язык, для которого уже существует другая семантика) и т. д.
Очень немногие из них в настоящее время приводят к системам, пригодным для реальных языков программирования. Один из других ответов здесь предлагает Кентавр как систему, которая пытается это сделать.
Семантика действия Питера Моссеса - одна из самых серьезных недавних попыток.
Для реальных систем более специальные методы в настоящее время являются наиболее эффективными.
Эти включающие системы, в которых лексический и грамматический синтаксис могут быть эффективно
определяется (как варианты LEX и YACC), и автоматически строить деревья.
Грамматики атрибутов позволяют задавать вычисления для деревьев,
которые позволяют определить некоторые виды анализа, такие как таблица символов
конструкция или метрики (технически вы могли бы
сделать денотационную семантику таким образом). Большинство обычных языков (C, Java, C #,
КОБОЛ, ...) все имеют относительно схожие структуры относительно потока управления и
поток данных, и, как следствие, можно построить общие процедуры анализа потока
чтобы можно было рассуждать о таких стандартных языках.
Наконец, вам нужна цель для вашего семантического анализа: какие факты
именно вы хотите извлечь? Доступный статический анализ
системы имеют гибридные методы на основе шаблонов / процедурного кода для
сбор синтаксиса, таблицы символов и представляющих интерес фактов
вычислить конкретные ответы на конкретные вопросы.
Некоторые системы позволяют использовать эту семантическую информацию для переноса
модификация исходного кода.
Одна система, которая следует более специальному подходу выше, является нашей
DMS Software Reengineering Toolkit , который также имеет общие семантические определения
(синтаксис, таблицы символов, анализ потока данных) завершено для реального
такие языки, как Java, C, C ++ и COBOL. DMS может подать заявку
преобразование источника в источник AST обусловлено
с помощью различных процедур сбора фактов, что позволяет
надежное преобразование кода.