Ограниченный разбор S-выражений
ParenWick поддерживает диалоги о небольших парсерах с намеренно ограниченной грамматикой в проектах Windows. Попросите совместимую модель разобрать вложенность списков и правила атомов, затем проверьте S-выражения в коде, отделяя разбор от исполнения.
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
Подключение
Базовый URL, учётные данные и доступный сервер.
Проект
Проверьте пустые списки, глубину 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