Структура нового дерева
andrey-terekhov edited this page 2022-07-27 12:09:24 +03:00
This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Файл 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 вернет оператор тела функции