GammaCyber

כתיבת קוד — שיעור 11

שפה מומצאת — 5 שלבים, Dry Run, Symbol Table

כל 2 משימות הקוד שנשמרו מהשיעור מופיעות כאן, עם דרישות, דוגמאות וקוד פתיחה. אפשר לכתוב פתרון בעורך המקומי וללחוץ על „בדיקת AI” לקבלת ציון, רמזים והערות.

T2 · בסיסי250 נק'~20 דק'algorithmic
Tokenizer לשפה מומצאת (שלב 1/5)
השלב הראשון בהרצת שפה הוא פירוק לאסימונים. ממש tokenize(s) שמפרק ביטוי לרשימת אסימונים (kind, text): NUM (רצף ספרות), ID (אות ואז אותיות/ספרות), OP (אחד מ- + - * / =), LP עבור '(', RP עבור ')'. דלג על רווחים. על תו לא-חוקי — זרוק ValueError.
דוגמאות
tokenize('x = 3 + 4') → [('ID','x'),('OP','='),('NUM','3'),('OP','+'),('NUM','4')]
tokenize('foo1*(2)') → [('ID','foo1'),('OP','*'),('LP','('),('NUM','2'),('RP',')')]
פתרון-ייחוס Tokenizer לשפה מומצאת (שלב 1/5) ›
def tokenize(s: str) -> list[tuple[str, str]]: toks = []; i = 0; n = len(s) while i < n: c = s[i] if c == ' ': i += 1; continue if c.isdigit(): j = i while j < n and s[j].isdigit(): j += 1 toks.append(("NUM", s[i:j])); i = j elif c.isalpha(): j = i while j < n and s[j].isalnum(): j += 1 toks.append(("ID", s[i:j])); i = j elif c in "+-*/=": toks.append(("OP", c)); i += 1 elif c == '(': toks.append(("LP", c)); i += 1 elif c == ')': toks.append(("RP", c)); i += 1 else: raise ValueError(f"bad char {c!r}") return toks
הפתרון נשמר מקומית אוטומטית.
T3 · בינוני350 נק'~20 דק'algorithmic
Symbol Table — בדיקת הצהרות
אחרי הפירוק לאסימונים בונים טבלת סמלים. נתונה רשימת שורות; כל שורה היא "let NAME" (הצהרה) או "set NAME"/"get NAME" (שימוש). עבד לפי הסדר והחזר את השגיאה הראשונה: הצהרה חוזרת של שם קיים → "redeclare:NAME"; שימוש בשם שלא הוצהר → "undeclared:NAME". אם אין שגיאות → "ok".
דוגמאות
check_symbols(['let x','set x']) → 'ok'
check_symbols(['set x']) → 'undeclared:x'
check_symbols(['let x','let x']) → 'redeclare:x'
פתרון-ייחוס Symbol Table — בדיקת הצהרות ›
def check_symbols(lines: list[str]) -> str: declared = set() for ln in lines: op, name = ln.split() if op == 'let': if name in declared: return f"redeclare:{name}" declared.add(name) else: # 'set'/'get' = שימוש if name not in declared: return f"undeclared:{name}" return "ok"
הפתרון נשמר מקומית אוטומטית.