Реализация атрибутов грамматических символов в C

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

TYPE -> integer

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

TYPE.type = integer

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

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


person nik    schedule 13.03.2012    source источник


Ответы (1)


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

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

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

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

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

person Ira Baxter    schedule 13.03.2012