Upload block_relation_builder.py
Browse files- utils/block_relation_builder.py +240 -14
utils/block_relation_builder.py
CHANGED
|
@@ -3441,6 +3441,215 @@ def _find_all_opcodes(code_block: str) -> list[str]:
|
|
| 3441 |
# Define a list of regex patterns and their corresponding opcodes,
|
| 3442 |
# ordered from most specific to least specific. The re.DOTALL flag
|
| 3443 |
# allows '.' to match newlines, which is crucial for multi-line blocks.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3444 |
patterns = [
|
| 3445 |
# --- Multi-line Control Blocks (most specific, non-greedy) ---
|
| 3446 |
(r"if <.+?> then(?:.|\n)+?else(?:.|\n)+?end", "control_if_else"), #(to test muliple stack)
|
|
@@ -3452,7 +3661,8 @@ def _find_all_opcodes(code_block: str) -> list[str]:
|
|
| 3452 |
# (r"stop\s+(?:all|this script|other scripts in sprite|\[(?:all|this script|other scripts in sprite)(?:\s+v)?\])", "control_stop"),
|
| 3453 |
(r"stop\s+(?:all|this script|other scripts in sprite|\[(?:all|this script|other scripts in sprite)(?:\s+v)?\])(?!\s+sounds)", "control_stop"),
|
| 3454 |
(r"when I start as a clone", "control_start_as_clone"),
|
| 3455 |
-
(r"create clone of \[.+?(?:\s+v)?\]", "control_create_clone_of"),
|
|
|
|
| 3456 |
(r"delete this clone", "control_delete_this_clone"),
|
| 3457 |
(r"wait\s+(?:\(.+?\)|\[.+?(?:\s+v)?\]|\S+)\s+sec(?:ond)?s?", "control_wait"),
|
| 3458 |
(r"wait until <.+?>", "control_wait_until"),
|
|
@@ -3462,19 +3672,28 @@ def _find_all_opcodes(code_block: str) -> list[str]:
|
|
| 3462 |
(r"when (green )?flag click(ed)?", "event_whenflagclicked"),
|
| 3463 |
(r"when\s+(?:key\s+\[(.+?)(?:\s+v)?\]|\[(.+?)(?:\s+v)?\]\s+key)\s+pressed", "event_whenkeypressed"),
|
| 3464 |
(r"when this sprite clicked", "event_whenthisspriteclicked"),
|
| 3465 |
-
(r"when backdrop switches to \[.+?(?:\s+v)?\]", "event_whenbackdropswitchesto"),
|
| 3466 |
-
(r"when I receive \[.+?(?:\s+v)?\]", "event_whenbroadcastreceived"),
|
| 3467 |
(r"when \[.+?(?:\s+v)?\] > (.+)", "event_whengreaterthan"),
|
| 3468 |
-
(r"broadcast \[.+?(?:\s+v)?\] and wait", "event_broadcastandwait"),
|
| 3469 |
-
(r"broadcast \[.+?(?:\s+v)?\]", "event_broadcast"),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3470 |
|
| 3471 |
# --- Data Blocks (Variables and Lists) - specific block types first ---
|
| 3472 |
(r"set\s*\[\s*.+?(?:\s+v)?\s*\]\s*to\s*\(?\s*.+?\s*\)?", "data_setvariableto"),
|
| 3473 |
(r"change\s*\[\s*.+?(?:\s+v)?\s*\]\s*by\s*\(?\s*.+?\s*\)?", "data_changevariableby"),
|
| 3474 |
-
(r"show variable \[.+?(?:\s+v)?\]", "data_showvariable"),
|
| 3475 |
-
(r"hide variable \[.+?(?:\s+v)?\]", "data_hidevariable"),
|
| 3476 |
-
(r"show list \[.+?(?:\s+v)?\]", "data_showlist"),
|
| 3477 |
-
(r"hide list \[.+?(?:\s+v)?\]", "data_hidelist"),
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3478 |
(r"add\s+(?:\[.+?\]|\(.+?\)|\w+)\s+to\s+\[.+?(?:\s+v)?\]", "data_addtolist"),
|
| 3479 |
(r"delete\s*\((?!all\)).+?\)\s*of\s*\[.+?(?:\s+v)?\]", "data_deleteoflist"),
|
| 3480 |
(r"delete\s*\(all\)\s*of\s*\[.+?(?:\s+v)?\]", "data_deletealloflist"),
|
|
@@ -3505,7 +3724,8 @@ def _find_all_opcodes(code_block: str) -> list[str]:
|
|
| 3505 |
# (r"touching\s*(?:color\s*)?#\w{6}\??", "sensing_touchingcolor"),
|
| 3506 |
(r"(?<!is\s)touching\s*(?:color\s*)?\[?\s*#([0-9A-Fa-f]{6})\s*\]?\??", "sensing_touchingcolor"),
|
| 3507 |
(r"touching \[.+? v\]\??", "sensing_touchingobject"),
|
| 3508 |
-
(r"set drag mode \[.+? v\]", "sensing_setdragmode"),
|
|
|
|
| 3509 |
(r"reset timer", "sensing_resettimer"),
|
| 3510 |
# (r"(?<!at\s)(?<!item\s)\(.+? of \[.+? v]\)", "sensing_of"),
|
| 3511 |
#(r"(?<!at\s)(?<!item\s)(?<!item\s)(?<!delete\s)[(].+? of \[.+? v\]", "sensing_of"),
|
|
@@ -3550,7 +3770,8 @@ def _find_all_opcodes(code_block: str) -> list[str]:
|
|
| 3550 |
(r"go to\s*(?:random position|mouse-pointer|\[.*?\]|.+)", "motion_goto"), #(to mouse-pointer is not include here for now)
|
| 3551 |
# (r"point in direction (.+)", "motion_pointindirection"),
|
| 3552 |
(r"point in direction\s*\(?(.+?)\)?", "motion_pointindirection"),
|
| 3553 |
-
(r"point towards \[.+? v\]", "motion_pointtowards"),
|
|
|
|
| 3554 |
# (r"change x by (.+)", "motion_changexby"),
|
| 3555 |
# (r"change y by (.+)", "motion_changeyby"),
|
| 3556 |
(r"change x by\s*\(?(.+?)\)?", "motion_changexby"),
|
|
@@ -3567,10 +3788,14 @@ def _find_all_opcodes(code_block: str) -> list[str]:
|
|
| 3567 |
(r"\(?direction\)?", "motion_direction"), #(to direction may detect where var is used)
|
| 3568 |
|
| 3569 |
# --- Looks Blocks ---
|
| 3570 |
-
(r"switch costume to \[.+? v\]", "looks_switchcostumeto"),
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3571 |
(r"next costume", "looks_nextcostume"),
|
| 3572 |
-
(r"switch backdrop to
|
| 3573 |
-
(r"switch backdrop to
|
| 3574 |
(r"next backdrop", "looks_nextbackdrop"),
|
| 3575 |
(r"^\s*show\s*$", "looks_show"),
|
| 3576 |
(r"^\s*hide\s*$", "looks_hide"),
|
|
@@ -3730,6 +3955,7 @@ def analyze_opcode_counts(pseudo_code: str) -> list[dict]:
|
|
| 3730 |
# scripts.append(script.strip())
|
| 3731 |
|
| 3732 |
# return scripts
|
|
|
|
| 3733 |
def separate_scripts(pseudocode_string):
|
| 3734 |
"""
|
| 3735 |
Separates a block of Scratch pseudocode into a list of individual scripts.
|
|
|
|
| 3441 |
# Define a list of regex patterns and their corresponding opcodes,
|
| 3442 |
# ordered from most specific to least specific. The re.DOTALL flag
|
| 3443 |
# allows '.' to match newlines, which is crucial for multi-line blocks.
|
| 3444 |
+
# patterns = [
|
| 3445 |
+
# # --- Multi-line Control Blocks (most specific, non-greedy) ---
|
| 3446 |
+
# (r"if <.+?> then(?:.|\n)+?else(?:.|\n)+?end", "control_if_else"), #(to test muliple stack)
|
| 3447 |
+
# # (r"if <.+?> then", "control_if"),
|
| 3448 |
+
# (r"if <.+?> then(?:(?!else).|\n)+?end", "control_if"),
|
| 3449 |
+
# (r"forever", "control_forever"),
|
| 3450 |
+
# (r"repeat until <.+?>", "control_repeat_until"),
|
| 3451 |
+
# (r"repeat\s+(?:\(.+?\)|\[.+?(?:\s+v)?\]|\S+)", "control_repeat"),
|
| 3452 |
+
# # (r"stop\s+(?:all|this script|other scripts in sprite|\[(?:all|this script|other scripts in sprite)(?:\s+v)?\])", "control_stop"),
|
| 3453 |
+
# (r"stop\s+(?:all|this script|other scripts in sprite|\[(?:all|this script|other scripts in sprite)(?:\s+v)?\])(?!\s+sounds)", "control_stop"),
|
| 3454 |
+
# (r"when I start as a clone", "control_start_as_clone"),
|
| 3455 |
+
# (r"create clone of \[.+?(?:\s+v)?\]", "control_create_clone_of"),
|
| 3456 |
+
# (r"delete this clone", "control_delete_this_clone"),
|
| 3457 |
+
# (r"wait\s+(?:\(.+?\)|\[.+?(?:\s+v)?\]|\S+)\s+sec(?:ond)?s?", "control_wait"),
|
| 3458 |
+
# (r"wait until <.+?>", "control_wait_until"),
|
| 3459 |
+
|
| 3460 |
+
# # --- Event Blocks (most specific) ---
|
| 3461 |
+
# # (r"when green flag clicked", "event_whenflagclicked"),
|
| 3462 |
+
# (r"when (green )?flag click(ed)?", "event_whenflagclicked"),
|
| 3463 |
+
# (r"when\s+(?:key\s+\[(.+?)(?:\s+v)?\]|\[(.+?)(?:\s+v)?\]\s+key)\s+pressed", "event_whenkeypressed"),
|
| 3464 |
+
# (r"when this sprite clicked", "event_whenthisspriteclicked"),
|
| 3465 |
+
# (r"when backdrop switches to \[.+?(?:\s+v)?\]", "event_whenbackdropswitchesto"),
|
| 3466 |
+
# (r"when I receive \[.+?(?:\s+v)?\]", "event_whenbroadcastreceived"),
|
| 3467 |
+
# (r"when \[.+?(?:\s+v)?\] > (.+)", "event_whengreaterthan"),
|
| 3468 |
+
# (r"broadcast \[.+?(?:\s+v)?\] and wait", "event_broadcastandwait"),
|
| 3469 |
+
# (r"broadcast \[.+?(?:\s+v)?\]", "event_broadcast"),
|
| 3470 |
+
|
| 3471 |
+
# # --- Data Blocks (Variables and Lists) - specific block types first ---
|
| 3472 |
+
# (r"set\s*\[\s*.+?(?:\s+v)?\s*\]\s*to\s*\(?\s*.+?\s*\)?", "data_setvariableto"),
|
| 3473 |
+
# (r"change\s*\[\s*.+?(?:\s+v)?\s*\]\s*by\s*\(?\s*.+?\s*\)?", "data_changevariableby"),
|
| 3474 |
+
# (r"show variable \[.+?(?:\s+v)?\]", "data_showvariable"),
|
| 3475 |
+
# (r"hide variable \[.+?(?:\s+v)?\]", "data_hidevariable"),
|
| 3476 |
+
# (r"show list \[.+?(?:\s+v)?\]", "data_showlist"),
|
| 3477 |
+
# (r"hide list \[.+?(?:\s+v)?\]", "data_hidelist"),
|
| 3478 |
+
# (r"add\s+(?:\[.+?\]|\(.+?\)|\w+)\s+to\s+\[.+?(?:\s+v)?\]", "data_addtolist"),
|
| 3479 |
+
# (r"delete\s*\((?!all\)).+?\)\s*of\s*\[.+?(?:\s+v)?\]", "data_deleteoflist"),
|
| 3480 |
+
# (r"delete\s*\(all\)\s*of\s*\[.+?(?:\s+v)?\]", "data_deletealloflist"),
|
| 3481 |
+
# # (r"insert (.+?) at (\(.+?\)|\[.+?\]|\(\[.+?\]\)) of \[.+?(?:\s+v)?\]", "data_insertatlist"),
|
| 3482 |
+
# (r"insert\s+(\(.+?\)|\[.+?\]|\(\[.+?\]\)|[^\s]+)\s+at\s+(\(.+?\)|\[.+?\]|\(\[.+?\]\)|\d+)\s+of\s+\[.+?(?:\s+v)?\]", "data_insertatlist"),
|
| 3483 |
+
# # (r"replace item (.+?) of \[.+?(?:\s+v)?\] with (.+)", "data_replaceitemoflist"),
|
| 3484 |
+
# # (r"replace item\s+(\(.+?\)|\[\s*.+?\s*(?:v)?\]|.+?)\s+of\s+\[.+?(?:\s+v)?\]\s+with\s+(.+)", "data_replaceitemoflist"),
|
| 3485 |
+
# (r"replace\s+item\s+(\(.+?\)|\[\s*.+?\s*(?:v)?\]|[^\s]+)\s+of\s+\[.+?(?:\s+v)?\]\s+with\s+(\(.+?\)|\[\s*.+?\s*(?:v)?\]|.+)","data_replaceitemoflist"),
|
| 3486 |
+
# # (r"\[.+?(?:\s+v)?\] contains \[.+?\]\?", "data_listcontainsitem"),
|
| 3487 |
+
# # (r"<?\s*\[.+?(?:\s+v)?\] contains \(?\[.+?(?:\s+v)?\]\)?\s*\?>?", "data_listcontainsitem"),
|
| 3488 |
+
# (r"[<(]\s*\[[^\]]+?\s+v\]\s*contains\s*\[[^\]]+?\]\s*\??\s*[)>]", "data_listcontainsitem"),
|
| 3489 |
+
# # (r"\(item \# of (.+?) in \[.+?(?:\s+v)?\]\)", "data_itemnumoflist"),
|
| 3490 |
+
# (r"\(item\s+#\s+of\s+\(?(.+?)\)?\s+in\s+\[.+?(?:\s+v)?\]\)", "data_itemnumoflist"),
|
| 3491 |
+
# # (r"\(item (.+?) of \[.+?(?:\s+v)?\]\)", "data_itemoflist"),
|
| 3492 |
+
# # (r"\(?item\s+(.+?)\s+of\s+\[.+?(?:\s+v)?\]\)?", "data_itemoflist"),
|
| 3493 |
+
# # (r"(?<!replace\s)\(?item\s+(\(.+?\)|\[\s*.+?\s*(?:v)?\]|[^\s]+)\s+of\s+\[.+?(?:\s+v)?\]\)?", "data_itemoflist"),
|
| 3494 |
+
# (r"(?<!replace\s)\(?item(?!\s+#)\s+(\(.+?\)|\[\s*.+?\s*(?:v)?\]|[^\s]+)\s+of\s+\[.+?(?:\s+v)?\]\)?", "data_itemoflist"),
|
| 3495 |
+
# (r"\(length of \[.+?(?:\s+v)?\]\)", "data_lengthoflist"),
|
| 3496 |
+
|
| 3497 |
+
# # --- Sensing Blocks ---
|
| 3498 |
+
# (r"ask \[.+?\] and wait", "sensing_askandwait"),
|
| 3499 |
+
# # (r"key \[.+? v\] pressed\??", "sensing_keypressed"),
|
| 3500 |
+
# (r"(?<!when\s)key\s+\[.+?(?:\s+v)?\]\s+pressed\??", "sensing_keypressed"),
|
| 3501 |
+
# (r"mouse down\??", "sensing_mousedown"),
|
| 3502 |
+
# # (r"color #\w{6} is touching #\w{6}\??", "sensing_coloristouchingcolor"),
|
| 3503 |
+
# (r"""\s*<?\s*color\s*\[?\s*(#[0-9A-Fa-f]{6})\s*\]?\s*is\s+touching\s*\[?\s*(#[0-9A-Fa-f]{6})\s*\]?\s*\??\s*>?\s*""", "sensing_coloristouchingcolor"),
|
| 3504 |
+
# # (r"touching color #\w{6}\??", "sensing_touchingcolor"),
|
| 3505 |
+
# # (r"touching\s*(?:color\s*)?#\w{6}\??", "sensing_touchingcolor"),
|
| 3506 |
+
# (r"(?<!is\s)touching\s*(?:color\s*)?\[?\s*#([0-9A-Fa-f]{6})\s*\]?\??", "sensing_touchingcolor"),
|
| 3507 |
+
# (r"touching \[.+? v\]\??", "sensing_touchingobject"),
|
| 3508 |
+
# (r"set drag mode \[.+? v\]", "sensing_setdragmode"),
|
| 3509 |
+
# (r"reset timer", "sensing_resettimer"),
|
| 3510 |
+
# # (r"(?<!at\s)(?<!item\s)\(.+? of \[.+? v]\)", "sensing_of"),
|
| 3511 |
+
# #(r"(?<!at\s)(?<!item\s)(?<!item\s)(?<!delete\s)[(].+? of \[.+? v\]", "sensing_of"),
|
| 3512 |
+
# # (r"(?<!at\s)(?<!delete\s)\((?!item\s*(?:\(|#))\s.+? of \[.+? v\]", "sensing_of"),
|
| 3513 |
+
# #(r"""(?ix)(?<!\bat\s)(?<!\bdelete\s)(?<!\bitem\s)(?<!\binsert\s)(?<!\bcreate\s)(?:\(\s*(?!item\b|\d|\#)[^)]+?\)\s*of\s*\[.+? v\]|\[\s*(?!item\b|\d|\#)[^\]]+?\]\s*of\s*\[.+? v|(?!item\b|\d|\#)[A-Za-z][^\(\[\n]+?\s*of\s*\[.+? v\])""", "sensing_of"),
|
| 3514 |
+
# (r"(?i)(?<!\bat\s)(?<!\bdelete\s)(?<!\binsert\s)(?<!\breplace\s)(?<!\bcreate\s)(?<!\bitem\s)(?<!\bletter\s)"r"(?:"r"\(\s*(?!(?:item\b|\d+|\#|length\b|insert\b|delete\b|replace\b|create\b|letter\b))[^()]{1,200}?\)\s*of\s*\[[^\]]+?(?:\s+v)?\](?!\s*in\s*\[)"r"|"r"\(\s*(?!(?:item\b|\d+|\#|length\b|insert\b|delete\b|replace\b|create\b|letter\b)).*?of\s*\[[^\]]+?(?:\s+v)?\].*?\)"r"|"r"\[\s*(?!(?:item\b|\d+|\#|length\b|letter\b))[^\]]+?\]\s*of\s*\[[^\]]+?(?:\s+v)?\](?!\s*in\s*\[)"r"|"r"\b(?:backdrop|costume|x\s+position|y\s+position|direction|size|volume|loudness|answer|day|month|year|username|timer|mouse\s+x|mouse\s+y)\b\s*of\s*\[[^\]]+?(?:\s+v)?\](?!\s*in\s*\[)"r")","sensing_of"),
|
| 3515 |
+
# #(r"(?<!at\s)(?<!delete\s)\((?!item\s*(?:\(|#)).+?\)\s*of \[.+? v\]", "sensing_of"),
|
| 3516 |
+
# (r"\(current \[.+? v]\)", "sensing_current"),
|
| 3517 |
+
# (r"\(?answer\)?", "sensing_answer"), #(to test muliple bracket and alone should treet as the keyword)
|
| 3518 |
+
# (r"\(?username\)?", "sensing_username"), #(to test muliple bracket and alone should treet as the keyword)
|
| 3519 |
+
# # commented for the mouse operations
|
| 3520 |
+
# (r"distance\s*to\s*[\[\(]\s*([^\]\)]+?)\s*v?\s*[\]\)]", "sensing_distanceto"),
|
| 3521 |
+
# # (r"(?:<\s*)?mouse\s*down\?\s*(?:>)?", "sensing_mousedown"),
|
| 3522 |
+
# # (r"(?:[\[\(])?\s*mouse\s*x\s*(?:v)?\s*(?:[\]\)])?", "sensing_mousex"),
|
| 3523 |
+
# # (r"(?:[\[\(])?\s*mouse\s*y\s*(?:v)?\s*(?:[\]\)])?", "sensing_mousey"),
|
| 3524 |
+
|
| 3525 |
+
# # --- Sound Blocks ---
|
| 3526 |
+
# # (r"play sound \[.+? v\] until done", "sound_playuntildone"),
|
| 3527 |
+
# # (r"start sound \[.+? v\]", "sound_play"),
|
| 3528 |
+
# (r"play sound\s+(?:\[\s*.+?\s*v\]|\(?\s*.+?\s*\)?)\s+until done", "sound_playuntildone"),
|
| 3529 |
+
# (r"start sound\s+(?:\[\s*.+?\s*v\]|\(?\s*.+?\s*\)?)", "sound_play"),
|
| 3530 |
+
# (r"stop all sounds", "sound_stopallsounds"),
|
| 3531 |
+
# # (r"change volume by (.+?)", "sound_changevolumeby"),
|
| 3532 |
+
# (r"change volume by\s*(?:\((.+?)\)|\[(.+?)\]|(.+))", "sound_changevolumeby"),
|
| 3533 |
+
# # (r"set volume to (.+?) %", "sound_setvolumeto"),
|
| 3534 |
+
# (r"""set\ volume\ to\s+\(?\s*(?:-?\d+(?:\.\d+)?|\[?[a-zA-Z_][\w\s]*\]?(?:\ v)?)\s*\)?\s*%?""", "sound_setvolumeto"),
|
| 3535 |
+
|
| 3536 |
+
# (r"\(volume\)", "sound_volume"),
|
| 3537 |
+
|
| 3538 |
+
# # --- Motion Blocks ---
|
| 3539 |
+
# # (r"go to x: (.+?) y: (.+)", "motion_gotoxy"),
|
| 3540 |
+
# (r"go to x:\s*\(?(.+?)\)?\s*y:\s*\(?(.+?)\)?", "motion_gotoxy"),
|
| 3541 |
+
# # (r"set x to (.+)", "motion_setx"),
|
| 3542 |
+
# (r"set x to (.+)", "motion_setx"),
|
| 3543 |
+
# (r"set y to (.+)", "motion_sety"),
|
| 3544 |
+
# # (r"move (.+?) steps", "motion_movesteps"),
|
| 3545 |
+
# (r"move\s*\(?(.+?)\)?\s*(?:steps?)?", "motion_movesteps"),
|
| 3546 |
+
# # (r"turn right (.+?) degrees", "motion_turnright"),
|
| 3547 |
+
# (r"turn right\s*\(?(.+?)\)?\s*(?:degrees?)?", "motion_turnright"),
|
| 3548 |
+
# # (r"turn left (.+?) degrees", "motion_turnleft"),
|
| 3549 |
+
# (r"turn left\s*\(?(.+?)\)?\s*(?:degrees?)?", "motion_turnleft"),
|
| 3550 |
+
# (r"go to\s*(?:random position|mouse-pointer|\[.*?\]|.+)", "motion_goto"), #(to mouse-pointer is not include here for now)
|
| 3551 |
+
# # (r"point in direction (.+)", "motion_pointindirection"),
|
| 3552 |
+
# (r"point in direction\s*\(?(.+?)\)?", "motion_pointindirection"),
|
| 3553 |
+
# (r"point towards \[.+? v\]", "motion_pointtowards"),
|
| 3554 |
+
# # (r"change x by (.+)", "motion_changexby"),
|
| 3555 |
+
# # (r"change y by (.+)", "motion_changeyby"),
|
| 3556 |
+
# (r"change x by\s*\(?(.+?)\)?", "motion_changexby"),
|
| 3557 |
+
# (r"change y by\s*\(?(.+?)\)?", "motion_changeyby"),
|
| 3558 |
+
# # (r"glide (.+?) secs to x: (.+?) y: (.+)", "motion_glidesecstoxy"),
|
| 3559 |
+
# # (r"glide (.+?) secs to \[.+? v\]", "motion_glideto"),
|
| 3560 |
+
# (r"glide\s*\(?(.+?)\)?\s*(?:sec|secs|second|seconds)\s*to\s*x:\s*\(?(.+?)\)?\s*y:\s*\(?(.+?)\)?", "motion_glidesecstoxy"),
|
| 3561 |
+
# (r"glide\s*\(?(.+?)\)?\s*(?:sec|secs|second|seconds)\s*to\s*\[.*?\]", "motion_glideto"),
|
| 3562 |
+
# (r"if on edge, bounce", "motion_ifonedgebounce"),
|
| 3563 |
+
# # (r"set rotation style \[.+? v\]", "motion_setrotationstyle"),
|
| 3564 |
+
# (r"set rotation style\s*\[(?:left-right|all around|don't rotate)(?:\s*v)?\]", "motion_setrotationstyle"),
|
| 3565 |
+
# (r"\(?x position\)?", "motion_xposition"), #(to x positon may detect where var is used)
|
| 3566 |
+
# (r"\(?y position\)?", "motion_yposition"), #(to y position may detect where var is used)
|
| 3567 |
+
# (r"\(?direction\)?", "motion_direction"), #(to direction may detect where var is used)
|
| 3568 |
+
|
| 3569 |
+
# # --- Looks Blocks ---
|
| 3570 |
+
# (r"switch costume to \[.+? v\]", "looks_switchcostumeto"),
|
| 3571 |
+
# (r"next costume", "looks_nextcostume"),
|
| 3572 |
+
# (r"switch backdrop to \[.+? v\] and wait", "looks_switchbackdroptowait"),
|
| 3573 |
+
# (r"switch backdrop to \[.+? v\]", "looks_switchbackdropto"),
|
| 3574 |
+
# (r"next backdrop", "looks_nextbackdrop"),
|
| 3575 |
+
# (r"^\s*show\s*$", "looks_show"),
|
| 3576 |
+
# (r"^\s*hide\s*$", "looks_hide"),
|
| 3577 |
+
# # (r"say \[.+?\] for (.+?) seconds", "looks_sayforsecs"),
|
| 3578 |
+
# # (r"say \[.+?\]", "looks_say"),
|
| 3579 |
+
# # (r"think \[.+?\] for (.+?) seconds", "looks_thinkforsecs"),
|
| 3580 |
+
# # (r"think \[.+?\]", "looks_think"),
|
| 3581 |
+
# # (r"change size by (.+)", "looks_changesizeby"),
|
| 3582 |
+
# # (r"set size to (.+?) %", "looks_setsizeto"),
|
| 3583 |
+
# # (r"say\s*\[.+?\]\s*for\s*\(?(.+?)\)?\s*(?:sec|secs|second|seconds)", "looks_sayforsecs"),
|
| 3584 |
+
# (r"say\s+(?:\[.+?\]|\(.+?\)|.+?)\s*for\s*\(?(.+?)\)?\s*(?:sec|secs|second|seconds)", "looks_sayforsecs"),
|
| 3585 |
+
# # (r"say\s*\[.+?\]", "looks_say"),
|
| 3586 |
+
# (r"say\s+(?!.*\bfor\b\s*\(?\d+\)?\s*(?:sec|secs|second|seconds))(?:\[.+?\]|\(.+?\)|.+?)", "looks_say"),
|
| 3587 |
+
# (r"think\s*\[.+?\]\s*for\s*\(?(.+?)\)?\s*(?:sec|secs|second|seconds)", "looks_thinkforsecs"),
|
| 3588 |
+
# (r"think\s*\[.+?\]", "looks_think"),
|
| 3589 |
+
# (r"change size by\s*\(?(.+?)\)?", "looks_changesizeby"),
|
| 3590 |
+
# # (r"set size to\s*\(?(.+?)\)?\s*%?", "looks_setsizeto"),
|
| 3591 |
+
# (r"set size to\s*\(?(.+?)\)?\s*%?", "looks_setsizeto"),
|
| 3592 |
+
# # (r"change \[.+? v\] effect by (.+)", "looks_changeeffectby"),
|
| 3593 |
+
# # (r"set \[.+? v\] effect to (.+)", "looks_seteffectto"),
|
| 3594 |
+
# (r"change\s*\[(.+?)(?:\s*v)?\]\s*effect by\s*\(?(.+?)\)?", "looks_changeeffectby"),
|
| 3595 |
+
# (r"set\s*\[(.+?)(?:\s*v)?\]\s*effect to\s*\(?(.+?)\)?", "looks_seteffectto"),
|
| 3596 |
+
# (r"clear graphic effects", "looks_cleargraphiceffects"),
|
| 3597 |
+
# (r"\(costume \[.+? v\]\)", "looks_costumenumbername"),
|
| 3598 |
+
# (r"\(backdrop \[.+? v\]\)", "looks_backdropnumbername"),
|
| 3599 |
+
|
| 3600 |
+
# # --- Operators ---
|
| 3601 |
+
# # (r"<.+?\s*<\s*.+?>", "operator_lt"),
|
| 3602 |
+
# # (r"<.+?\s*=\s*.+?>", "operator_equals"),
|
| 3603 |
+
# # (r"<.+?\s*>\s*.+?>", "operator_gt"),
|
| 3604 |
+
# # (r"<.+? and .+?>", "operator_and"),
|
| 3605 |
+
# # (r"<.+? or .+?>", "operator_or"),
|
| 3606 |
+
# # (r"<not .+?>", "operator_not"),
|
| 3607 |
+
# # (r"\(join (.+?) (.+?)\)", "operator_join"),
|
| 3608 |
+
# # (r"\(.+?\s*\+\s*.+?\)", "operator_add"),
|
| 3609 |
+
# # (r"\(.+?\s*-\s*.+?\)", "operator_subtract"),
|
| 3610 |
+
# # (r"\(.+?\s*\*\s*.+?\)", "operator_multiply"),
|
| 3611 |
+
# # (r"\(.+?\s*/\s*.+?\)", "operator_divide"),
|
| 3612 |
+
# # (r"\(pick random (.+?) to (.+?)\)", "operator_random"),
|
| 3613 |
+
# # (r"\(letter (.+?) of (.+?)\)", "operator_letterof"),
|
| 3614 |
+
# # (r"\(length of (.+?)\)", "operator_length"),
|
| 3615 |
+
# # (r"\(.+? mod (.+?)\)", "operator_mod"),
|
| 3616 |
+
# # (r"\(round (.+?)\)", "operator_round"),
|
| 3617 |
+
# # (r"\(.+? contains (.+?)\)", "operator_contains"),
|
| 3618 |
+
# # (r"\(.+? of (.+?)\)", "operator_mathop"),
|
| 3619 |
+
# # (r"<\s*[^<>]+\s*<\s*[^<>]+\s*>", "operator_lt"),
|
| 3620 |
+
# # (r"<\s*[^<>]+\s*=\s*[^<>]+\s*>", "operator_equals"),
|
| 3621 |
+
# # (r"<\s*[^<>]+\s*>\s*[^<>]+\s*>", "operator_gt"),
|
| 3622 |
+
# (r"<\s*[^<>?]+\s*<\s*[^<>?]+\s*>", "operator_lt"),
|
| 3623 |
+
# (r"<\s*[^<>?]+\s*=\s*[^<>?]+\s*>", "operator_equals"),
|
| 3624 |
+
# (r"<\s*[^<>?]+\s*>\s*[^<>?]+\s*>", "operator_gt"),
|
| 3625 |
+
# (r"<\s*.*?\s+and\s+.*?\s*>", "operator_and"),
|
| 3626 |
+
# (r"<\s*.*?\s+or\s+.*?\s*>", "operator_or"),
|
| 3627 |
+
# (r"<\s*not\s+.*?\s*>", "operator_not"),
|
| 3628 |
+
|
| 3629 |
+
# # (r"\(join\s+(.+?)\s+(.+?)\)", "operator_join"),
|
| 3630 |
+
# (r"(?:\(join\s+(.+?)\s+(.+?)\)|join\s+(.+?)\s+(.+?))", "operator_join"),
|
| 3631 |
+
# # (r"\(\s*[^()]+\s*\+\s*[^()]+\s*\)", "operator_add"),
|
| 3632 |
+
# # (r"\(\s*[^()]+\s*-\s*[^()]+\s*\)", "operator_subtract"),
|
| 3633 |
+
# # (r"\(\s*[^()]+\s*\*\s*[^()]+\s*\)", "operator_multiply"),
|
| 3634 |
+
# # (r"\(\s*[^()]+\s*/\s*[^()]+\s*\)", "operator_divide"),
|
| 3635 |
+
# # Allow nested expressions inside ()
|
| 3636 |
+
# (r"\(\s*.+?\s*\+\s*.+?\s*\)", "operator_add"),
|
| 3637 |
+
# # (r"\(\s*.+?\s*-\s*.+?\s*\)", "operator_subtract"),
|
| 3638 |
+
# (r"\(\s*(?!-\s*\d+(?:\.\d+)?\s*\))(.+?)\s+-\s+(.+?)\)", "operator_subtract"),
|
| 3639 |
+
# (r"\(\s*.+?\s*\*\s*.+?\s*\)", "operator_multiply"),
|
| 3640 |
+
# (r"\(\s*.+?\s*/\s*.+?\s*\)", "operator_divide"),
|
| 3641 |
+
# (r"\(pick random\s+(.+?)\s+to\s+(.+?)\)", "operator_random"),
|
| 3642 |
+
# (r"\(letter\s+(.+?)\s+of\s+(.+?)\)", "operator_letterof"),
|
| 3643 |
+
# (r"\(length of\s+(.+?)\)", "operator_length"),
|
| 3644 |
+
# # (r"\(\s*[^()]+\s+mod\s+[^()]+\s*\)", "operator_mod"),
|
| 3645 |
+
# (r"\(\s*.+?\s+mod\s+.+?\s*\)", "operator_mod"),
|
| 3646 |
+
# (r"\(round\s+(.+?)\)", "operator_round"),
|
| 3647 |
+
# # (r"\(\s*[^()]+\s+contains\s+[^()]+\s*\)", "operator_contains"),
|
| 3648 |
+
# (r"[<(]\s*\[(?![^\]]*\s+v\])[^\]]+?\]\s*contains\s*\[[^\]]+?\]\s*\??\s*[)>]", "operator_contains"),
|
| 3649 |
+
# # (r"\(\s*[^()]+\s+of\s+[^()]+\s*\)", "operator_mathop"),
|
| 3650 |
+
# (r"\(\s*\[?(abs|floor|ceiling|sqrt|sin|cos|tan|asin|acos|atan|ln|log|e \^|10 \^)\s*(?:v)?\]?\s+of\s+.+?\)", "operator_mathop"),
|
| 3651 |
+
|
| 3652 |
+
# ]
|
| 3653 |
patterns = [
|
| 3654 |
# --- Multi-line Control Blocks (most specific, non-greedy) ---
|
| 3655 |
(r"if <.+?> then(?:.|\n)+?else(?:.|\n)+?end", "control_if_else"), #(to test muliple stack)
|
|
|
|
| 3661 |
# (r"stop\s+(?:all|this script|other scripts in sprite|\[(?:all|this script|other scripts in sprite)(?:\s+v)?\])", "control_stop"),
|
| 3662 |
(r"stop\s+(?:all|this script|other scripts in sprite|\[(?:all|this script|other scripts in sprite)(?:\s+v)?\])(?!\s+sounds)", "control_stop"),
|
| 3663 |
(r"when I start as a clone", "control_start_as_clone"),
|
| 3664 |
+
# (r"create clone of \[.+?(?:\s+v)?\]", "control_create_clone_of"),
|
| 3665 |
+
(r"create clone of\s*(?:\(.+?\)|\[.+?(?:\s+v)?\]|\S+)", "control_create_clone_of"), # updated
|
| 3666 |
(r"delete this clone", "control_delete_this_clone"),
|
| 3667 |
(r"wait\s+(?:\(.+?\)|\[.+?(?:\s+v)?\]|\S+)\s+sec(?:ond)?s?", "control_wait"),
|
| 3668 |
(r"wait until <.+?>", "control_wait_until"),
|
|
|
|
| 3672 |
(r"when (green )?flag click(ed)?", "event_whenflagclicked"),
|
| 3673 |
(r"when\s+(?:key\s+\[(.+?)(?:\s+v)?\]|\[(.+?)(?:\s+v)?\]\s+key)\s+pressed", "event_whenkeypressed"),
|
| 3674 |
(r"when this sprite clicked", "event_whenthisspriteclicked"),
|
| 3675 |
+
#(r"when backdrop switches to \[.+?(?:\s+v)?\]", "event_whenbackdropswitchesto"),
|
| 3676 |
+
#(r"when I receive \[.+?(?:\s+v)?\]", "event_whenbroadcastreceived"),
|
| 3677 |
(r"when \[.+?(?:\s+v)?\] > (.+)", "event_whengreaterthan"),
|
| 3678 |
+
#(r"broadcast \[.+?(?:\s+v)?\] and wait", "event_broadcastandwait"),
|
| 3679 |
+
#(r"broadcast \[.+?(?:\s+v)?\]", "event_broadcast"),
|
| 3680 |
+
(r"when backdrop switches to\s*(?:\(.+?\)|\[.+?(?:\s+v)?\]|\S+)", "event_whenbackdropswitchesto"), # updated
|
| 3681 |
+
(r"when I receive\s*(?:\(.+?\)|\[.+?(?:\s+v)?\]|\S+)", "event_whenbroadcastreceived"), # updated
|
| 3682 |
+
(r"broadcast\s*(?:\(.+?\)|\[.+?(?:\s+v)?\]|\S+)\s+and wait", "event_broadcastandwait"), # updated
|
| 3683 |
+
(r"broadcast\s*(?:\(.+?\)|\[.+?(?:\s+v)?\]|\S+)", "event_broadcast"), # updated
|
| 3684 |
+
|
| 3685 |
|
| 3686 |
# --- Data Blocks (Variables and Lists) - specific block types first ---
|
| 3687 |
(r"set\s*\[\s*.+?(?:\s+v)?\s*\]\s*to\s*\(?\s*.+?\s*\)?", "data_setvariableto"),
|
| 3688 |
(r"change\s*\[\s*.+?(?:\s+v)?\s*\]\s*by\s*\(?\s*.+?\s*\)?", "data_changevariableby"),
|
| 3689 |
+
# (r"show variable \[.+?(?:\s+v)?\]", "data_showvariable"),
|
| 3690 |
+
# (r"hide variable \[.+?(?:\s+v)?\]", "data_hidevariable"),
|
| 3691 |
+
# (r"show list \[.+?(?:\s+v)?\]", "data_showlist"),
|
| 3692 |
+
# (r"hide list \[.+?(?:\s+v)?\]", "data_hidelist"),
|
| 3693 |
+
(r"show variable\s*(?:\(.+?\)|\[.+?(?:\s+v)?\]|\S+)", "data_showvariable"), # updated
|
| 3694 |
+
(r"hide variable\s*(?:\(.+?\)|\[.+?(?:\s+v)?\]|\S+)", "data_hidevariable"), # updated
|
| 3695 |
+
(r"show list\s*(?:\(.+?\)|\[.+?(?:\s+v)?\]|\S+)", "data_showlist"), # updated
|
| 3696 |
+
(r"hide list\s*(?:\(.+?\)|\[.+?(?:\s+v)?\]|\S+)", "data_hidelist"), # updated
|
| 3697 |
(r"add\s+(?:\[.+?\]|\(.+?\)|\w+)\s+to\s+\[.+?(?:\s+v)?\]", "data_addtolist"),
|
| 3698 |
(r"delete\s*\((?!all\)).+?\)\s*of\s*\[.+?(?:\s+v)?\]", "data_deleteoflist"),
|
| 3699 |
(r"delete\s*\(all\)\s*of\s*\[.+?(?:\s+v)?\]", "data_deletealloflist"),
|
|
|
|
| 3724 |
# (r"touching\s*(?:color\s*)?#\w{6}\??", "sensing_touchingcolor"),
|
| 3725 |
(r"(?<!is\s)touching\s*(?:color\s*)?\[?\s*#([0-9A-Fa-f]{6})\s*\]?\??", "sensing_touchingcolor"),
|
| 3726 |
(r"touching \[.+? v\]\??", "sensing_touchingobject"),
|
| 3727 |
+
# (r"set drag mode \[.+? v\]", "sensing_setdragmode"),
|
| 3728 |
+
(r"set drag mode\s*(?:\(.+?\)|\[.+?(?:\s+v)?\]|\S+)", "sensing_setdragmode"), # updated
|
| 3729 |
(r"reset timer", "sensing_resettimer"),
|
| 3730 |
# (r"(?<!at\s)(?<!item\s)\(.+? of \[.+? v]\)", "sensing_of"),
|
| 3731 |
#(r"(?<!at\s)(?<!item\s)(?<!item\s)(?<!delete\s)[(].+? of \[.+? v\]", "sensing_of"),
|
|
|
|
| 3770 |
(r"go to\s*(?:random position|mouse-pointer|\[.*?\]|.+)", "motion_goto"), #(to mouse-pointer is not include here for now)
|
| 3771 |
# (r"point in direction (.+)", "motion_pointindirection"),
|
| 3772 |
(r"point in direction\s*\(?(.+?)\)?", "motion_pointindirection"),
|
| 3773 |
+
# (r"point towards \[.+? v\]", "motion_pointtowards"),
|
| 3774 |
+
(r"point towards\s*(?:\(.+?\)|\[.+?(?:\s+v)?\]|\S+)", "motion_pointtowards"), # updated
|
| 3775 |
# (r"change x by (.+)", "motion_changexby"),
|
| 3776 |
# (r"change y by (.+)", "motion_changeyby"),
|
| 3777 |
(r"change x by\s*\(?(.+?)\)?", "motion_changexby"),
|
|
|
|
| 3788 |
(r"\(?direction\)?", "motion_direction"), #(to direction may detect where var is used)
|
| 3789 |
|
| 3790 |
# --- Looks Blocks ---
|
| 3791 |
+
# (r"switch costume to \[.+? v\]", "looks_switchcostumeto"),
|
| 3792 |
+
# (r"next costume", "looks_nextcostume"),
|
| 3793 |
+
# (r"switch backdrop to \[.+? v\] and wait", "looks_switchbackdroptowait"),
|
| 3794 |
+
# (r"switch backdrop to \[.+? v\]", "looks_switchbackdropto"),
|
| 3795 |
+
(r"switch costume to\s*(?:\(.+?\)|\[.+?(?:\s+v)?\]|\S+)", "looks_switchcostumeto"), # updated
|
| 3796 |
(r"next costume", "looks_nextcostume"),
|
| 3797 |
+
(r"switch backdrop to\s*(?:\(.+?\)|\[.+?(?:\s+v)?\]|\S+)\s*and wait", "looks_switchbackdroptowait"), # updated
|
| 3798 |
+
(r"switch backdrop to\s*(?:\(.+?\)|\[.+?(?:\s+v)?\]|\S+)", "looks_switchbackdropto"), # updated
|
| 3799 |
(r"next backdrop", "looks_nextbackdrop"),
|
| 3800 |
(r"^\s*show\s*$", "looks_show"),
|
| 3801 |
(r"^\s*hide\s*$", "looks_hide"),
|
|
|
|
| 3955 |
# scripts.append(script.strip())
|
| 3956 |
|
| 3957 |
# return scripts
|
| 3958 |
+
|
| 3959 |
def separate_scripts(pseudocode_string):
|
| 3960 |
"""
|
| 3961 |
Separates a block of Scratch pseudocode into a list of individual scripts.
|