שיעור CodeGenerator
מחלקה למחולל קוד שמתרגם את הבלוקים לשפה.
Signature:
export declare class CodeGenerator
יצרנים
יצרן | גורמי שינוי | התיאור |
---|---|---|
(constructor)(name) | יצירת מופע חדש של המחלקה CodeGenerator |
תכונות
נכס | גורמי שינוי | תיאור | התיאור |
---|---|---|---|
COMMENT_WRAP | מספר | אורך מקסימלי של תגובה לפני גלישת טקסט. רמת כניסת הפיסקה לא נלקחת בחשבון. | |
definitions_ | protected |
{ [key: string]: string; } | מילון של הגדרות להדפסה לפני הקוד. |
forBlock | Record<string, (block: Block, generator: this) => [string, number] | string | null> | מילון של פונקציות של מחולל בלוקים עם קידוד לפי סוג הבלוק. כל פונקציית מחולל בלוקים מקבלת שני פרמטרים: - הבלוק ליצירת קוד, וגם - למופע הקריאה של CodeGenerator (או מחלקה משנית), כך שהפונקציה תוכל לקרוא ל-methods שמוגדרים למטה (למשל, blockToCode) או במחלקת המשנה הרלוונטית (למשל JavascripGenerator), והחזרות: - ציפלג [קוד, קדימות] (עבור בלוקים של ערך/ביטוי), או - מחרוזת שמכילה את הקוד שנוצר (לבלוקים של הצהרות), או - null אם לא יופק קוד לבלוק. |
|
FUNCTION_NAME_PLACEHOLDER_ | מחרוזת | הוא משמש כ-placeholder בפונקציות שמוגדרות באמצעות CodeGenerator.provideFunction_. אסור שהוא יהיה קוד משפטי שיכול להופיע באופן לגיטימי בהגדרת פונקציה (או בתגובה), והוא לא יבלבל את המנתח של הביטוי הרגולרי. | |
FUNCTION_NAME_PLACEHOLDER_REGEXP_ | RegExp | ||
functionNames_ | protected |
{ [key: string]: string; } | מילון שממפה את השמות של הפונקציות הרצויות בהגדרות_לשמות הפונקציות בפועל (כדי למנוע התנגשויות עם פונקציות משתמש). |
נסיעה | מחרוזת | השיטה של כניסת פיסקה. ברירת המחדל היא שני רווחים, אבל מחוללי שפות עשויים לעקוף זאת כדי להגדיל את כניסת הפיסקה או לעבור לכרטיסיות. | |
INFINITE_LOOP_TRAP | מחרוזת | null | קוד שרירותי להחדרה למיקומים שעלולים לגרום ללולאות אינסופיות. כל המופעים של '%1' יוחלפו במזהה החסימה שנכשל. לדוגמה: checkTimeout(%1);\n |
|
isInitialized | boolean | null | האם בוצעה קריאה ל-method init. גנרטורים המגדירים את הסימון הזה כ-FALSE לאחר היצירה ו-true in init יגרמו ל-blockToCode לפלוט אזהרה אם המחולל לא הופעל. אם לא בוצע שינוי בסימון הזה, לא תהיה לו השפעה. | |
name_ | מחרוזת | ||
nameDB_? | שמות | (אופציונלי) מסד נתונים של שמות משתנים והליכים. | |
ORDER_OVERRIDES | מספר[][] | רשימת צמדים חיצוניים-פנימיים שלא מחייבים סוגריים. | |
RESERVED_WORDS_ | protected |
מחרוזת | רשימה של מילים שמורות שמופרדות בפסיקים. |
STATEMENT_PREFIX | מחרוזת | null | קוד שרירותי שצריך להחדיר לפני כל הצהרה. כל המופעים של '%1' יוחלפו במזהה החסימה של ההצהרה. לדוגמה: highlight(%1);\n |
|
STATEMENT_SUFFIX | מחרוזת | null | קוד שרירותי שיש להחדיר אחרי כל הצהרה. כל המופעים של '%1' יוחלפו במזהה החסימה של ההצהרה. לדוגמה: highlight(%1);\n |
שיטות
שיטה | גורמי שינוי | התיאור |
---|---|---|
addLoopTrap(branch, block) | הוספה של מלכודת לולאה אינסופית לתוכן של לולאה. מוסיפים סיומת של הצהרה בתחילת חסימת הלולאה (ממש אחרי שהצהרת הלולאה מופעלת), ותחילית של הצהרה בסוף חסימת הלולאה (ממש לפני שהצהרת הלולאה מופעלת). | |
addReservedWords(words) | יש להוסיף מילה אחת או יותר לרשימת המילים השמורות לשפה זו. | |
allNestedComments(block) | עכבישים רקורסים על עץ של בלוקים, מחזירים את כל התגובות שלהם. | |
blockToCode(block, opt_thisOnly) | יוצרים קוד לבלוק שצוין (ולבלוקים המצורפים). צריך לאתחל את המחולל לפני הקריאה לפונקציה הזו. | |
finish(code) | יש לסמן את התיבה כדי שקוד יופעל בסיום יצירת הקוד. מחלקות משנה יכולות לבטל זאת, למשל להוסיף לפני הקוד שנוצר הצהרות ייבוא או הגדרות משתנים. | |
getProcedureName(name) | מקבל שם חוקי ייחודי לתהליך בהגדרת המשתמש. לפני הקריאה לשיטה הזו, המאפיין nameDB_ של המחלקה חייב להיות כבר אותחל. בדרך כלל הפעולה הזו מתבצעת בפונקציה init של המחלקה של מחולל הקוד. |
|
getVariableName(nameOrId) | הפונקציה מקבלת שם חוקי וייחודי למשתנה שהוגדר על ידי המשתמש. לפני הקריאה לשיטה הזו, המאפיין nameDB_ של המחלקה חייב להיות כבר אותחל. בדרך כלל הפעולה הזו מתבצעת בפונקציה init של המחלקה של מחולל הקוד. |
|
init(_workspace) | יש לסמן את התיבה להפעלת הקוד לפני שמתחילה יצירת הקוד. מחלקות משנה עשויות לשנות זאת, למשל כדי לאתחל את מסד הנתונים של שמות המשתנים. | |
injectId(msg, block) | אפשר להוסיף מזהה חסימה להודעה כדי להחליף את '%1'. משמש עבור STATEMENT_PREFIX, STATEMENT_SUFFIX ו-INFINITE_LOOP_TRAP. | |
prefixLines(text, prefix) | מוסיפים קידומת נפוצה בכל שורת קוד. מיועד לכניסת קוד או להוספת סמני תגובות. | |
provideFunction_(desiredName, code) | מגדירים פונקציה בהגדרת המפתח (לא תהליך בהגדרת המשתמש) שתיכלל בקוד שנוצר. משמש ליצירת פונקציות עזר פרטיות. בפעם הראשונה שבה מתבצעת קריאה עם שם נתון, הקוד נשמר ונוצר שם בפועל. לקריאות הבאות עם אותו wantName אין השפעה, אבל הערך המוחזר יהיה זהה. באחריות המתקשר לוודא שאותו שם רצוי לא ישמש לפונקציות מסייעות שונות (למשל, שימוש ב-"colourRandom" ו-"listRandom", ולא ב "אקראי"). אין סכנה של התנגשות בין מילים שמורות או שמות של משתנים או הליכים שהוגדרו על ידי המשתמש. הקוד מקבל פלט בעת קריאה ל-CodeGenerator.finish() . |
|
scrub_(_block, code, _opt_thisOnly) | protected |
משימות נפוצות ליצירת קוד מבלוקים. הוא נקרא מ-blockToCode והוא נקרא בכל בלוק, לא רק בלוקים ברמה העליונה. מחלקות משנה יכולות לבטל זאת, למשל כדי ליצור קוד להצהרות אחרי החסימה, או כדי לטפל בתגובות לבלוק שצוין ולכל בלוקי ערכים מחוברים. |
scrubNakedValue(line) | ערכים ללא קידומת הם בלוקים ברמה העליונה עם פלטים שלא מחוברים לשום דבר. מחלקות משנה עשויות לשנות את ההגדרה הזו, לדוגמה, אם השפה שלהן לא מאפשרת ערכי עירום. | |
statementToCode(block, name) | יוצרים מחרוזת קוד שמייצגת את הבלוקים שמצורפים לקלט בעל השם. מוסיפים כניסת פסקה לקוד. הוא משמש בעיקר בגנרטורים. כשמנסים ליצור קוד להערכה של שימוש ב-workspaceToCode או ב-blockToCode, צריך לבדוק את הבקשה. | |
valueToCode(block, name, outerOrder) | יצירת קוד שמייצג את הערך שצוין. | |
workspaceToCode(workspace) | יצירת קוד לכל הבלוקים בסביבת העבודה בשפה שצוינה. |