Che cos'è un recinto di stringhe o un recinto di commenti?


9

La documentazione per modify-syntax-entrydice quanto segue:

(modify-syntax-entry CHAR NEWENTRY &optional SYNTAX-TABLE)
...
The first character of NEWENTRY should be one of the following:
...
  /           character-quote.      @   inherit from parent table.
  |           generic string fence. !   generic comment fence.

Che cos'è una recinzione e quando dovrei usarne una? Non riesco a trovare nulla nel manuale informativo.


Questa è una domanda alla quale Emacs dovrebbe rispondere. La stringa del documento dovrebbe definire o almeno descrivere il termine " recinto ". Si prega di prendere in considerazione un bug doc: M-x report-emacs-bug.
Estratto il

Normalmente, un delimitatore di stringa o commento può specificare quale carattere termina una stringa. Ad esempio un "può essere terminato solo da un altro ". Tuttavia, quando syntax-propertizeviene utilizzata una funzione personalizzata per riconoscere una stringa, ciò non è possibile. Invece, puoi contrassegnare i punti finali di stringhe e commenti usando |e !, rispettivamente. (La documentazione afferma che queste classi di sintassi dovrebbero essere utilizzate principalmente quando si utilizza la syntax-tableproprietà text, che è ciò che syntax-propertizeimposta una funzione personalizzata .)
Lindydancer

Risposte:


8

Sono documentati nel manuale, ma non usa la parola "recinto". I caratteri !e |sono elencati come "delimitatori di commenti generici" e "delimitatori di stringhe generici" nel riferimento della classe di sintassi .

Questi personaggi sono stati introdotti in Emacs 20.1. Citando il file NEWS:

Esistono due nuovi codici di sintassi !e |(valori numerici 14 e 15). Un carattere con un codice !inizia un commento che termina solo con un altro carattere con lo stesso codice (a meno che non sia citato). Un carattere con un codice |inizia una stringa che termina solo con un altro carattere con lo stesso codice (a meno che non sia citato).

Questi codici sono principalmente pensati per essere usati come valori della proprietà text `sintassi-table '.

Non riesco a trovare alcun uso !nelle modalità Emacs standard. Ci sono molti usi di |. Il caso d'uso previsto sono le lingue che hanno letterali che usano delimitatori diversi dai soliti delimitatori di stringa, generalmente impostati tramite sovrapposizioni aggiunte dal blocco dei caratteri in base al contesto. Ad esempio, in perl, può essere scritta una corrispondenza di espressione regolare /REGEXP/, m/REGEXP/oppure m~REGEXP~oppure m[REGEXP]oppure un numero qualsiasi di variazioni. Una stringa letterale può essere scritto 'STRING', ma anche q'STRING', q~STRING~, q[STRING], ecc Quando il blocco del carattere riconosce tali costrutti, si imposta i caratteri di citazione ( // /o '/ 'o ~/ ~o [/]negli esempi che ho fornito) alla sintassi del delimitatore di stringa generica. Anche se è presente un delimitatore di stringa abituale (ad es. q[foo"bar]), Quel delimitatore sarà considerato una parte ordinaria della stringa, non terminerà la stringa.

Ammetto che non vedo un vantaggio definitivo, ad esempio la modalità CPerl fa cose molto fantasiose e non usa questa funzione.


2
La modalità Ruby consente !di evidenziare =begin... i =endblocchi.
Lindydancer,

5

Tratto da sintassi.h:

/* A syntax table is a chartable whose elements are cons cells
   (CODE+FLAGS . MATCHING-CHAR).  MATCHING-CHAR can be nil if the char
   is not a kind of parenthesis.

   The low 8 bits of CODE+FLAGS is a code, as follows:  */

enum syntaxcode
  {
    Swhitespace, /* for a whitespace character */
    Spunct,      /* for random punctuation characters */
    Sword,       /* for a word constituent */
    Ssymbol,     /* symbol constituent but not word constituent */
    Sopen,       /* for a beginning delimiter */
    Sclose,      /* for an ending delimiter */
    Squote,      /* for a prefix character like Lisp ' */
    Sstring,     /* for a string-grouping character like Lisp " */
    Smath,       /* for delimiters like $ in Tex.  */
    Sescape,     /* for a character that begins a C-style escape */
    Scharquote,  /* for a character that quotes the following character */
    Scomment,    /* for a comment-starting character */
    Sendcomment, /* for a comment-ending character */
    Sinherit,    /* use the standard syntax table for this character */
    Scomment_fence, /* Starts/ends comment which is delimited on the
                       other side by any char with the same syntaxcode.  */
    Sstring_fence,  /* Starts/ends string which is delimited on the
                       other side by any char with the same syntaxcode.  */
    Smax         /* Upper bound on codes that are meaningful */
  };

Supponendo che i codici di sintassi e le classi di sintassi regex si riferiscano alla stessa cosa, ne ho individuato l'uso |in cc-awk.elcui utilizza "\\s|"per evidenziare i delimitatori di stringa sbilanciati.


2
Sono utilizzati in alcuni punti, ad esempio python-syntax-stringify, ruby-syntax-propertize-percent-literale altri . Non vedo come differisce da Sstringqui però.
Wilfred Hughes,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.