blockly > CodeGenerator

CodeGenerator クラス

ブロックを言語に変換するコード生成ツールのクラス。

署名:

export declare class CodeGenerator 

コンストラクタ

コンストラクタ 修飾子 説明
(コンストラクタ)(名前) CodeGenerator クラスの新しいインスタンスを作成します。

プロパティ

プロパティ 修飾子 タイプ 説明
COMMENT_WRAP 数値 改行前のコメントの最大文字数。インデント レベルは考慮されません。
definitions_ protected { [キー: 文字列]: 文字列; } コードの前に出力される定義の辞書。
forBlock Record<string, (block: Block, generator: this) => [string, number] | string | null>

ブロックタイプをキーとするブロック ジェネレータ関数のディクショナリ。各ブロック ジェネレータ関数は、次の 2 つのパラメータを取ります。

- コードを生成するブロック、 - 呼び出し側の CodeGenerator(またはサブクラス)インスタンス。これにより、関数が以下(blockToCode など)または関連サブクラス(JavascripGenerator など)で定義されるメソッドを呼び出すことができます。

戻り値は次のとおりです。

- [コード、優先順位] タプル(値/式ブロックの場合)、または - 生成されたコードを含む文字列(ステートメント ブロックの場合)、または - ブロックに対してコードを出力しない場合は null。

FUNCTION_NAME_PLACEHOLDER_ string これは、CodeGenerator.provideFunction_ を使用して定義された関数でプレースホルダとして使用されます。関数定義(またはコメント)に正当に出現する可能性のある法的なコードは認められません。また、正規表現パーサーを混同してはなりません。
FUNCTION_NAME_PLACEHOLDER_REGEXP_ RegExp
functionNames_ protected { [キー: 文字列]: 文字列; } predicted_ 内の目的の関数名を実際の関数名にマッピングするディクショナリ(ユーザー関数との競合を回避するため)。
当初 string インデントの方法。デフォルトは 2 つのスペースですが、言語生成ツールによってインデントが増えたり、タブに変更されたりするためにこれをオーバーライドできます。
INFINITE_LOOP_TRAP 文字列 | null 無限ループが発生するおそれがある場所に注入する任意のコード。「%1」のインスタンスはすべて、失敗したブロック ID に置き換えられます。例: checkTimeout(%1);\n
isInitialized boolean | null init メソッドが呼び出されたかどうか。ジェネレータの作成後にこのフラグを false に設定し、init で true に設定すると、ジェネレータが初期化されていない場合、blockToCode が警告を発します。このフラグを変更しない場合、効果はありません。
name_ string
nameDB_? 名前 (省略可)変数名とプロシージャ名のデータベース。
ORDER_OVERRIDES 数値 [][] かっこを必要としない外側と内側のペア設定のリスト。
RESERVED_WORDS_ protected string 予約語のカンマ区切りリスト。
STATEMENT_PREFIX 文字列 | null 各ステートメントの前に挿入する任意のコード。「%1」のインスタンスはすべて、ステートメントのブロック ID に置き換えられます。例: highlight(%1);\n
STATEMENT_SUFFIX 文字列 | null 各ステートメントの後に挿入する任意のコード。「%1」のインスタンスはすべて、ステートメントのブロック ID に置き換えられます。例: highlight(%1);\n

メソッド

メソッド 修飾子 説明
addLoopTrap(branch, block) ループの内容に無限ループトラップを追加します。ループ ブロックの先頭(ループ ステートメントの実行直後)にステートメント接尾辞を追加し、ループ ブロックの最後に(ループ ステートメントの実行直前)にステートメント接頭辞を追加します。
addReservedWords(words) この言語の予約語のリストに 1 つ以上の単語を追加します。
allNestedComments(block) ブロックのツリーを再帰的にスパイダーし、すべてのコメントを返します。
blockToCode(block, opt_thisOnly) 指定したブロック(および接続されたブロック)のコードを生成します。この関数を呼び出す前に、ジェネレータを初期化する必要があります。
finish(code) コード生成の終了時に実行するコードのフック。サブクラスでこれをオーバーライドできます。たとえば、生成されたコードの前に import ステートメントや変数定義を付加できます。
getProcedureName(name) ユーザー定義プロシージャの一意の正式名を取得します。このメソッドを呼び出す前に、クラスの nameDB_ プロパティがすでに初期化されている必要があります。これは通常、コード生成クラスの init 関数で行います。
getVariableName(nameOrId) ユーザー定義変数の一意の正式名を取得します。このメソッドを呼び出す前に、クラスの nameDB_ プロパティがすでに初期化されている必要があります。これは通常、コード生成クラスの init 関数で行います。
init(_workspace) コード生成の開始前に実行するコードのフック。サブクラスでこれをオーバーライドできます(変数名のデータベースを初期化する場合など)。
injectId(msg, block) ブロック ID をメッセージに挿入して、「%1」を置き換えます。STATEMENT_PREFIX、STATEMENT_SUFFIX、INFINITE_LOOP_TRAP に使用されます。
prefixLines(text, prefix) コードの各行の先頭に共通の接頭辞を付けます。コードのインデントやコメント マーカーの追加を対象としています。
provideFunction_(desiredName, コード)

生成されたコードに含めるユーザー定義の関数ではなく、デベロッパー定義の関数を定義します。非公開ヘルパー関数を作成するために使用します。これが指定された requiredName で初めて呼び出されると、コードが保存され、実際の名前が生成されます。同じ requiredName の後続の呼び出しは効果がありませんが、同じ戻り値になります。

複数のヘルパー関数で同じ requiredName が使用されないようにするかどうかは呼び出し元が決定します(たとえば、「random」ではなく「colourRandom」と「listRandom」を使用します)。予約語、またはユーザー定義の変数名またはプロシージャ名と競合する危険はありません。

CodeGenerator.finish() が呼び出されると、コードが出力されます。

scrub_(_block, code, _opt_thisOnly) ブロックからコードを生成するための一般的なタスク。これは blockToCode から呼び出され、トップレベル ブロックだけでなくすべてのブロックで呼び出されます。サブクラスでこれをオーバーライドできます。たとえば、ブロックに続くステートメントのコードを生成する場合や、指定されたブロックと接続された値ブロックのコメントを処理する場合などです。
scrubNakedValue(line) ネイキッド値は、何にもプラグインされていない出力を持つトップレベルのブロックです。サブクラスでこれをオーバーライドすることもできます(たとえば、言語でネイキッド値を使用できない場合)。
statementToCode(block, name) 名前付きステートメント入力に接続されるブロックを表すコード文字列を生成します。コードをインデントします。これは主にジェネレータで使用されます。評価するコードを生成する場合は、workspaceToCode または blockToCode を使用してください。
valueToCode(block, name, outerOrder) 指定された値の入力を表すコードを生成します。
workspaceToCode(workspace) ワークスペース内のすべてのブロックのコードを特定の言語で生成します。