Existe alguma documentação SMIE clara?

18

Passei muitas e muitas horas tentando obter qualquer tipo de regra / gramática / coisa de identação SMIE.

Existem exemplos de um modo pequeno, baseado em SMIE, de brinquedo ou esqueleto, com documentação sobre como ele realmente funciona ou alguma discussão sobre como usá-lo? Algo que, digamos, define uma expressão como uma sequência de tokens que termina em ponto-e-vírgula e um bloco como algumas expressões entre colchetes e nada mais. Realmente, realmente simples?

Perguntas específicas: ao usar smie-config-show-indent 90% das vezes, recebo a resposta ': list-intro "" -> nil'. Em que consiste a introdução de lista com base na sua definição de expressão ou lista de expressões? Por que diz zero e ainda recua as seguintes linhas? Como eu mudo isso?

Em segundo lugar: existe alguma relação entre minha gramática e minhas regras de smie? Suponho que exista porque ambos são passados ​​para a configuração de smie, mas não consigo encontrar nenhuma maneira de dizer "quando você vê um 'bloco', recua o conteúdo", por exemplo, com base em uma gramática que identifica um bloco .

Em terceiro lugar, o SMIE parece ter muitas regras "implementadas". Apenas dar o pontapé inicial dá um tratamento geral de colchetes, chaves e parênteses, por exemplo. Existe alguma maneira de ver essas regras ou modificá-las? Ou é que a tabela de sintaxe está fazendo tudo isso e o SMIE literalmente não está fazendo absolutamente nada (o que estou começando a suspeitar).

Por fim, ao tentar depurar o SMIE, tento fazer um "editar, buffer de modo de avaliação, vá para o exemplo de código em outro buffer, ciclo MX <meu modo>, teste", mas parece que cada viagem não limpa as regras do o ciclo anterior. Como posso ter certeza de que o modo de definição derivada inicia em uma folha limpa? Eu tenho (matar todas as variáveis ​​locais) lá, mas isso não parece suficiente e acabo tendo que fechar o emacs.

Não estou publicando nenhum exemplo do que tenho, porque não tenho nada que funcione vagamente, além do destaque (usando padrões de bloqueio de fonte, por isso não é nem SMIE, eu acho). Eu preciso de alguns passos de bebê de verdade.

Nagora
fonte
1
Tente pedir documentação ao autor do SMIE?
Desenhou
4
@drew Ele declarou publicamente que não é um bom documentador (e, depois de ler sua documentação, não posso argumentar), parece inútil.
Nagora 12/02
1
Sim eu conheço. Ele até disse que o código deveria ser suficiente como doc. Ah, esqueci de colocar um " ;-) " depois da minha sugestão? ;-)
Drew
1
Eu olhei para isso há algum tempo e notei que lisp/progmodes/sh-script.elparece usar smie.elbastante. Eles também parecem documentar seu uso, então talvez esse seja um exemplo um pouco melhor?
Xaldew
2
Os modos SML e Modula2 usam SMIE. O IIRC SMIE foi extraído do modo SML originalmente. Devo admitir que também achei isso particularmente difícil.
Ocho

Respostas:

1

Você poderia começar com 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
fonte