Klasa CodeGenerator
Klasa generatora kodu, który tłumaczy bloki na język.
Podpis:
export declare class CodeGenerator
Zespoły
Zespół | Modyfikatory | Opis |
---|---|---|
(konstruktor)(nazwa) | Tworzy nową instancję klasy CodeGenerator |
Właściwości
Właściwość | Modyfikatory | Typ | Opis |
---|---|---|---|
COMMENT_WRAP | liczba | Maksymalna długość komentarza przed zawijaniem tekstu. Nie uwzględnia poziomu wcięcia. | |
definitions_ | protected |
{ [klucz: ciąg znaków]: ciąg znaków; | Słownik definicji do wydrukowania przed kodem. |
forBlock | Record<string, (blok: Block, generator: this) => [ciąg, liczba] | ciąg znaków | null> | Słownik funkcji generatora bloków z kluczami według typu bloku. Każda funkcja generatora bloków przyjmuje 2 parametry: – blok do generowania kodu oraz – wywoływanie instancji CodeGenerator (lub podklasa), przez co funkcja może wywoływać metody zdefiniowane poniżej (np. blockToCode) lub w odpowiednim podklasie (np. JavascripGenerator), i zwraca: – [kod, pierwszeństwo] krotka (dla bloków wartości/wyrażeń) lub – ciąg tekstowy zawierający wygenerowany kod (w przypadku bloków instrukcji) lub – wartość null, jeśli dla bloku nie zostanie wysłany żaden kod. |
|
FUNCTION_NAME_PLACEHOLDER_ | ciąg znaków | Jest ona używana jako zmienna w funkcjach zdefiniowanych za pomocą CodeGenerator.provideFunction_. Nie może to być kod prawny, który może legalnie pojawić się w definicji funkcji (lub komentarzu), ani nie może dezorientować parsera wyrażeń regularnych. | |
FUNCTION_NAME_PLACEHOLDER_REGEXP_ | RegExp | ||
functionNames_ | protected |
{ [klucz: ciąg znaków]: ciąg znaków; | Słownik mapujący odpowiednie nazwy funkcji w definicjach na rzeczywiste nazwy funkcji (aby uniknąć kolizji z funkcjami użytkownika). |
PRZYPADKOWA | ciąg znaków | Metoda wcięcia. Wartość domyślna to 2 spacje, ale generatory języków mogą to zmienić, aby zwiększyć wcięcie lub zmienić je na tabulatory. | |
INFINITE_LOOP_TRAP | ciąg znaków | wartość null | Dowolny kod do wstrzykiwania w miejscach, które mogą spowodować zapętlenie. Wszystkie wystąpienia „%1” zostanie zastąpione identyfikatorem bloku, którego nie udało się przenieść. Na przykład: checkTimeout(%1);\n |
|
isInitialized | boolean | wartość null | Określa, czy metoda init została wywołana. Generatory, które ustawią tę flagę na „false” po utworzeniu i na „true” w init, będą powodować, że blockToCode będzie wyświetlać ostrzeżenie, jeśli generator nie został zainicjowany. Jeśli flaga nie zostanie zmieniona, nic się nie zmieni. | |
name_ | ciąg znaków | ||
nameDB_? | Nazwy | (Opcjonalnie) Baza danych z nazwami zmiennych i procedur. | |
ORDER_OVERRIDES | liczba[][] | Lista połączeń zewnętrznych i wewnętrznych, które NIE wymagają nawiasów. | |
RESERVED_WORDS_ | protected |
ciąg znaków | Rozdzielona przecinkami lista zarezerwowanych słów. |
STATEMENT_PREFIX | ciąg znaków | wartość null | Dowolny kod do wstawienia przed każdym instrukcją. Wszystkie wystąpienia „%1” zostanie zastąpiony identyfikatorem bloku instrukcji. Na przykład: highlight(%1);\n |
|
STATEMENT_SUFFIX | ciąg znaków | wartość null | Dowolny kod do wstrzykiwania po każdej instrukcji. Wszystkie wystąpienia „%1” zostanie zastąpiony identyfikatorem bloku instrukcji. Na przykład: highlight(%1);\n |
Metody
Metoda | Modyfikatory | Opis |
---|---|---|
addLoopTrap(branch, block) | Dodaj nieskończoną pętlę do zawartości pętli. Dodaj sufiks instrukcji na początku bloku pętli (zaraz po wykonaniu instrukcji pętli) oraz prefiks instrukcji na końcu bloku pętli (tuż przed wykonaniem instrukcji pętli). | |
addReservedWords(words) | Dodaj co najmniej 1 słowo do listy słów zarezerwowanych w tym języku. | |
allNestedComments(block) | cyklicznie przesuwaj drzewo bloków i zwracaj wszystkie swoje komentarze. | |
blockToCode(block, opt_thisOnly) | Wygeneruj kod dla określonego bloku (i dołączonych bloków). Przed wywołaniem tej funkcji należy zainicjować generator. | |
finish(code) | Zaczep, aby kod uruchomił się na końcu generowania kodu. Podklasy mogą to zastąpić, np. aby dołączyć wygenerowany kod do instrukcji importu lub definicji zmiennych. | |
getProcedureName(name) | Pobiera unikalną nazwę prawną dla procedury zdefiniowanej przez użytkownika. Zanim wywołasz tę metodę, właściwość nameDB_ klasy musi być już zainicjowana. Zwykle odbywa się to w funkcji init klasy generatora kodu. |
|
getVariableName(nameOrId) | Pobiera unikalną nazwę prawną dla zmiennej zdefiniowanej przez użytkownika. Zanim wywołasz tę metodę, właściwość nameDB_ klasy musi być już zainicjowana. Zwykle odbywa się to w funkcji init klasy generatora kodu. |
|
init(_workspace) | Uchwyć, aby kod uruchomił się przed rozpoczęciem generowania kodu. Podklasy mogą to zastąpić, np. do zainicjowania bazy danych z nazwami zmiennych. | |
injectId(msg, block) | Wstaw identyfikator bloku do wiadomości, aby zastąpić „%1”. Używana w przypadku STATEMENT_PREFIX, STATEMENT_SUFFIX i INFINITE_LOOP_TRAP. | |
prefixLines(text, prefix) | Na początku każdego wiersza kodu dołącz wspólny prefiks. Umożliwia dodawanie wcięć kodu i dodawanie znaczników komentarzy. | |
ProvideFunction_(desiredName, kod) | Zdefiniuj funkcję zdefiniowaną przez programistę (nie procedurę zdefiniowaną przez użytkownika), która ma zostać uwzględniona w wygenerowanym kodzie. Służy do tworzenia prywatnych funkcji pomocniczych. Przy pierwszym wywołaniu tej funkcji z określoną nazwą pożądaną kod jest zapisywany i generowana jest rzeczywista nazwa. Kolejne wywołania z taką samą wartością requestedName nie będą działać, ale będą miały tę samą zwracaną wartość. Obowiązkiem elementu wywołującego jest upewnienie się, że ta sama żądanaName nie jest używana dla różnych funkcji pomocniczych (np. należy użyć wartości „colourRandom” i „listRandom”, a nie „random”). Nie ma tu ryzyka zderzenia z zarezerwowanymi słowami, zdefiniowanymi przez użytkownika nazwami zmiennych i procedur. Kod pojawia się po wywołaniu CodeGenerator.finish(). |
|
scrub_(_blok, kod, _opt_thisOnly) | Typowe zadania związane z generowaniem kodu na podstawie bloków. Ta funkcja jest wywoływana z blockToCode i w przypadku każdego bloku, a nie tylko bloków najwyższego poziomu. Podklasy mogą to zastąpić, np. do generowania kodu dla instrukcji następujących po bloku lub do obsługi komentarzy dla określonego bloku i dowolnych połączonych bloków wartości. | |
scrubNakedValue(line) | Same wartości to bloki najwyższego poziomu z wyjściami, które nie są do niczego podłączone. Podklasy mogą to zastąpić, np. jeśli w ich języku nie można używać samych wartości. | |
statementToCode(block, name) | Wygeneruj ciąg kodu reprezentujący bloki dołączone do danych wejściowych z nazwaną instrukcją. Dodaj wcięcie. Jest on używany głównie w generatorach. Generując kod do oceny, skup się na metodzie workspaceToCode lub blockToCode. | |
valueToCode(block, name, outerOrder) | Wygeneruj kod reprezentujący określoną wartość wejściową. | |
workspaceToCode(workspace) | Wygeneruj kod dla wszystkich bloków w obszarze roboczym w określonym języku. |