Eingeschränktes Lesen von S-Ausdrücken
Parse einen geklammerten S-Ausdruck von höchstens 4096 Zeichen zu Listen und ASCII-Atomtexten.
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
Modelle
Richten Sie einen OpenAI-kompatiblen oder Anthropic-Endpunkt mit Basis-URL und gegebenenfalls API-Schlüssel ein. Testen Sie die Verbindung. Ein lokaler Modellserver muss laufen; entfernte Werkzeuge können Daten separat übertragen.
Projekt
Teste leere Listen, Tiefe 16 und 1024 Knoten, lehne zusätzliche Formen, offene Listen und nicht unterstützte Anführungszeichen ohne Auswertung ab.
Vor dem Anwenden prüfen
Vergleichen Sie das tatsächliche Verhalten mit dem erwarteten Ergebnis. Klären Sie fehlgeschlagene Prüfungen vor weiteren Änderungen.
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
Halten Sie eine kleine Sprache auch bei Parseränderungen klein
ParenWick ist ein KI-Programmierarbeitsbereich für Windows zur Entwicklung von Parsern mit bewusst begrenzten Eingaben. Öffnen Sie das Projekt und beschreiben Sie die von der Anwendung zu erkennende Sprache, einschließlich ihrer Grenzen. Lassen Sie den verbundenen Assistenten vor einem Patch Parser und Empfänger prüfen, damit eine Implementierungsvereinfachung die Sprache nicht stillschweigend erweitert.
Ein begrenzter S-Ausdruck-Leser bietet ein konkretes Beispiel. Besprechen Sie eine einzelne geklammerte Form, die zulässige Atomsyntax und die Darstellung verschachtelter Listen. Geben Sie Tiefen- und Knotengrenzen sowie das Verhalten bei weiteren Formen nach der ersten an. Der Parser gibt eine Eingabedarstellung zurück; ihre Interpretation wäre ein gesonderter Teil Ihrer Anwendung.
Prüfen Sie den Vorschlag gemeinsam mit akzeptierten und zurückgewiesenen Testfällen und führen Sie die Projektprüfungen genau an den Grenzen sowie darüber hinaus aus. Prüfen Sie Fehlerbehandlung ebenso sorgfältig wie erfolgreiche Ausgaben, damit Aufrufer fehlerhafte Eingaben von einer gültigen leeren Liste unterscheiden können. ParenWick akzeptiert unterstützte OpenAI-kompatible oder Anthropic-Verbindungen, bei Bedarf mit Zugangsdaten. Wählen Sie ein uneingeschränktes Modell, sofern angeboten, und prüfen Sie Kontext- und Werkzeugunterstützung des Servers. Der resultierende Patch sollte anhand Ihrer Grammatik erklärbar sein, statt nur für einen Beispielausdruck plausibel zu wirken.
Parseränderungen und ihre Grenzen
Was sollte ich dem Assistenten neben gültigen Beispielen geben?
Geben Sie zurückgewiesene Beispiele, zulässige Atomsyntax und ausdrückliche Größen-, Tiefen- und Knotengrenzen an. Legen Sie fest, wie Fehler den Aufrufer erreichen. So lässt sich prüfen, ob der Patch die beabsichtigte Sprachgrenze erhält.
Führt das Lesen eines Ausdrucks seinen Inhalt aus?
Die Beispielaufgabe parst Eingaben in Listen und Atomzeichenfolgen. Sie wertet diese Darstellung nicht aus. Spezifizieren Sie Ausführung oder Interpretation separat und prüfen Sie nachgelagerten Code, bevor Sie geparste Eingaben mit Aktionen verbinden.
Wie sollte sich eine zweite Form auf oberster Ebene verhalten?
Der bestehende Vertrag akzeptiert eine geklammerte Form und weist zusätzliche zurück. Nehmen Sie einen Testfall mit zwei Formen auf und prüfen Sie die Berücksichtigung der gesamten Eingabe, damit eine Parseränderung nicht stillschweigend ein gültiges Präfix akzeptiert und nachfolgendes Material ignoriert.
Warum genau an der Verschachtelungsgrenze testen?
Das unterscheidet die größte akzeptierte von der ersten zurückgewiesenen Struktur und kann Fehler um eins aufdecken. Verfahren Sie ebenso mit Knoten- und Eingabelängengrenzen und prüfen Sie dann, ob die Zurückweisung die vom Aufrufer erwartete Reaktion erzeugt.
ParenWick · Aktualisiert 2026-10-25