blockly > CodeGenerator

CodeGenerator-Klasse

Klasse für einen Codegenerator, der die Blöcke in eine Sprache übersetzt.

Unterschrift:

export declare class CodeGenerator 

Konstruktoren

Konstruktor Modifikatoren Beschreibung
(Konstruktor)(Name) Konstruiert eine neue Instanz der Klasse CodeGenerator

Attribute

Property Modifikatoren Typ Beschreibung
COMMENT_WRAP Zahl Maximale Länge eines Kommentars vor dem Zeilenumbruch. Die Einrückung wird nicht berücksichtigt.
definitions_ protected { [Schlüssel: Zeichenfolge]: string; } Ein Wörterbuch mit Definitionen, das vor dem Code ausgegeben werden soll.
forBlock Record<string, (block: Block, generator: this) => [string, number] | string | null>

Ein nach Blocktyp geordnetes Wörterbuch mit Blockgeneratorfunktionen. Jede Blockgenerator-Funktion verwendet zwei Parameter:

- den Block, für den Code für die CodeGenerator- oder Unterklasse-Instanz generiert werden soll, damit die Funktion unten definierte Methoden (z.B. blockToCode) oder in der relevanten Unterklasse (z.B. JavascripGenerator) aufrufen kann

und gibt Folgendes zurück:

– Ein Tupel [Code, Priorität] (für Wert-/Ausdrucksblöcke) oder - ein String mit dem generierten Code (für Anweisungsblöcke) oder - null, wenn kein Code für „Block“ ausgegeben werden soll

FUNCTION_NAME_PLACEHOLDER_ String Wird als Platzhalter in Funktionen verwendet, die mit CodeGenerator.provideFunction_ definiert werden. Es darf sich nicht um gültigen Code handeln, der legitim in einer Funktionsdefinition (oder einem Kommentar) vorkommen könnte, und er darf den Parser für reguläre Ausdrücke nicht verwirren.
FUNCTION_NAME_PLACEHOLDER_REGEXP_ RegExp
functionNames_ protected { [Schlüssel: Zeichenfolge]: string; } Ein Wörterbuch, das die gewünschten Funktionsnamen in „definitionen_“ tatsächlichen Funktionsnamen zuordnet (um Kollisionen mit Benutzerfunktionen zu vermeiden).
INDENT String Die Einrückungsmethode. Die Standardeinstellung ist zwei Leerzeichen. Sprachgeneratoren können dies jedoch überschreiben, um den Einzug zu vergrößern oder zu Tabs zu wechseln.
INFINITE_LOOP_TRAP String | null Beliebiger Code zum Einschleusen in Orte, die zu Endlosschleifen führen können. Alle Instanzen von "%1" werden durch die fehlgeschlagene Block-ID ersetzt. Beispiel: checkTimeout(%1);\n
isInitialized boolean | null Gibt an, ob die Initialisierungsmethode aufgerufen wurde. Generatoren, die dieses Flag nach der Erstellung auf „false“ und in init auf „true“ setzen, sorgen dafür, dass blockToCode eine Warnung ausgibt, wenn der Generator nicht initialisiert wurde. Wenn dieses Flag nicht bearbeitet wird, hat es keine Auswirkungen.
name_ String
nameDB_? Namen (Optional) Eine Datenbank mit Variablen- und Prozedurnamen.
ORDER_OVERRIDES Nummer[][] Liste der äußeren Paare, für die KEINE Klammern erforderlich sind.
RESERVED_WORDS_ protected String Durch Kommas getrennte Liste mit reservierten Wörtern.
STATEMENT_PREFIX String | null Beliebiger Code, der vor jeder Anweisung eingeschleust wird. Etwaige Instanzen von "%1" werden durch die Block-ID der Anweisung ersetzt. Beispiel: highlight(%1);\n
STATEMENT_SUFFIX String | null Beliebiger Code, der nach jeder Anweisung eingeschleust werden soll. Etwaige Instanzen von "%1" werden durch die Block-ID der Anweisung ersetzt. Beispiel: highlight(%1);\n

Methoden

Methode Modifikatoren Beschreibung
addLoopTrap(branch, block) Fügen Sie dem Inhalt einer Schleife einen Endlosschleifen-Trap hinzu. Fügen Sie ein Anweisungssuffix am Anfang des Schleifenblocks (direkt nach Ausführung der Schleifenanweisung) und ein Anweisungspräfix am Ende des Schleifenblocks hinzu (direkt vor der Ausführung der Schleifenanweisung).
addReservedWords(words) Fügen Sie der Liste der reservierten Wörter für diese Sprache ein oder mehrere Wörter hinzu.
allNestedComments(block) Sie können rekursiv einen Baum aus Blocks durchziehen und all ihre Kommentare zurückgeben.
blockToCode(block, opt_thisOnly) Generieren Sie Code für den angegebenen Block (und die angehängten Blöcke). Der Generator muss initialisiert werden, bevor diese Funktion aufgerufen wird.
beende(Code) Hook für Code, der am Ende der Codegenerierung ausgeführt wird. Abgeleitete Klassen können dies überschreiben, z.B. um dem generierten Code Importanweisungen oder Variablendefinitionen voranzustellen.
getProcedureName(name) Ruft einen eindeutigen, rechtsgültigen Namen für eine benutzerdefinierte Prozedur ab. Bevor diese Methode aufgerufen wird, muss das Attribut nameDB_ der Klasse bereits initialisiert sein. Dies erfolgt in der Regel in der Funktion init der Codegenerator-Klasse.
getVariableName(nameOrId) Ruft einen eindeutigen, rechtsgültigen Namen für eine benutzerdefinierte Variable ab. Bevor diese Methode aufgerufen wird, muss das Attribut nameDB_ der Klasse bereits initialisiert sein. Dies erfolgt in der Regel in der Funktion init der Codegenerator-Klasse.
init(_workspace) Hook für Code, der vor Beginn der Codegenerierung ausgeführt wird. Abgeleitete Klassen können dies überschreiben, um z.B. die Datenbank mit Variablennamen zu initialisieren.
insertId(msg, block) Fügen Sie eine Block-ID in eine Nachricht ein, um "%1" zu ersetzen. Wird für STATEMENT_PREFIX, STATEMENT_SUFFIX und INFINITE_LOOP_TRAP verwendet.
prefixLines(text, prefix) Stellen Sie jeder Codezeile ein gemeinsames Präfix voran. Ist zum Einrücken von Code oder Hinzufügen von Kommentarmarkierungen vorgesehen.
provideFunction_(desiredName, Code)

Definieren Sie eine vom Entwickler definierte Funktion (keine benutzerdefinierte Prozedur), die in den generierten Code aufgenommen werden soll. Wird zum Erstellen privater Hilfsfunktionen verwendet. Beim ersten Aufruf mit einem Wert für den gewünschten Namen wird der Code gespeichert und ein tatsächlicher Name generiert. Nachfolgende Aufrufe mit dem Wert „wantName“ haben keine Auswirkungen, haben aber denselben Rückgabewert.

Der Aufrufer muss sicherstellen, dass für verschiedene Hilfsfunktionen nicht derselbe Wert verwendet wird (z.B. "colourRandom" und "listRandom", nicht "Random"). Es besteht keine Gefahr, dass Kollisionen mit reservierten Wörtern oder benutzerdefinierten Variablen- oder Prozedurnamen auftreten.

Der Code wird ausgegeben, wenn CodeGenerator.complete() aufgerufen wird.

scrub_(_block, code, _opt_thisOnly) protected Häufige Aufgaben zum Generieren von Code aus Blöcken Diese wird von „blockToCode“ aufgerufen und für jeden Block aufgerufen, nicht nur für Blöcke der obersten Ebene. Abgeleitete Klassen können dies überschreiben, um beispielsweise Code für Anweisungen zu generieren, die auf den Block folgen, oder um Kommentare für den angegebenen Block und alle verbundenen Werteblöcke zu verarbeiten.
scrubNakedValue(line) Grundwerte sind Blöcke auf oberster Ebene mit Ausgaben, die an nichts angeschlossen sind. Abgeleitete Klassen können dies überschreiben, z.B. wenn ihre Sprache keine Grundwerte zulässt.
statementToCode(block, name) Generiert einen Codestring, der die Blöcke darstellt, die an die Eingabe der benannten Anweisung angehängt sind. Den Code einrücken Sie wird hauptsächlich in Generatoren verwendet. Wenn Sie Code zur Auswertung generieren möchten, verwenden Sie workspaceToCode oder blockToCode.
valueToCode(block, name, outerOrder) Generiert einen Code, der den angegebenen Wert darstellt.
workspaceToCode(workspace) Generieren Sie Code für alle Blöcke im Arbeitsbereich in der angegebenen Sprache.