Обмежений розбір S-виразів
Розберіть один S-вираз у дужках до 4096 символів на списки та 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
Моделі
Налаштуйте OpenAI-сумісний або Anthropic endpoint із базовою URL-адресою та API-ключем, якщо він потрібен. Перевірте з’єднання. Локальний сервер моделі має працювати; віддалені інструменти можуть окремо передавати дані.
Проєкт
Перевірте порожні списки, глибину 16 і 1024 вузли, відхиліть зайві форми, незакриті списки й лапки без виконання.
Перевірте перед застосуванням
Порівняйте фактичну поведінку з очікуваним результатом. Якщо перевірка не проходить, з’ясуйте причину перед наступними змінами.
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
Зберігайте малу мову малою під час змін парсера
ParenWick — робоче середовище програмування з ШІ для Windows для розробки парсерів із навмисно обмеженими допустимими даними. Відкрийте проєкт і опишіть мову, яку програма має розпізнавати, зокрема де має зупинятися. Попросіть підключеного помічника дослідити поточний парсер і його споживача до пропозиції виправлення, щоб зручність реалізації непомітно не розширила мову.
Читач обмежених S-виразів — конкретний приклад. Обговоріть єдину форму в дужках, допустимий синтаксис атомів і подання вкладених списків. Додайте до запиту обмеження глибини й кількості вузлів разом із поведінкою за наявності додаткових форм після першої. Парсер повертає подання даних; його інтерпретація була б окремою частиною програми.
Перевіряйте пропозицію прийнятими й відхиленими прикладами разом, потім запустіть перевірки проєкту точно на межах і поза ними. Дослідіть обробку помилок так само ретельно, як успішний результат, щоб код виклику відрізняв неправильні дані від допустимого порожнього списку. ParenWick приймає підтримувані підключення, сумісні з OpenAI, або Anthropic з обліковими даними за потреби. Виберіть модель без обмежень, якщо вона пропонується, й перевірте підтримку контексту та інструментів сервером. Отримане виправлення має пояснюватися вашою граматикою, а не лише виглядати правдоподібно на одному виразі.
Зміни парсера та їхні межі
Що надати помічнику крім коректних прикладів?
Надайте відхилені приклади, допустимий синтаксис атомів і явні обмеження розміру, глибини й кількості вузлів. Укажіть передачу помилок коду виклику. Це дасть змогу перевірити збереження пропозицією задуманої межі мови.
Чи виконує читання виразу його вміст?
Наведене завдання розбирає дані на списки й рядки атомів. Воно не обчислює це подання. Визначайте виконання або інтерпретацію окремо й дослідіть подальший код до поєднання розібраних даних із будь-якою дією.
Як обробляти другу форму верхнього рівня?
Наявний контракт приймає одну форму в дужках і відхиляє додаткові. Додайте приклад із двома формами й перевірте врахування всіх даних, щоб зміна парсера непомітно не приймала коректний префікс, ігноруючи кінцевий матеріал.
Навіщо тестувати точно на межі вкладеності?
Це розрізняє найбільшу прийняту структуру й першу відхилену та може виявити помилку на одиницю. Так само перевірте межі вузлів і довжини даних, а потім підтвердьте, що відхилення дає відповідь, очікувану програмою виклику.
ParenWick · Оновлено 2026-10-25