blockly > CodeGenerator

کلاس CodeGenerator

کلاس برای یک تولید کننده کد که بلوک ها را به یک زبان ترجمه می کند.

امضا:

export declare class CodeGenerator 

سازندگان

سازنده اصلاح کننده ها شرح
(سازنده) (نام) یک نمونه جدید از کلاس CodeGenerator می سازد

خواص

ویژگی اصلاح کننده ها تایپ کنید شرح
COMMENT_WRAP عدد حداکثر طول برای نظر قبل از بسته بندی. سطح تورفتگی را در نظر نمی گیرد.
تعاریف_ protected { [key: string]: string; } فرهنگ لغت تعاریف که باید قبل از کد چاپ شود.
forBlock Record<string, (block: Block , مولد: این) => [رشته، عدد] | رشته | null>

فرهنگ لغت توابع مولد بلوک که بر اساس نوع بلوک کلید خورده است. هر تابع مولد بلوک دو پارامتر دارد:

- Block برای تولید کد، و - نمونه فراخوانی CodeGenerator (یا subclass)، بنابراین تابع می تواند متدهای تعریف شده در زیر (مثلا blockToCode) یا در زیر کلاس مربوطه (مانند JavascripGenerator) را فراخوانی کند.

و برمی گرداند:

- یک تاپل [کد، اولویت] (برای بلوک‌های مقدار/عبارت)، یا - رشته‌ای حاوی کد تولید شده (برای بلوک‌های دستور)، یا - اگر هیچ کدی برای بلوک ارسال نشود، تهی است.

FUNCTION_NAME_PLACEHOLDER_ رشته این به عنوان یک مکان نگهدار در توابع تعریف شده با استفاده از CodeGenerator.provideFunction_ استفاده می شود. این نباید کد قانونی باشد که بتواند به طور قانونی در یک تعریف تابع (یا نظر) ظاهر شود، و نباید تجزیه کننده عبارت منظم را اشتباه بگیرد.
FUNCTION_NAME_PLACEHOLDER_REGEXP_ RegExp
نامهای تابع_ protected { [key: string]: string; } یک فرهنگ لغت نگاشت نام توابع مورد نظر در تعاریف_ به نام توابع واقعی (برای جلوگیری از برخورد با توابع کاربر).
تورفتگی رشته روش تورفتگی. پیش‌فرض دو فاصله است، اما مولدهای زبان ممکن است برای افزایش تورفتگی یا تغییر به برگه‌ها، این را لغو کنند.
INFINITE_LOOP_TRAP رشته | خالی کد دلخواه برای تزریق به مکان هایی که خطر ایجاد حلقه های نامحدود را دارند. هر نمونه از «% 1» با شناسه بلوکی که شکست خورده جایگزین می شود. به عنوان مثال checkTimeout(%1);\n
اولیه شده است بولی | خالی آیا متد init فراخوانی شده است یا خیر. مولدهایی که این پرچم را پس از ایجاد false و true را در init تنظیم می کنند، باعث می شوند که blockToCode در صورتی که مولد مقداردهی اولیه نشده باشد، اخطاری صادر می کند. اگر این پرچم دست نخورده باشد، اثری نخواهد داشت.
نام_ رشته
nameDB_؟ نام ها (اختیاری) پایگاه داده ای از نام متغیرها و رویه ها.
ORDER_OVERRIDES عدد[][] فهرست جفت‌های بیرونی و درونی که نیازی به پرانتز ندارند.
RESERVED_WORDS_ protected رشته فهرستی از کلمات رزرو شده با کاما جدا شده است.
STATEMENT_PREFIX رشته | خالی کد دلخواه برای تزریق قبل از هر عبارت. هر نمونه از "% 1" با شناسه بلوک عبارت جایگزین می شود. به عنوان مثال highlight(%1);\n
STATEMENT_SUFFIX رشته | خالی کد دلخواه برای تزریق بعد از هر عبارت. هر نمونه از "% 1" با شناسه بلوک عبارت جایگزین می شود. به عنوان مثال highlight(%1);\n

مواد و روش ها

روش اصلاح کننده ها شرح
addLoopTrap (شاخه، بلوک) یک تله حلقه بی نهایت به محتویات یک حلقه اضافه کنید. پسوند عبارت را در شروع بلوک حلقه (درست پس از اجرای دستور حلقه) و یک پیشوند عبارت را به انتهای بلوک حلقه (درست قبل از اجرای دستور حلقه) اضافه کنید.
addReservedWords(words) یک یا چند کلمه را به لیست کلمات رزرو شده برای این زبان اضافه کنید.
allNestedComments (مسدود کردن) به صورت بازگشتی درختی از بلوک ها را عنکبوت کنید و همه نظرات آنها را برگردانید.
blockToCode (block, opt_thisOnly) کد برای بلوک مشخص شده (و بلوک های پیوست شده) ایجاد کنید. قبل از فراخوانی این تابع، مولد باید مقداردهی اولیه شود.
پایان (کد) برای اجرای کد در پایان تولید کد قلاب کنید. کلاس‌های فرعی ممکن است این را لغو کنند، به عنوان مثال کد تولید شده را با عبارات واردات یا تعاریف متغیر اضافه کنند.
getProcedureName(name) یک نام قانونی و منحصر به فرد برای یک رویه تعریف شده توسط کاربر دریافت می کند. قبل از فراخوانی این متد، ویژگی nameDB_ کلاس باید از قبل مقداردهی اولیه شده باشد. این معمولاً در تابع init کلاس مولد کد انجام می شود.
getVariableName(nameOrId) یک نام قانونی و منحصر به فرد برای یک متغیر تعریف شده توسط کاربر دریافت می کند. قبل از فراخوانی این متد، ویژگی nameDB_ کلاس باید از قبل مقداردهی اولیه شده باشد. این معمولاً در تابع init کلاس مولد کد انجام می شود.
init(_workspace) قبل از شروع تولید کد، کد را قلاب کنید تا اجرا شود. کلاس های فرعی ممکن است این را لغو کنند، به عنوان مثال برای مقداردهی اولیه پایگاه داده نام متغیرها.
injectId (پیام، بلوک) برای جایگزینی «% 1»، شناسه بلوک را به پیام تزریق کنید. برای STATEMENT_PREFIX، STATEMENT_SUFFIX و INFINITE_LOOP_TRAP استفاده می شود.
خطوط پیشوند (متن، پیشوند) روی هر خط کد یک پیشوند مشترک اضافه کنید. برای تورفتگی کد یا افزودن نشانگرهای نظر در نظر گرفته شده است.
provideFunction_(DesiredName، کد)

یک تابع تعریف شده توسط توسعه دهنده (نه رویه تعریف شده توسط کاربر) را برای گنجاندن در کد تولید شده تعریف کنید. برای ایجاد توابع کمکی خصوصی استفاده می شود. اولین باری که با یک نام دلخواه داده شده فراخوانی می شود، کد ذخیره می شود و یک نام واقعی ایجاد می شود. تماس‌های بعدی با همان نام دلخواه تأثیری ندارند اما مقدار برگشتی یکسانی دارند.

این به تماس گیرنده بستگی دارد که مطمئن شود از همان نام دلخواه برای عملکردهای کمکی مختلف استفاده نمی شود (مثلاً از "colourRandom" و "listRandom" استفاده کنید، نه "تصادفی"). هیچ خطری برای برخورد با کلمات رزرو شده یا نام متغیرها یا روش های تعریف شده توسط کاربر وجود ندارد.

زمانی که CodeGenerator.finish() فراخوانی شود کد خروجی می گیرد.

scrub_(_block, code, _opt_thisOnly) protected وظایف رایج برای تولید کد از بلوک ها. این از blockToCode فراخوانی می شود و در هر بلوک، نه فقط بلوک های سطح بالا، فراخوانی می شود. کلاس های فرعی ممکن است این را لغو کنند، به عنوان مثال برای ایجاد کد برای عبارات پس از بلوک، یا برای رسیدگی به نظرات برای بلوک مشخص شده و هر بلوک مقدار متصل.
scrubNakedValue(خط) مقادیر برهنه بلوک های سطح بالایی با خروجی هایی هستند که به هیچ چیز متصل نیستند. کلاس‌های فرعی ممکن است این را نادیده بگیرند، به عنوان مثال اگر زبان آنها مقادیر خالی را مجاز نمی‌داند.
statementToCode (بلاک، نام) یک رشته کد ایجاد کنید که نشان دهنده بلوک های متصل به ورودی دستور نامگذاری شده است. کد را تورفتگی کنید. این عمدتا در ژنراتورها استفاده می شود. هنگام تلاش برای تولید کد برای ارزیابی، به استفاده از WorkspaceToCode یا blockToCode نگاه کنید.
valueToCode (block، نام، outerOrder) کدی را ایجاد کنید که نشان دهنده ورودی مقدار مشخص شده است.
WorkspaceToCode (فضای کاری) کد برای همه بلوک ها در فضای کاری به زبان مشخص شده ایجاد کنید.