блочно > Генератор кода

Класс CodeGenerator

Класс генератора кода, который переводит блоки на язык.

Подпись:

export declare class CodeGenerator 

Конструкторы

Конструктор Модификаторы Описание
(конструктор)(имя) Создает новый экземпляр класса CodeGenerator

Характеристики

Свойство Модификаторы Тип Описание
COMMENT_WRAP число Максимальная длина комментария перед переносом. Не учитывает уровень отступов.
определения_ protected { [ключ: строка]: строка; } Словарь определений, который будет напечатан перед кодом.
forBlock Запись<строка, (блок: Блок , генератор: это) => [строка, число] | строка | ноль>

Словарь функций генератора блоков, сгруппированный по типу блока. Каждая функция генератора блоков принимает два параметра:

- Блок для генерации кода и - вызывающий экземпляр CodeGenerator (или подкласса), чтобы функция могла вызывать методы, определенные ниже (например, BlockToCode) или в соответствующем подклассе (например, JavascripGenerator),

и возвращает:

- кортеж [код, приоритет] (для блоков значений/выражений), или - строка, содержащая сгенерированный код (для блоков операторов), или - значение null, если для блока не должен быть выдан код.

FUNCTION_NAME_PLACEHOLDER_ нить Используется в качестве заполнителя в функциях, определенных с помощью CodeGenerator.provideFunction_. Это не должен быть допустимый код, который может законно появиться в определении функции (или комментарии), и он не должен сбивать с толку анализатор регулярных выражений.
FUNCTION_NAME_PLACEHOLDER_REGEXP_ Регэксп
имена функций_ protected { [ключ: строка]: строка; } Словарь, сопоставляющий желаемые имена функций в определениях с фактическими именами функций (чтобы избежать конфликтов с пользовательскими функциями).
ОТступ нить Метод отступа. По умолчанию используется два пробела, но генераторы языка могут переопределить это, чтобы увеличить отступ или перейти на табуляцию.
INFINITE_LOOP_TRAP строка | нулевой Произвольный код для внедрения в места, которые могут вызвать бесконечные циклы. Любые экземпляры «%1» будут заменены идентификатором блока, в котором произошел сбой. Например checkTimeout(%1);\n
isInitialized логическое | нулевой Был ли вызван метод init. Генераторы, которые устанавливают для этого флага значение false после создания и значение true в init, заставят блокToCode выдать предупреждение, если генератор не был инициализирован. Если этот флаг не трогать, он не будет иметь никакого эффекта.
имя_ нить
имяDB_? Имена (Необязательно) База данных имен переменных и процедур.
ORDER_OVERRIDES число[][] Список пар внешний-внутренний, для которых НЕ требуются круглые скобки.
RESERVED_WORDS_ protected нить Список зарезервированных слов, разделенных запятыми.
STATEMENT_PREFIX строка | нулевой Произвольный код для внедрения перед каждым оператором. Любые экземпляры «%1» будут заменены идентификатором блока инструкции. Например, highlight(%1);\n
STATEMENT_SUFFIX строка | нулевой Произвольный код для внедрения после каждого оператора. Любые экземпляры «%1» будут заменены идентификатором блока инструкции. Например, highlight(%1);\n

Методы

Метод Модификаторы Описание
addLoopTrap(ветвь, блок) Добавьте ловушку бесконечного цикла к содержимому цикла. Добавьте суффикс инструкции в начале блока цикла (сразу после выполнения инструкции цикла) и префикс инструкции в конце блока цикла (сразу перед выполнением инструкции цикла).
addReservedWords(слова) Добавьте одно или несколько слов в список зарезервированных слов для этого языка.
allNestedComments (блок) Рекурсивно просматривайте дерево блоков, возвращая все их комментарии.
blockToCode (блок, opt_thisOnly) Сгенерировать код для указанного блока (и прикрепленных блоков). Генератор должен быть инициализирован перед вызовом этой функции.
закончить (код) Перехватчик для запуска кода в конце генерации кода. Подклассы могут переопределить это, например, добавив к сгенерированному коду операторы импорта или определения переменных.
getProcedureName (имя) Получает уникальное допустимое имя для определяемой пользователем процедуры. Перед вызовом этого метода свойство nameDB_ класса должно быть уже инициализировано. Обычно это делается в функции init класса генератора кода.
getVariableName(nameOrId) Получает уникальное допустимое имя для определяемой пользователем переменной. Перед вызовом этого метода свойство nameDB_ класса должно быть уже инициализировано. Обычно это делается в функции init класса генератора кода.
инициализация (_workspace) Перехватчик для запуска кода до начала генерации кода. Подклассы могут переопределить это, например, для инициализации базы данных имен переменных.
injectId (сообщение, блок) Вставьте идентификатор блока в сообщение, чтобы заменить «%1». Используется для STATEMENT_PREFIX, STATEMENT_SUFFIX и INFINITE_LOOP_TRAP.
prefixLines(текст, префикс) Добавьте общий префикс к каждой строке кода. Предназначен для отступов кода или добавления маркеров комментариев.
обеспечитьФункция_(желаемоеИмя, код)

Определите определяемую разработчиком функцию (а не определяемую пользователем процедуру), которая будет включена в сгенерированный код. Используется для создания частных вспомогательных функций. При первом вызове с заданным желаемым именем код сохраняется и генерируется фактическое имя. Последующие вызовы с тем же желаемым именем не имеют никакого эффекта, но имеют то же возвращаемое значение.

Вызывающая сторона должна убедиться, что одно и то же желаемое имя не используется для разных вспомогательных функций (например, используйте «colorRandom» и «listRandom», а не «random»). Нет опасности столкновения с зарезервированными словами, именами пользовательских переменных или процедур.

Код получает вывод при вызове CodeGenerator.finish().

Scrub_(_block, code, _opt_thisOnly) protected Общие задачи по генерации кода из блоков. Это вызывается из blockToCode и вызывается для каждого блока, а не только для блоков верхнего уровня. Подклассы могут переопределить это, например, для генерации кода для операторов, следующих за блоком, или для обработки комментариев для указанного блока и любых связанных блоков значений.
скрабNakedValue (строка) Голые значения — это блоки верхнего уровня с выходами, которые ни к чему не подключены. Подклассы могут переопределить это, например, если их язык не допускает голых значений.
операторToCode(блок, имя) Сгенерируйте строку кода, представляющую блоки, прикрепленные к именованным входным данным оператора. Сделайте отступ в коде. В основном используется в генераторах. При попытке сгенерировать код для оценки обратите внимание на использование WorkspaceToCode или BlockToCode.
valueToCode (блок, имя, внешний порядок) Сгенерируйте код, представляющий указанное входное значение.
WorkspaceToCode (рабочая область) Сгенерируйте код для всех блоков в рабочей области на указанном языке.