Para quais idiomas o `syntax-ppss` é apropriado?

12

Eu estive procurando uma maneira de detectar se o ponto está em um comentário, observando como o buffer atual é tipificado.

Smartparens define sp-point-in-comment, em que se baseia syntax-ppss. No entanto, parece que syntax-ppsse parse-partial-sexppode ser usado para línguas arbitrárias, mesmo se eles não usam s-expressões.

Por exemplo, este Python:

x = 1
# I'm a comment
y = 2

O ponto de colocação dentro do comentário e a avaliação (if (nth 4 (syntax-ppss)) 'comment 'not-comment)funcionam corretamente.

Funciona syntax-ppsspara qualquer modo de programação? Por que os documentos discutem expressões s?

Wilfred Hughes
fonte
1
Não que eu tenha explorado isso completamente, mas ainda não encontrei um idioma em que ele não funcione. Mesmo nos modos derivados de texto, como o látex, funcionou bem para mim.
Malabarba 7/10

Respostas:

13

Bem, expressões-s são essencialmente “sintaxe abstrata”, no sentido de que são apenas uma sintaxe concreta para árvores de sintaxe abstrata e, portanto, qualquer linguagem pode ser representada como expressões-s e manipulada com comandos de expressão-s. Portanto, syntax-ppssfalar em "Sexps" é simplesmente a maneira do Lisp de falar sobre árvores de sintaxe abstrata.

Praticamente, no entanto, syntax-ppssgeralmente não funciona em nenhum modo. É fundamentalmente direcionado para linguagens do tipo Lisp, e se a linguagem concreta de uma linguagem se desvia muito do Sexps, não faz muito sentido usar os comandos do Sexp para manipular a linguagem. Funcionaria, mas haveria uma lacuna muito grande entre a representação abstrata e a sintaxe concreta, o que tornaria a maioria dos comandos contra-intuitivos.

No entanto, parte da infraestrutura subjacente syntax-ppssé bastante genérica. Os modos principais geralmente se esforçam para se conectar a ele, porque os fazem funcionar bem com muitos recursos internos do Emacs e fornecem uma interface genérica para outros pacotes de terceiros, como o Smartparens.

Notavelmente, syntax-ppssconta com tabelas de sintaxe para seqüências de caracteres e comentários. As tabelas de sintaxe categorizam caracteres individuais por sua classe sintática. Existem classes para delimitadores emparelhados, delimitadores de cadeia e caracteres de comentário.

A estrutura de strings e comentários é bastante semelhante em quase todas as linguagens de programação: Strings são normalmente incluídas em delimitadores especiais. Os comentários também podem ter delimitadores especiais ou começar com um determinado caractere e se estender até o final da linha. Essas estruturas podem ser facilmente capturadas em tabelas de sintaxe, e quase todos os principais modos definem tabelas de sintaxe apropriadas, apenas para lucrar com a fortificação sintática do Emacs.

Portanto, syntax-ppssfunciona bem para strings e comentários em quase qualquer idioma, mas o suporte e a "utilidade" de outros recursos variam.

lunaryorn
fonte
4

Adicionando à resposta do @ lunaryorn, acho que o syntax-ppss depende apenas da robustez do sistema de tabelas de sintaxe do emacs, que funciona para comentários e strings na maioria dos idiomas. Mas se o idioma tiver sintaxe que a tabela de sintaxe não pode capturar e se o modo não construísse um analisador para adicionar propriedades de sintaxe aos locais certos, syntax-ppssfalharia.

Tente isso em html-mode:

<p class="aa" id='bb'>"cc" 'dd'</p>

e chame o seguinte comando:

(defun inside-string-p (&optional pos)
  "Return non-nil if inside string, else nil.
This depends on major mode having setup syntax table properly."
  (interactive)
  (let ((result (nth 3 (syntax-ppss pos))))
    (print result)
    result))

Somente aa é verdadeiro, mas bb também deve ser verdadeiro.

Quando está dentro nxml-mode, nada retorna true, mas pelo menos aa deve ser true.

Xah Lee
fonte