Table of contents
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_booleanexpression_literal_get_characterexpression_literal_get_integerexpression_literal_get_floatingexpression_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вернет выражение-условие casestatement_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вернет оператор тела thenstatement_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вернет оператор тела функции