Classe CodeGenerator
Classe para um gerador de código que traduz os blocos para uma linguagem.
Signature:
export declare class CodeGenerator
Construtores
Construtor | Modificadores | Descrição |
---|---|---|
(construtor)(nome) | Cria uma nova instância da classe CodeGenerator |
Propriedades
Propriedade | Modificadores | Tipo | Descrição |
---|---|---|---|
COMMENT_WRAP | number | O tamanho máximo de um comentário antes de encapsular. Não considera o nível de recuo. | |
definitions_ | protected |
{ [chave: string]: string; } | Um dicionário de definições a ser mostrado antes do código. |
forBlock | Record<string, (block: Block, generator: this) => [string, number] | string | null> | Um dicionário de funções do gerador de blocos, codificadas por tipo de bloco. Cada função geradora de blocos usa dois parâmetros: - o bloco para gerar código, e - a instância CodeGenerator (ou subclasse) de chamada, para que a função possa chamar métodos definidos abaixo (por exemplo, blockToCode) ou na subclasse relevante (por exemplo JavascripGenerator); e retorna: - uma tupla [código, precedência] (para blocos de valor/expressão) ou - uma string contendo o código gerado (para blocos de instrução) ou - nulo se nenhum código precisar ser emitido para o bloco. |
|
FUNCTION_NAME_PLACEHOLDER_ | string | É usado como um marcador de posição em funções definidas com CodeGenerator.provideFunction_. Ele não pode ser um código legal que possa aparecer legitimamente em uma definição de função (ou comentário) e não pode confundir o analisador de expressões regulares. | |
FUNCTION_NAME_PLACEHOLDER_REGEXP_ | RegExp | ||
functionNames_ | protected |
{ [chave: string]: string; } | Um dicionário que mapeia nomes de funções desejadas em definições_ para nomes de função reais (para evitar colisões com funções de usuário). |
INDENTE | string | O método de recuo. O padrão é dois espaços, mas os geradores de idiomas podem substituí-lo para aumentar o recuo ou mudar para tabulações. | |
INFINITE_LOOP_TRAP | string | nulo | Código arbitrário para injetar em locais que correm o risco de causar loops infinitos. Todas as instâncias de "%1" serão substituídas pelo ID de bloqueio que falhou. Por exemplo, checkTimeout(%1);\n |
|
isInitialized | boolean | null | Se o método init foi chamado. Geradores que definem essa flag como "false" após a criação e "true" em "init" farão com que o blockToCode emita um aviso se o gerador não tiver sido inicializado. Se essa sinalização não for alterada, ela não terá efeito. | |
name_ | string | ||
nameDB_? | Nomes | (Opcional) Um banco de dados de nomes de variáveis e procedimentos. | |
ORDER_OVERRIDES | número[][] | Lista de pares internos que NÃO exigem parênteses. | |
RESERVED_WORDS_ | protected |
string | Lista de palavras reservadas separadas por vírgulas. |
STATEMENT_PREFIX | string | nulo | Código arbitrário a ser injetado antes de cada instrução. Todas as instâncias de "%1" serão substituídas pelo ID de bloqueio da instrução. Por exemplo, highlight(%1);\n |
|
STATEMENT_SUFFIX | string | nulo | Código arbitrário a ser injetado após cada instrução. Todas as instâncias de "%1" serão substituídas pelo ID de bloqueio da instrução. Por exemplo, highlight(%1);\n |
Métodos
Método | Modificadores | Descrição |
---|---|---|
addLoopTrap(branch, block) | Adicione uma armadilha de loop infinito ao conteúdo de um loop. Adicione um sufixo de instrução no início do bloco de loop (logo após a execução da instrução de loop) e um prefixo de instrução no fim do bloco de loop (logo antes da execução da instrução de loop). | |
addReservedWords(words) | Adicione uma ou mais palavras à lista de palavras reservadas para este idioma. | |
allNestedComments(block) | Faça a indexação recursiva de uma árvore de blocos, retornando todos os comentários. | |
blockToCode(block, opt_thisOnly) | Gere o código para o bloco especificado (e blocos anexados). O gerador precisa ser inicializado antes de chamar essa função. | |
finish(code). | Hook para que o código seja executado no final da geração do código. As subclasses podem substituir isso, por exemplo, para prefixar o código gerado com instruções de importação ou definições de variáveis. | |
getProcedureName(name) | Recebe um nome legal exclusivo para um procedimento definido pelo usuário. Antes de chamar esse método, a propriedade nameDB_ da classe já precisa ter sido inicializada. Isso geralmente é feito na função init da classe geradora de código. |
|
getVariableName(nameOrId) | Recebe um nome legal exclusivo para uma variável definida pelo usuário. Antes de chamar esse método, a propriedade nameDB_ da classe já precisa ter sido inicializada. Isso geralmente é feito na função init da classe geradora de código. |
|
init(_workspace) | Hook para que o código seja executado antes do início da geração de código. As subclasses podem substituir isso, por exemplo, para inicializar o banco de dados de nomes de variáveis. | |
injectId(msg, block). | Injete um ID de bloco em uma mensagem para substituir "%1". Usado para STATEMENT_PLACE, STATEMENT_SUFFIX e INFINITE_LOOP_TRAP. | |
prefixLines(text, prefix) | Inclua um prefixo comum em cada linha de código. Usado para recuar o código ou adicionar marcadores de comentários. | |
provideFunction_(GOALName, código) | Defina uma função definida pelo desenvolvedor (não um procedimento definido pelo usuário) a ser incluída no código gerado. Usado para criar funções auxiliares particulares. Na primeira vez em que isso é chamado com um certo wantName, o código é salvo e um nome real é gerado. Chamadas seguintes com o mesmo wantName não têm efeito, mas têm o mesmo valor de retorno. Cabe ao autor da chamada garantir que o mesmo wantName não seja usado para diferentes funções auxiliares (por exemplo, use "colourRandom" e "listRandom", e não "random"). Não há risco de colisão com palavras reservadas ou nomes de procedimento ou variáveis definidos pelo usuário. O código é gerado quando CodeGenerator.finish() é chamado. |
|
scrub_(_block, code, _opt_thisOnly) | protected |
Tarefas comuns para gerar código a partir de blocos. Ele é chamado em "blockToCode" e em todos os blocos, não apenas em blocos de nível superior. As subclasses podem substituir isso, por exemplo, para gerar código para instruções após o bloco ou para manipular comentários para o bloco especificado e quaisquer blocos de valor conectados. |
scrubNakedValue(line) | Os valores sem "www" são blocos de nível superior com saídas que não estão conectadas a nada. Isso pode ser substituído pelas subclasses, por exemplo, caso a linguagem não permita valores simples. | |
statementToCode(block, name) | Gere uma string de código que represente os blocos anexados à entrada da instrução nomeada. Recuar o código. Isso é usado principalmente em geradores. Ao gerar um código para avaliar, observe o uso de workspaceToCode ou blockToCode. | |
valueToCode(block, name, outerOrder) | Gerar um código que representa a entrada de valor especificado. | |
workspaceToCode(workspace) | Gerar código para todos os blocos do espaço de trabalho no idioma especificado. |