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 | 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 impressos antes do código. |
forBlock | Record<string, (bloco: Bloco, gerador: this) => [string, número] | string | nulo> | Um dicionário de funções de gerador de blocos, codificado por tipo de bloco. Cada função de gerador de blocos usa dois parâmetros: - o bloco para gerar o código, e - a instância do CodeGenerator de chamada (ou subclasse), para que a função possa chamar os 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 for emitido para o bloco. |
|
FUNCTION_NAME_PLACEHOLDER_ | string | Ela é usada como um marcador de posição em funções definidas com o CodeGenerator.provideFunction_. Ele não pode ser um código legal que possa aparecer legitimamente em uma definição (ou comentário) de função nem 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 desejados em Definições_ para nomes de funções 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 linguagem podem substituir isso para aumentar o recuo ou mudar para as guias. | |
INFINITE_LOOP_TRAP | string | nulo | Código arbitrário a ser injetado em locais que correm o risco de causar loops infinitos. Qualquer ocorrência de "%1" será substituído pelo ID do bloco que falhou. Por exemplo, checkTimeout(%1);\n |
|
isInitialized | booleano | nulo | Se o método init foi chamado. Os geradores que definirem essa flag como "false" após a criação e "true" no init farão com que blockToCode emita um aviso se o gerador não tiver sido inicializado. Se esse sinalizador não for tocado, ele não terá efeito. | |
name_ | string | ||
nameDB_? | Nomes | Um banco de dados de nomes de variáveis e procedimentos (opcional). | |
ORDER_OVERRIDES | número[][] | Lista de pareamentos externos e internos que NÃO precisam de parênteses. | |
RESERVED_WORDS_ | protected |
string | Lista separada por vírgulas de palavras reservadas. |
STATEMENT_PREFIX | string | nulo | Código arbitrário a ser injetado antes de cada instrução. Qualquer ocorrência de "%1" será substituída 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. Qualquer ocorrência de "%1" será substituída pelo ID de bloco 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 o 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 final 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) | Indexe recursivamente uma árvore de blocos, retornando todos os comentários. | |
blockToCode(block, opt_thisOnly) | Gere o código para o bloco especificado e os 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 de código. As subclasses podem substituir isso, por exemplo, para incluir instruções de importação ou definições de variáveis no início do código gerado. | |
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. Normalmente, isso é 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. Normalmente, isso é 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 do código. As subclasses podem substituir isso, por exemplo, para inicializar o banco de dados de nomes de variáveis. | |
injectId(msg, block) | Injetar um ID de bloco em uma mensagem para substituir '%1'. Usado para STATEMENT_PREFIX, STATEMENT_SUFFIX e INFINITE_LOOP_TRAP. | |
prefixLines(text, prefix) | Inclua um prefixo comum em cada linha de código. Destinado a recuar código ou adicionar marcadores de comentários. | |
fornecerFunction_(nomededestino, código) | Defina uma função definida pelo desenvolvedor (não um procedimento definido pelo usuário) para ser incluída no código gerado. Usado para criar funções auxiliares particulares. Na primeira vez que for chamado com um nome desejado específico, o código é salvo e um nome real é gerado. Chamadas subsequentes com o mesmo wantName não terão efeito, mas terão o mesmo valor de retorno. Cabe ao autor da chamada garantir que o mesmo wantName não seja usado para funções auxiliares diferentes (por exemplo, use "colourRandom" e "listRandom", e não "random"). Não há perigo de colidir com palavras reservadas ou nomes de variáveis ou procedimentos definidos pelo usuário. O código é gerado quando CodeGenerator.finish() é chamado. |
|
scrub_(_block, code, _opt_thisOnly) | Tarefas comuns para gerar código a partir de blocos. Isso é chamado de blockToCode e é chamado 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 que seguem o bloco ou para lidar com comentários para o bloco especificado e quaisquer blocos de valor conectados. | |
scrubNakedValue(line) | Valores sem "www" são blocos de nível superior com saídas que não estão conectadas a nada. As subclasses podem substituir isso, por exemplo, caso a linguagem não permita valores sem "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 o código para avaliar, veja se usando workspaceToCode ou blockToCode. | |
valueToCode(block, name, outerOrder) | Gera 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. |