prthm11 commited on
Commit
4899cbe
·
verified ·
1 Parent(s): ba9769b

Upload block_relation_builder.py

Browse files
Files changed (1) hide show
  1. 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 \[.+? 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"),
@@ -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.