Apakah ada dokumentasi SMIE yang jelas?

18

Saya telah menghabiskan banyak waktu sekarang mencoba untuk mendapatkan aturan indentasi / tata bahasa SMIE apa pun bekerja.

Apakah ada contoh mode kecil, mainan atau kerangka berbasis SMIE dengan dokumentasi tentang cara kerjanya, atau diskusi di mana saja tentang cara menggunakannya? Sesuatu yang, katakanlah, mendefinisikan ekspresi sebagai string token yang diakhiri dengan titik koma dan blok sebagai beberapa ekspresi antara tanda kurung dan tidak ada yang lain. Sangat, sangat sederhana?

Pertanyaan spesifik: ketika menggunakan smie-config-show-indent 90% dari waktu saya mendapatkan respons ': list-intro "" -> nil'. Apa daftar-intro mendasarkan definisi suatu ekspresi atau daftar ekspresi? Mengapa katanya nihil dan masih indentasi baris berikut? Bagaimana saya mengubahnya?

Kedua: apakah ada hubungan antara tata bahasa saya dan aturan smie saya? Saya berasumsi ada karena keduanya masuk ke smie-setup, tetapi saya tidak dapat menemukan cara untuk mengatakan, "ketika Anda melihat 'blok', inden isinya", misalnya, berdasarkan tata bahasa yang mengidentifikasi blok .

Ketiga, SMIE tampaknya memiliki banyak aturan "dipanggang". Sebagai contoh, menendang saja memberikan penanganan umum tanda kurung, kawat gigi, dan tanda kurung. Apakah ada cara untuk melihat aturan-aturan ini atau mengubahnya? Atau apakah tabel sintaks melakukan semua ini dan SMIE benar-benar tidak melakukan apa-apa sama sekali (yang saya mulai curigai).

Akhirnya, ketika mencoba men-debug SMIE saya mencoba melakukan "edit, eval mode buffer, buka contoh kode dalam buffer lain, MX <my mode>, test" cycle tetapi tampaknya setiap perjalanan tidak menghapus aturan dari siklus sebelumnya. Bagaimana saya bisa yakin bahwa mode define-turunan dimulai dari clean sheet? Saya punya (kill-all-local-variable) di sana tetapi sepertinya tidak cukup dan akhirnya saya harus menutup emacs.

Saya tidak memposting contoh apa pun yang saya miliki karena saya tidak memiliki apa pun yang bekerja secara samar-samar, selain menyoroti (menggunakan font-lock-default, jadi itu bahkan bukan SMIE, saya kira). Saya perlu beberapa langkah bayi nyata.

Nagora
sumber
1
Coba tanyakan dokumentasi kepada penulis SMIE?
Drew
4
@drew Dia secara terbuka menyatakan bahwa dia bukan dokumenter yang baik (dan setelah membaca dokumentasinya saya tidak bisa membantah), jadi sepertinya tidak ada gunanya.
Nagora
1
Ya saya tahu. Dia bahkan mengatakan bahwa kode harus cukup sebagai doc. Oh, apakah saya lupa meletakkan " ;-) " setelah saran saya? ;-)
Drew
1
Saya telah melihat ini beberapa waktu lalu dan memperhatikan bahwa lisp/progmodes/sh-script.eltampaknya menggunakan smie.elagak luas. Mereka juga sepertinya mendokumentasikan penggunaannya, jadi mungkin itu contoh yang lebih baik?
Xaldew
2
Mode SML dan mode Modula2 keduanya menggunakan SMIE. SMIE IIRC diekstraksi dari mode SML awalnya. Harus saya akui, saya juga merasa ini sangat sulit.
ocodo

Jawaban:

1

Anda bisa mulai dengan sesuatu seperti

(defconst foo-smie-grammar
    (smie-prec2->grammar
     (smie-bnf->prec2
      '((exp ("begin" insts "end"))
        (insts (exp) (insts ";" insts))))))

  ...
  (smie-setup foo-smie-grammar #'ignore)
  ...
Stefan
sumber