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과 필요한 API 키로 OpenAI 호환 또는 Anthropic 엔드포인트를 설정하고 연결을 테스트하세요. 로컬 모델 서버는 실행 중이어야 합니다. 원격 도구는 데이터를 별도로 전송할 수 있습니다.
프로젝트
빈 리스트, 깊이 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 AI 코딩 작업 공간입니다. 프로젝트를 열고 애플리케이션이 인식해야 할 언어와 인식을 멈춰야 할 지점을 설명하세요. 구현 편의가 언어를 조용히 확장하지 않도록 패치 제안 전에 연결된 도우미에게 현재 파서와 소비부를 살펴보도록 요청하세요.
제한된 S식 리더는 구체적인 예제입니다. 괄호로 둘러싸인 단일 형식, 허용 아톰 구문, 중첩 목록 표현 방식을 논의하세요. 첫 형식 뒤에 추가 형식이 오면 어떻게 되는지와 함께 깊이 및 노드 한도를 요청에 포함하세요. 파서는 입력의 표현을 반환합니다. 그 표현의 해석은 애플리케이션의 별도 부분입니다.
허용 및 거부 테스트 사례를 함께 사용해 제안을 검토하고 정확한 한도와 한도 초과에서 프로젝트 검사를 실행하세요. 호출부가 잘못된 입력과 유효한 빈 목록을 구분할 수 있도록 성공 출력만큼 오류 처리도 면밀히 살펴보세요. ParenWick은 지원되는 OpenAI 호환 또는 Anthropic 연결을 받으며 필요하면 인증 정보를 사용합니다. 제공되는 경우 제한 없는 모델을 선택하고 서버의 컨텍스트·도구 지원을 확인하세요. 결과 패치는 샘플 식 하나에서 그럴듯한 정도가 아니라 자신의 문법에 맞춰 설명할 수 있어야 합니다.
파서 변경과 그 경계
유효한 예제 외에 도우미에게 무엇을 제공해야 하나요?
거부 예제, 허용 아톰 구문, 명시적인 크기·깊이·노드 한도를 제공하세요. 오류가 호출부에 전달되는 방식을 명시하세요. 그러면 제안된 패치가 의도한 언어 경계를 보존하는지 검토할 수 있습니다.
식을 읽으면 내용이 실행되나요?
예시 작업은 입력을 목록과 아톰 문자열로 파싱합니다. 그 표현을 평가하지는 않습니다. 실행이나 해석을 별도로 지정한 동작으로 유지하고 파싱된 입력을 어떤 동작에 연결하기 전에 후속 코드를 살펴보세요.
두 번째 최상위 형식은 어떻게 처리해야 하나요?
기존 계약은 괄호 형식 하나를 허용하고 추가 형식은 거부합니다. 형식 두 개가 있는 사례를 포함하고 전체 입력을 고려하는지 확인하여 파서 변경이 유효한 접두부만 허용하고 뒤 자료를 무시하지 않도록 하세요.
정확히 중첩 한도에서 테스트하는 이유는 무엇인가요?
허용되는 가장 큰 구조와 처음 거부되는 구조를 구분하고 경계가 하나 어긋나는 변경을 드러낼 수 있습니다. 노드와 입력 길이 한도도 같은 방식으로 테스트하고 거부가 호출 애플리케이션에서 기대하는 응답을 내는지 검증하세요.
ParenWick · 업데이트 2026-10-25