Penguraian ekspresi S terbatas
Urai satu ekspresi S berkurung sepanjang paling banyak 4096 karakter menjadi daftar dan string atom 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
Model
Atur endpoint kompatibel OpenAI atau Anthropic dengan URL dasar dan kunci API jika diperlukan. Uji koneksi. Server model lokal harus berjalan; alat jarak jauh dapat mengirim data secara terpisah.
Proyek
Uji daftar kosong, kedalaman 16 serta 1024 simpul, lalu tolak bentuk tambahan, daftar tidak tertutup dan sintaks kutipan yang tidak didukung tanpa mengeksekusi apa pun.
Tinjau sebelum menerapkan
Bandingkan perilaku sebenarnya dengan hasil yang diharapkan. Jika pemeriksaan gagal, cari penyebabnya sebelum membuat perubahan lain.
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
Pertahankan bahasa kecil tetap kecil saat parser berubah
ParenWick adalah ruang kerja pemrograman AI Windows untuk mengembangkan parser yang masukannya sengaja dibatasi. Buka proyek dan jelaskan bahasa yang harus dikenali aplikasi, termasuk batasnya. Minta asisten yang terhubung memeriksa parser saat ini dan kode pengguna hasilnya sebelum menyarankan tambalan agar kemudahan implementasi tidak diam-diam memperluas bahasa.
Pembaca S-expression terbatas memberikan contoh konkret. Bahas satu bentuk bertanda kurung, sintaks atom yang diizinkan, dan representasi daftar bersarang. Sertakan batas kedalaman serta jumlah simpul dalam permintaan, beserta perilaku ketika ada bentuk tambahan setelah bentuk pertama. Parser mengembalikan representasi masukan; interpretasi representasi itu merupakan bagian terpisah dari aplikasi.
Tinjau usulan menggunakan data uji yang diterima dan ditolak bersama, lalu jalankan pemeriksaan proyek tepat pada batas dan di luar batas. Periksa penanganan kesalahan seteliti keluaran berhasil agar pemanggil dapat membedakan masukan rusak dari daftar kosong yang valid. ParenWick menerima koneksi yang didukung, baik yang kompatibel dengan OpenAI maupun Anthropic, dengan kredensial bila diperlukan. Pilih model tanpa pembatasan jika ditawarkan, dan periksa dukungan konteks serta alat server. Tambalan hasil harus dapat dijelaskan berdasarkan tata bahasa Anda, bukan sekadar tampak masuk akal pada satu contoh ekspresi.
Perubahan parser dan batasnya
Apa yang perlu diberikan kepada asisten selain contoh valid?
Berikan contoh yang ditolak, sintaks atom yang diizinkan, serta batas ukuran, kedalaman, dan simpul yang eksplisit. Nyatakan cara kesalahan mencapai pemanggil. Ini memungkinkan peninjauan apakah usulan tambalan mempertahankan batas bahasa yang dimaksud.
Apakah membaca ekspresi mengeksekusi isinya?
Tugas ilustratif mengurai masukan menjadi daftar dan string atom. Tugas itu tidak mengevaluasi representasi tersebut. Tentukan eksekusi atau interpretasi sebagai perilaku terpisah, dan periksa kode selanjutnya sebelum menghubungkan masukan terurai dengan tindakan apa pun.
Bagaimana seharusnya bentuk tingkat teratas kedua diperlakukan?
Kontrak yang ada menerima satu bentuk bertanda kurung dan menolak tambahan. Sertakan data uji dengan dua bentuk dan pastikan seluruh masukan diperiksa agar perubahan parser tidak diam-diam menerima awalan valid sambil mengabaikan materi di belakangnya.
Mengapa menguji tepat pada batas kedalaman?
Itu membedakan struktur terbesar yang diterima dari yang pertama ditolak dan dapat mengungkap perubahan selisih satu. Lakukan hal sama untuk batas simpul dan panjang masukan, lalu verifikasi bahwa penolakan menghasilkan respons yang diharapkan aplikasi pemanggil.
ParenWick · Diperbarui 2026-10-25