Skip to content

Структура нового дерева

andrey-terekhov edited this page Jul 27, 2022 · 6 revisions

Файл AST.h содержит заголовки интерфейсных функций для нового дерева Категорию узла - выражение, объявление или оператор - можно узнать по контексту. Для каждого узла его потомки имеют заранее определенный тип.

На вход кодогенератору подается узел единицы трансляции:

  • translation_unit_get_size вернет количество глобальных объявлений
  • translation_unit_get_declaration вернет глобальное объявление по его индексу

Работа с узлами выражений

Каждый узел выражения хранит информацию о типе и категории значения:

  • expression_get_type вернет тип значения
  • expression_is_lvalue вернет true, если значение является lvalue

Первый шаг - надо узнать вид узла выражения. Для этого используется expression_get_class, которая вернет константу перечисления expression_t. Для получения информации в узле надо пользоваться соответствующими по названию функциями. Возможные выражения и способ работать с ними:

  • Выражение-идентификатор:

    • expression_identifier_get_id вернет индекс в таблице идентификаторов
  • Выражение-литерал:
    Для получения типа литерала используйте expression_get_type. Далее в зависимости от типа используйте соответствующую функцию для получения значения литерала:

    • expression_literal_get_boolean
    • expression_literal_get_character
    • expression_literal_get_integer
    • expression_literal_get_floating
    • expression_literal_get_string

Выражение-вырезка:

  • expression_subscript_get_base вернет выражение-операнд
  • expression_subscript_get_index вернет выражение-индекс

Выражение-вызов:

  • expression_call_get_callee вернет вызываемое выражение
  • expression_call_get_arguments_amount вернет количество выражений-аргументов
  • expression_call_get_argument вернет выражение-аргумент по индексу

Выражение-выборка:

  • expression_member_get_base вернет выражение-операнд
  • expression_member_get_member_index вернет номер выбранного поля в структуре
  • expression_member_is_arrow вернет true, если в выражении был оператор ->, и false, если оператором был .

Выражение-преобразование:

  • expression_cast_get_operand вернет выражение-операнд
  • expression_cast_get_source_type вернет тип, которому выражение преобразовано

Унарное выражение:

  • expression_unary_get_operand вернет выражение-операнд
  • expression_unary_get_operator вернет унарный оператор из перечисления unary_t

Бинарное выражение:

  • expression_binary_get_LHS вернет выражение левого операнда
  • expression_binary_get_RHS вернет выражение правого операнда
  • expression_binary_get_operator вернет бинарный оператор из перечисления binary_t

Тернарное выражение:

  • expression_ternary_get_condition вернет выражение условия
  • expression_binary_get_LHS вернет выражение левого операнда
  • expression_binary_get_RHS вернет выражение правого операнда

Присваивающее выражение:

  • expression_binary_get_LHS вернет выражение левого операнда
  • expression_binary_get_RHS вернет выражение правого операнда
  • expression_binary_get_operator вернет оператор присваивания из перечисления binary_t

Выражение-инициализатор:

  • expression_initializer_get_size вернет количество подвыражений в инициализаторе
  • expression_initializer_get_subexpr вернет подвыражение по индексу

Работа с узлами операторов

Первый шаг - надо узнать вид узла оператора. Для этого используется statement_get_class, которая вернет константу перечисления statement_t. Для получения информации в узле надо пользоваться соответствующими по названию функциями. Возможные операторы и способ работать с ними:

  • Оператор case:

    • statement_case_get_expression вернет выражение-условие case
    • statement_case_get_substmt вернет оператор-тело оператора case
  • Оператор default:

    • statement_default_get_substmt вернет оператор-тело оператора default
  • Составной оператор:

    • statement_compound_get_size вернет количество подоператоров
    • statement_compound_get_substmt вернет подоператор по индексу
  • Оператор if:

    • statement_if_has_else_substmt вернет true, если else-тело присутствует
    • statement_if_get_condition вернет выражение-условие
    • statement_if_get_then_substmt вернет оператор тела then
    • statement_if_get_else_substmt вернет оператор тела else
  • Оператор switch:

    • statement_switch_get_condition вернет выражение-условие
    • statement_switch_get_body вернет оператор-тело
  • Оператор while:

    • statement_while_get_condition вернет выражение-условие
    • statement_while_get_body вернет оператор-тело
  • Оператор do:

    • statement_do_get_condition вернет выражение-условие
    • statement_do_get_body вернет оператор-тело
  • Оператор for:

    • statement_for_has_inition вернет true, если оператор-инициализатор присутствует
    • statement_for_has_condition вернет true, если выражение-условие присутствует
    • statement_for_has_increment вернет true, если выражение-инкремент присутствует
    • statement_for_get_inition вернет оператор-инициализатор
    • statement_for_get_condition вернет выражение-условие
    • statement_for_get_increment вернет выражение-инкремент
    • statement_for_get_body вернет оператор-тело
  • Оператор return:

    • statement_return_has_expression вернет true, если возвращаемое выражение присутствует
    • statement_return_get_expression вернет возвращаемое выражение

Работа с узлами объявлений

Первый шаг - надо узнать вид узла объявлений. Для этого используется declaration_get_class, которая вернет константу перечисления declaration_t. Для получения информации в узле надо пользоваться соответствующими по названию функциями. Возможные операторы и способ работать с ними:

  • Объявление типа:

    • declaration_type_get_type вернет объявляемый тип
    • declaration_type_get_id вернет индекс в таблице идентификаторов объявляемого идентификтора
  • Объявление переменной:

    • declaration_variable_get_id вернет индекс в таблице идентификаторов объявляемой переменной
    • declaration_variable_has_initializer вернет true, если выражение-инициализатор присутствует
    • declaration_variable_get_initializer вернет выражение-инициализатор
    • declaration_variable_get_dim_amount вернет количество границ массива в объявлении
    • declaration_variable_get_dim_expr вернет выражение-размер границы массива по его индексу
  • Объявление функции:

    • declaration_function_get_id вернет индекс функции в таблице идентификаторов
    • declaration_function_get_param вернет индекс параметра в таблице идентификаторов
    • declaration_function_get_body вернет оператор тела функции