Análise restrita de expressões S
Analise uma expressão S entre parênteses de até 4096 caracteres em listas e átomos 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
Modelos
Configure um endpoint compatível com OpenAI ou Anthropic com a URL base e uma chave API, quando necessária. Teste a conexão. O servidor local precisa estar em execução; ferramentas remotas podem transmitir dados separadamente.
Projeto
Teste listas vazias, profundidade 16 e 1024 nós, rejeitando formas extras, listas abertas e aspas não aceitas sem executar nada.
Revise antes de aplicar
Compare o comportamento real com o resultado esperado. Se uma verificação falhar, investigue a causa antes de fazer outras alterações.
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
Mantenha pequena uma linguagem pequena enquanto seu analisador muda
ParenWick é um ambiente de programação com IA para Windows para desenvolver analisadores cuja entrada aceita é deliberadamente restrita. Abra o projeto e descreva a linguagem que a aplicação deve reconhecer, incluindo onde deve parar. Peça ao assistente conectado que examine o analisador atual e seu consumidor antes de sugerir uma alteração, para que uma conveniência de implementação não amplie silenciosamente a linguagem.
Um leitor delimitado de expressões S oferece um exemplo concreto. Discuta uma única forma entre parênteses, a sintaxe permitida de átomos e como listas aninhadas são representadas. Inclua na solicitação os limites de profundidade e de nós, além do que acontece quando outras formas seguem a primeira. O analisador retorna uma representação da entrada; interpretar essa representação seria uma parte separada da aplicação.
Revise a proposta usando conjuntamente casos aceitos e rejeitados; depois, execute as verificações do projeto nos limites exatos e além deles. Examine o tratamento de erros com tanto cuidado quanto a saída bem-sucedida para que os chamadores possam distinguir uma entrada malformada de uma lista vazia válida. ParenWick aceita conexões compatíveis com OpenAI ou da Anthropic que sejam suportadas, com credenciais quando necessário. Escolha um modelo sem restrições onde for oferecido e verifique o suporte a contexto e ferramentas do servidor. A alteração resultante deve ser explicável segundo a gramática, em vez de apenas plausível para uma expressão de exemplo.
Mudanças no analisador e seus limites
O que devo dar ao assistente além de exemplos válidos?
Forneça exemplos rejeitados, a sintaxe permitida de átomos e limites explícitos de tamanho, profundidade e nós. Declare como os erros chegam ao chamador. Isso permite revisar se a alteração proposta preserva o limite pretendido da linguagem.
Ler uma expressão executa seu conteúdo?
A tarefa ilustrada analisa a entrada em listas e strings de átomos. Ela não avalia essa representação. Mantenha a execução ou interpretação como um comportamento especificado separadamente e examine o código posterior antes de conectar a entrada analisada a qualquer ação.
Como uma segunda forma no nível superior deve ser tratada?
O contrato existente aceita uma forma entre parênteses e rejeita formas extras. Inclua um caso com duas formas e verifique se toda a entrada é considerada, para que uma mudança no analisador não aceite silenciosamente um prefixo válido enquanto ignora material final.
Por que testar exatamente no limite de aninhamento?
Isso distingue a maior estrutura aceita da primeira rejeitada e pode revelar alterações de uma unidade nos limites. Faça o mesmo para os limites de nós e de comprimento de entrada e verifique se a rejeição produz a resposta esperada pela aplicação chamadora.
ParenWick · Atualizado 2026-10-25