Omezené parsování S-výrazů
Zpracujte jeden uzávorkovaný S-výraz do 4096 znaků na seznamy a atomy ASCII.
import re
def read_sexpression(text):
if type(text) is not str or len(text) > 4096:
raise ValueError("sexpr.input")
stack, result, count = [], None, 0
for match in re.finditer(r"\(|\)|[^\s()]+", text):
token = match[0]
if token == "(":
if len(stack) == 16 or (not stack and result is not None):
raise ValueError("sexpr.depth")
item = []
if stack:
stack[-1].append(item)
stack.append(item)
count += 1
elif token == ")":
if not stack:
raise ValueError("sexpr.close")
item = stack.pop()
if not stack:
result = item
else:
if not stack or re.fullmatch(r"[A-Za-z_][A-Za-z0-9_-]*|[+-]?[0-9]+", token) is None:
raise ValueError("sexpr.atom")
stack[-1].append(token)
count += 1
if count > 1024:
raise ValueError("sexpr.nodes")
if stack or result is None:
raise ValueError("sexpr.unclosed")
return result
Modely
Nastavte endpoint kompatibilní s OpenAI nebo Anthropic pomocí základní URL a případného API klíče. Otestujte připojení. Lokální server modelu musí běžet; vzdálené nástroje mohou data odesílat samostatně.
Projekt
Otestujte prázdné seznamy, hloubku 16 a 1024 uzlů, odmítněte další formy, neuzavřené seznamy a uvozovky bez vyhodnocení.
Před použitím zkontrolujte
Porovnejte skutečné chování s očekávaným výsledkem. Pokud kontrola selže, před dalšími změnami zjistěte příčinu.
import re
def read_sexpression(text):
if type(text) is not str or len(text) > 4096:
raise ValueError("sexpr.input")
stack, result, count = [], None, 0
for match in re.finditer(r"\(|\)|[^\s()]+", text):
token = match[0]
if token == "(":
if len(stack) == 16 or (not stack and result is not None):
raise ValueError("sexpr.depth")
item = []
if stack:
stack[-1].append(item)
stack.append(item)
count += 1
elif token == ")":
if not stack:
raise ValueError("sexpr.close")
item = stack.pop()
if not stack:
result = item
else:
if not stack or re.fullmatch(r"[A-Za-z_][A-Za-z0-9_-]*|[+-]?[0-9]+", token) is None:
raise ValueError("sexpr.atom")
stack[-1].append(token)
count += 1
if count > 1024:
raise ValueError("sexpr.nodes")
if stack or result is None:
raise ValueError("sexpr.unclosed")
return result
Při změnách parseru zachovejte malý jazyk malým
ParenWick je programovací prostředí s AI pro Windows k vývoji parserů se záměrně omezeným přijímaným vstupem. Otevřete projekt a popište jazyk, který má aplikace rozpoznávat, včetně hranic, za které nesmí jít. Před návrhem opravy nechte připojeného asistenta prozkoumat nynější parser a jeho příjemce, aby pohodlnější implementace tiše nerozšířila jazyk.
Konkrétním příkladem je čtečka S-výrazů s omezeními. Proberte jediný výraz v závorkách, přípustnou syntaxi atomů a reprezentaci vnořených seznamů. Do zadání zahrňte limity hloubky a počtu uzlů i to, co se má stát, pokud za prvním výrazem následují další. Parser vrací reprezentaci vstupu; její interpretace by byla samostatnou částí aplikace.
Návrh posuďte společně na přijímaných i odmítaných testovacích příkladech a poté spusťte kontroly projektu přesně na limitech i za nimi. Zpracování chyb prozkoumejte stejně pečlivě jako úspěšný výstup, aby volající rozlišili chybný vstup od platného prázdného seznamu. ParenWick přijímá podporovaná připojení kompatibilní s OpenAI nebo připojení Anthropic, podle potřeby s přihlašovacími údaji. Vyberte neomezený model tam, kde je nabízen, a ověřte podporu kontextu a nástrojů serveru. Výsledná oprava má být vysvětlitelná podle vaší gramatiky, nikoli jen věrohodná na jednom ukázkovém výrazu.
Změny parseru a jejich hranice
Co dát asistentovi kromě platných příkladů?
Dodejte odmítané příklady, povolenou syntaxi atomů a výslovné limity velikosti, hloubky a počtu uzlů. Uveďte, jak chyby přecházejí k volajícímu. Umožní to posoudit, zda navržená oprava zachovává zamýšlené hranice jazyka.
Spustí přečtení výrazu jeho obsah?
Ilustrovaná úloha parsuje vstup do seznamů a řetězců atomů. Tuto reprezentaci nevyhodnocuje. Spouštění či interpretaci ponechte jako zvlášť specifikované chování a před propojením naparsovaného vstupu s jakoukoli akcí prozkoumejte navazující kód.
Jak se má zachovat druhý výraz na nejvyšší úrovni?
Stávající specifikace přijímá jediný výraz v závorkách a další odmítá. Zahrňte test se dvěma výrazy a ověřte zohlednění celého vstupu, aby změna parseru tiše nepřijímala platný prefix a neignorovala zbytek.
Proč testovat přesně na limitu vnoření?
Odlišuje největší přijímanou strukturu od první odmítané a může odhalit chyby o jedničku. Totéž udělejte pro limity uzlů a délky vstupu a ověřte, že odmítnutí vyvolá reakci očekávanou volající aplikací.
ParenWick · Aktualizováno 2026-10-25