ブロックする >CodeGenerator

CodeGenerator クラス

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

署名:

export declare class CodeGenerator 

コンストラクタ

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

プロパティ

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

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

- 関数が以下に定義するメソッド(blockToCode など)または関連するサブクラス(JavascripGenerator など)を呼び出せるようにするための、呼び出し元の CodeGenerator(またはサブクラス)インスタンス用のコードを生成するブロック。

次の結果が返されます。

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

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

メソッド

メソッド 修飾子 説明
addLoopTrap(branch, block) ループの内容に無限ループトラップを追加します。ループブロックの先頭(loop ステートメントの実行直後)にステートメントのサフィックスを追加し、loop ブロックの最後に(loop ステートメントの直前)にステートメントの接頭辞を追加します。
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, code)

生成されたコードに含めるデベロッパー定義の関数(ユーザー定義プロシージャではない)を定義します。プライベート ヘルパー関数の作成に使用されます。指定された requiredName でこれを初めて呼び出すと、コードが保存され、実際の名前が生成されます。同じ requestedName を持つ後続の呼び出しは効果がありませんが、戻り値は同じになります。

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

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

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