Beperkt ontleden van S-expressies
Ontleed één S-expressie tussen haakjes van maximaal 4096 tekens in lijsten en ASCII-atomen.
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
Modellen
Stel een OpenAI-compatibel of Anthropic-endpoint in met de basis-URL en zo nodig een API-sleutel. Test de verbinding. Een lokale modelserver moet actief zijn; externe hulpmiddelen kunnen apart gegevens versturen.
Project
Test lege lijsten, diepte 16 en 1024 knopen, weiger extra vormen, onafgesloten lijsten en niet-ondersteunde aanhalingstekens zonder iets uit te voeren.
Controleer vóór het toepassen
Vergelijk het werkelijke gedrag met het verwachte resultaat. Onderzoek een mislukte controle voordat je verdergaat met wijzigingen.
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
Houd een kleine taal klein terwijl de parser verandert
ParenWick is een AI-programmeerwerkruimte voor Windows om parsers te ontwikkelen waarvan de geaccepteerde invoer bewust beperkt is. Open het project en beschrijf de taal die de toepassing moet herkennen, inclusief waar ze moet stoppen. Vraag de verbonden assistent de huidige parser en de afnemer te onderzoeken voordat hij een patch voorstelt, zodat implementatiegemak de taal niet stilzwijgend uitbreidt.
Een begrensde S-expressielezer biedt een concreet voorbeeld. Bespreek één vorm tussen haakjes, de toegestane atoomsyntaxis en de representatie van geneste lijsten. Neem de diepte- en knooplimieten in het verzoek op, samen met wat er gebeurt wanneer extra vormen op de eerste volgen. De parser retourneert een representatie van invoer; interpretatie van die representatie is een afzonderlijk onderdeel van je toepassing.
Beoordeel het voorstel met geaccepteerde en afgewezen testgevallen samen en voer vervolgens de projectcontroles uit op de exacte limieten en daarbuiten. Onderzoek foutafhandeling net zo zorgvuldig als geslaagde uitvoer, zodat aanroepende code ongeldige invoer kan onderscheiden van een geldige lege lijst. ParenWick accepteert ondersteunde OpenAI-compatibele of Anthropic-verbindingen, met inloggegevens waar vereist. Kies een onbeperkt model waar dat wordt aangeboden en controleer de context- en toolondersteuning van de server. De resulterende patch moet te verklaren zijn aan de hand van je grammatica, in plaats van slechts aannemelijk op één voorbeeldexpressie.
Parserwijzigingen en hun grenzen
Wat moet ik de assistent naast geldige voorbeelden geven?
Geef afgewezen voorbeelden, de toegestane atoomsyntaxis en expliciete limieten voor grootte, diepte en knopen. Vermeld hoe fouten de aanroepende code bereiken. Zo kan worden beoordeeld of de voorgestelde patch de bedoelde taalgrens behoudt.
Voert het lezen van een expressie de inhoud ervan uit?
De geïllustreerde taak ontleedt invoer tot lijsten en atoomtekenreeksen. Ze evalueert die representatie niet. Houd uitvoering of interpretatie als afzonderlijk gespecificeerd gedrag en onderzoek verdere code voordat je ontlede invoer met een actie verbindt.
Hoe moet een tweede vorm op hoofdniveau worden behandeld?
Het bestaande contract accepteert één vorm tussen haakjes en wijst extra vormen af. Neem een testgeval met twee vormen op en controleer dat de volledige invoer wordt bekeken, zodat een parserwijziging niet stilzwijgend een geldig begin accepteert en het resterende materiaal negeert.
Waarom precies op de nestlimiet testen?
Dat onderscheidt de grootste geaccepteerde structuur van de eerste afgewezen structuur en kan fouten van één positie blootleggen. Doe hetzelfde voor knoop- en invoerlengtelimieten en verifieer vervolgens dat afwijzing de reactie oplevert die de aanroepende toepassing verwacht.
ParenWick · Bijgewerkt 2026-10-25