Classe CodeGenerator
Classe para um gerador de código que traduz os blocos para um idioma.
Signature:
export declare class CodeGenerator
Construtores
Construtor | Modificadores | Descrição |
---|---|---|
(construtor)(nome) | Constrói uma nova instância da classe CodeGenerator . |
Propriedades
Propriedade | Modificadores | Tipo | Descrição |
---|---|---|---|
COMMENT_WRAP | number | Tamanho máximo de um comentário antes do wrapper. Não considera o nível de recuo. | |
definitions_ | protected |
{ [chave: string]: string; } | Um dicionário de definições a serem impressas antes do código. |
forBlock | Record<string, (block: Block, generator: this) => [string, number] | string | null> | Um dicionário de funções geradoras de blocos, codificadas por tipo de bloco. Cada função do gerador de blocos usa dois parâmetros: - o bloco para gerar código; e - a instância de CodeGenerator (ou subclasse) que fez a chamada, de modo 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 | Ele é usado como um marcador de posição em funções definidas com CodeGenerator.provideFunction_. Ela não pode ser um código legal que possa aparecer legitimamente em uma definição de função (ou comentário) nem confundir o analisador de expressão regular. | |
FUNCTION_NAME_PLACEHOLDER_REGEXP_ | RegExp | ||
functionNames_ | protected |
{ [chave: string]: string; } | Um dicionário que mapeia os nomes das funções desejadas em definições_ para nomes de função reais (para evitar colisões com as funções do usuário). |
INDENTE | string | O método de recuo. O padrão é dois espaços, mas os geradores de idioma podem modificar isso para aumentar o recuo ou mudar para guias. | |
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" vão ser substituídas pelo ID de bloqueio com falha. Por exemplo, checkTimeout(%1);\n |
|
isInitialized | boolean | null | Se o método init foi chamado. Os geradores que definem essa flag como "false" após a criação e "true" no 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 externos 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 bloco 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 bloco da instrução. Por exemplo, highlight(%1);\n |
Métodos
Método | Modificadores | Descrição |
---|---|---|
addLoopTrap(branch, block) | Adicionar uma armadilha de loop infinito ao conteúdo de um loop. Adicione o sufixo da 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) | Arranca de maneira recursiva uma árvore de blocos, retornando todos os comentários. | |
blockToCode(block, opt_thisOnly) | Gere um código para o bloco especificado (e blocos anexados). É preciso inicializar o gerador antes de chamar essa função. | |
finish(code) (em inglês) | Hook para que o código seja executado ao final da geração de código. Isso pode ser substituído pelas subclasses, 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. Isso pode ser substituído pelas subclasses, 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_PREFIX, STATEMENT_SUFFIX e INFINITE_LOOP_TRAP. | |
prefixLines(text, prefix) | Incluir um prefixo comum em cada linha de código. Destinado a recuar código ou adicionar marcadores de comentário. | |
fornecerfunção_(nome_desejado, 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 subsequentes com o mesmo supportedName não têm efeito, mas têm o mesmo valor de retorno. Cabe ao autor da chamada garantir que o mesmo destinationName não seja usado para diferentes funções auxiliares (por exemplo, use "colourRandom" e "listRandom", e não "random"). Não há perigo de colidir com palavras reservadas ou nomes de procedimento ou variáveis definidas pelo usuário. O código é gerado quando CodeGenerator.finish() é chamado. |
|
scrub_(_block, code, _opt_thisOnly) (link em inglês) | Tarefas comuns para gerar código com base em blocos. Isso é chamado em blockToCode e é chamado em todos os blocos, não apenas em blocos de nível superior. Isso pode ser substituído pelas subclasses, por exemplo, para gerar código para instruções após o bloco ou para manipular comentários do bloco especificado e de todos os blocos de valor conectados. | |
scrubNakedValue(line) | Os valores sem "www" são blocos de nível superior com saídas que não são conectadas a nada. Isso pode ser substituído pelas subclasses, por exemplo, caso a linguagem não permita valores de "www". | |
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 tentar gerar um código para avaliação, use workspaceToCode ou blockToCode. | |
valueToCode(block, name, outerOrder) | Gere um código que representa a entrada de valor especificado. | |
workspaceToCode(workspace) | Gere um código para todos os blocos no espaço de trabalho no idioma especificado. |