Реализация атрибутов грамматических символов в C - PullRequest
2 голосов
/ 13 марта 2012

Мне нужно реализовать компилятор (лексический, синтаксический и семантический анализаторы).Я уже реализовал лексику из flex ++, синтаксис из рук (рекурсивное спуск) и знаю, что работаю над семантикой (добавлением семантических правил в существующий синтаксический анализатор).Мой вопрос - как мне реализовать атрибуты.Например, для производства:

TYPE -> integer

Мне нужно добавить семантическое правило:

TYPE.type = integer

Итак, здесь мне нужно создать некоторую структуру для TYPE и так далее для всех грамматических символов,Итак, как мне реализовать эти структуры?Нужно ли создавать некоторую структуру для каждого грамматического символа, и она должна быть глобальной для области видимости файла?

ps может быть, это не лучшая реализация компилятора, это просто требование для присваивания.

1 Ответ

2 голосов
/ 13 марта 2012

Проще всего определить тип (обычно структуру) для каждого терминала и нетерминал в вашем языке.Затем каждое использование (не) терминала имеет доступ к типу, и каждое назначение атрибута идет против соответствующего временного интервала в структуре, связанной с (не) терминалом.

Я предлагаю вам назвать ваши структуры реализации после грамматических токенов.Таким образом, тип структуры атрибута для T будет "T_attributes {...}"

Для вашего примера, "type" будет слотом в T_attributes.Вероятно, вы хотели написать в аннотации:

TYPE -> 'integer' ;  -- 'integer is a keyword'
TYPE.type = "int";   -- the type of an 'integer' is "int"

Учитывая, что вы делаете это вручную, вы вручную скомпилируете присвоение атрибута для выполнения, когда обход дерева достигает узла TYPE.

...