Analiza restrânsă a expresiilor S
Parsează o expresie S în paranteze de cel mult 4096 caractere în liste și atomi 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
Modele
Configurează un endpoint compatibil OpenAI sau Anthropic cu URL-ul de bază și cheia API, dacă este necesară. Testează conexiunea. Serverul local trebuie să ruleze; instrumentele externe pot transmite date separat.
Proiect
Testează liste goale, adâncime 16 și 1024 de noduri, respinge forme suplimentare, liste deschise și ghilimele fără evaluare.
Verifică înainte de aplicare
Compară comportamentul real cu rezultatul așteptat. Dacă o verificare eșuează, cercetează cauza înainte de alte modificări.
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ăstrează mic un limbaj mic pe măsură ce parserul se schimbă
ParenWick este un spațiu de programare cu IA pentru Windows destinat dezvoltării parserelor a căror intrare acceptată este restrânsă deliberat. Deschide proiectul și descrie limbajul pe care aplicația trebuie să îl recunoască, inclusiv unde trebuie să se oprească. Cere asistentului conectat să examineze parserul actual și consumatorul său înainte de a sugera o modificare, astfel încât comoditatea implementării să nu extindă tacit limbajul.
Un cititor delimitat de expresii S oferă un exemplu concret. Discută o singură formă între paranteze, sintaxa permisă a atomilor și reprezentarea listelor imbricate. Include limitele adâncimii și numărului de noduri în solicitare, precum și ce se întâmplă când alte forme urmează după prima. Parserul returnează o reprezentare a intrării; interpretarea acelei reprezentări ar fi o parte separată a aplicației.
Analizează propunerea folosind împreună teste acceptate și respinse, apoi rulează verificările proiectului exact la limite și dincolo de ele. Examinează tratarea erorilor la fel de atent ca ieșirea reușită, astfel încât apelanții să poată distinge o intrare incorectă de o listă goală validă. ParenWick acceptă conexiuni compatibile OpenAI sau Anthropic acceptate, cu acreditări când sunt necesare. Alege un model fără restricții unde este oferit și verifică suportul serverului pentru context și instrumente. Modificarea rezultată trebuie să poată fi explicată în raport cu gramatica ta, nu doar să pară plauzibilă pentru o expresie exemplu.
Modificările parserului și limitele lor
Ce trebuie să ofer asistentului în afară de exemple valide?
Furnizează exemple respinse, sintaxa permisă a atomilor și limite explicite de dimensiune, adâncime și număr de noduri. Precizează cum ajung erorile la apelant. Astfel se poate analiza dacă modificarea propusă păstrează limitele limbajului intenționat.
Citirea unei expresii îi execută conținutul?
Sarcina ilustrată parsează intrarea în liste și șiruri de atomi. Nu evaluează acea reprezentare. Păstrează execuția sau interpretarea ca un comportament specificat separat și examinează codul ulterior înainte de a lega intrarea parsată de orice acțiune.
Cum trebuie tratată o a doua formă la nivel superior?
Contractul existent acceptă o singură formă între paranteze și le respinge pe cele suplimentare. Include un test cu două forme și verifică luarea în considerare a întregii intrări, astfel încât modificarea parserului să nu accepte tacit un prefix valid ignorând materialul final.
De ce să testez exact la limita de imbricare?
Distinge structura maximă acceptată de prima respinsă și poate expune schimbări cu o unitate ale limitei. Procedează la fel pentru numărul de noduri și lungimea intrării, apoi verifică dacă respingerea produce răspunsul așteptat de aplicația apelantă.
ParenWick · Actualizat 2026-10-25