-
Notifications
You must be signed in to change notification settings - Fork 21
Структура нового дерева
Файл 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
вернет оператор тела функции
-