¿Hay alguna documentación de SMIE que sea clara?

18

He pasado muchas, muchas horas tratando de hacer que funcione cualquier tipo de regla / gramática / cosa de sangría SMIE.

¿Hay algún ejemplo de un modo pequeño, de juguete o esqueleto basado en SMIE con documentación sobre cómo funciona realmente, o alguna discusión sobre cómo usarlo? Algo que, por ejemplo, define una expresión como una cadena de tokens que termina en punto y coma y un bloque como algunas expresiones entre paréntesis y nada más. ¿Realmente, realmente simple?

Preguntas específicas: cuando uso smie-config-show-indent el 90% de las veces obtengo la respuesta ': list-intro "" -> nil'. ¿En qué se basa la introducción de la lista en su definición de una expresión o una lista de expresiones? ¿Por qué dice nil y aún sangra las siguientes líneas? ¿Cómo lo cambio?

En segundo lugar: ¿hay alguna relación entre mi gramática y mis reglas smie? Supongo que sí porque ambos se pasan a la configuración smie, pero no puedo encontrar ninguna forma de decir "cuando veas un 'bloque', sangra el contenido", por ejemplo, en base a una gramática que identifica un bloque .

En tercer lugar, SMIE parece tener muchas reglas "integradas". Simplemente comenzarlo da un manejo general de corchetes, llaves y paréntesis, por ejemplo. ¿Hay alguna forma de ver estas reglas o modificarlas? ¿O es que la tabla de sintaxis está haciendo todo esto y SMIE literalmente no está haciendo nada en absoluto (lo que estoy empezando a sospechar).

Finalmente, cuando intento depurar SMIE trato de hacer un "editar, evaluar el búfer de modo, ir al código de ejemplo en otro búfer, MX <mi modo>, probar" ciclo, pero parece que cada vuelta no borra las reglas de El ciclo anterior. ¿Cómo puedo estar seguro de que el modo definido derivado comienza desde una hoja limpia? Tengo (kill-all-local-variables) allí, pero no parece ser suficiente y termino teniendo que cerrar emacs.

No estoy publicando ningún ejemplo de lo que tengo porque no tengo nada que funcione vagamente, aparte de resaltar (usar font-lock-defaults, por lo que no es SMIE, supongo). Necesito algunos pasos de bebé reales.

Nagora
fuente
1
¿Intenta pedirle documentación al autor de SMIE?
Dibujó
44
@drew Él ha declarado públicamente que no es un buen documentalista (y después de haber leído su documentación no puedo discutir), por lo que parece inútil.
Nagora
1
Sí, lo sé. Incluso ha dicho que el código debería ser suficiente como documento. Oh, ¿olvidé poner un " ;-) " después de mi sugerencia? ;-)
Dibujó
1
Eché un vistazo a esto hace un tiempo y noté que lisp/progmodes/sh-script.elparece que se usa smie.elbastante. También parecen documentar su uso, por lo que quizás sea un mejor ejemplo.
Xaldew
2
El modo SML y el modo Modula2 usan SMIE. IIRC SMIE se extrajo del modo SML originalmente. Debo admitir que también he encontrado esto particularmente difícil.
ocodo

Respuestas:

1

Podrías comenzar con algo como

(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
fuente