@c -*-texinfo-*- @c This is part of the GNU Emacs Lisp Reference Manual. @c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999 @c Free Software Foundation, Inc. @c See the file elisp.texi for copying conditions. @setfilename ../info/syntax @node Syntax Tables, Abbrevs, Searching and Matching, Top @chapter Syntax Tables @cindex parsing @cindex syntax table @cindex text parsing A @dfn{syntax table} specifies the syntactic textual function of each character. This information is used by the @dfn{parsing functions}, the complex movement commands, and others to determine where words, symbols, and other syntactic constructs begin and end. The current syntax table controls the meaning of the word motion functions (@pxref{Word Motion}) and the list motion functions (@pxref{List Motion}), as well as the functions in this chapter. @menu * Basics: Syntax Basics. Basic concepts of syntax tables. * Desc: Syntax Descriptors. How characters are classified. * Syntax Table Functions:: How to create, examine and alter syntax tables. * Syntax Properties:: Overriding syntax with text properties. * Motion and Syntax:: Moving over characters with certain syntaxes. * Parsing Expressions:: Parsing balanced expressions using the syntax table. * Standard Syntax Tables:: Syntax tables used by various major modes. * Syntax Table Internals:: How syntax table information is stored. * Categories:: Another way of classifying character syntax. @end menu @node Syntax Basics @section Syntax Table Concepts @ifnottex A @dfn{syntax table} provides Emacs with the information that determines the syntactic use of each character in a buffer. This information is used by the parsing commands, the complex movement commands, and others to determine where words, symbols, and other syntactic constructs begin and end. The current syntax table controls the meaning of the word motion functions (@pxref{Word Motion}) and the list motion functions (@pxref{List Motion}) as well as the functions in this chapter. @end ifnottex A syntax table is a char-table (@pxref{Char-Tables}). The element at index @var{c} describes the character with code @var{c}. The element's value should be a list that encodes the syntax of the character in question. Syntax tables are used only for moving across text, not for the Emacs Lisp reader. Emacs Lisp uses built-in syntactic rules when reading Lisp expressions, and these rules cannot be changed. (Some Lisp systems provide ways to redefine the read syntax, but we decided to leave this feature out of Emacs Lisp for simplicity.) Each buffer has its own major mode, and each major mode has its own idea of the syntactic class of various characters. For example, in Lisp mode, the character @samp{;} begins a comment, but in C mode, it terminates a statement. To support these variations, Emacs makes the choice of syntax table local to each buffer. Typically, each major mode has its own syntax table and installs that table in each buffer that uses that mode. Changing this table alters the syntax in all those buffers as well as in any buffers subsequently put in that mode. Occasionally several similar modes share one syntax table. @xref{Example Major Modes}, for an example of how to set up a syntax table. A syntax table can inherit the data for some characters from the standard syntax table, while specifying other characters itself. The ``inherit'' syntax class means ``inherit this character's syntax from the standard syntax table.'' Just changing the standard syntax for a character affects all syntax tables that inherit from it. @defun syntax-table-p object This function returns @code{t} if @var{object} is a syntax table. @end defun @node Syntax Descriptors @section Syntax Descriptors @cindex syntax classes This section describes the syntax classes and flags that denote the syntax of a character, and how they are represented as a @dfn{syntax descriptor}, which is a Lisp string that you pass to @code{modify-syntax-entry} to specify the syntax you want. The syntax table specifies a syntax class for each character. There is no necessary relationship between the class of a character in one syntax table and its class in any other table. Each class is designated by a mnemonic character, which serves as the name of the class when you need to specify a class. Usually the designator character is one that is often assigned that class; however, its meaning as a designator is unvarying and independent of what syntax that character currently has. Thus, @samp{\} as a designator character always gives ``escape character'' syntax, regardless of what syntax @samp{\} currently has. @cindex syntax descriptor A syntax descriptor is a Lisp string that specifies a syntax class, a matching character (used only for the parenthesis classes) and flags. The first character is the designator for a syntax class. The second character is the character to match; if it is unused, put a space there. Then come the characters for any desired flags. If no matching character or flags are needed, one character is sufficient. For example, the syntax descriptor for the character @samp{*} in C mode is @samp{@w{. 23}} (i.e., punctuation, matching character slot unused, second character of a comment-starter, first character of a comment-ender), and the entry for @samp{/} is @samp{@w{. 14}} (i.e., punctuation, matching character slot unused, first character of a comment-starter, second character of a comment-ender). @menu * Syntax Class Table:: Table of syntax classes. * Syntax Flags:: Additional flags each character can have. @end menu @node Syntax Class Table @subsection Table of Syntax Classes Here is a table of syntax classes, the characters that stand for them, their meanings, and examples of their use. @deffn {Syntax class} @w{whitespace character} @dfn{Whitespace characters} (designated by @w{@samp{@ }} or @samp{-}) separate symbols and words from each other. Typically, whitespace characters have no other syntactic significance, and multiple whitespace characters are syntactically equivalent to a single one. Space, tab, newline and formfeed are classified as whitespace in almost all major modes. @end deffn @deffn {Syntax class} @w{word constituent} @dfn{Word constituents} (designated by @samp{w}) are parts of normal English words and are typically used in variable and command names in programs. All upper- and lower-case letters, and the digits, are typically word constituents. @end deffn @deffn {Syntax class} @w{symbol constituent} @dfn{Symbol constituents} (designated by @samp{_}) are the extra characters that are used in variable and command names along with word constituents. For example, the symbol constituents class is used in Lisp mode to indicate that certain characters may be part of symbol names even though they are not part of English words. These characters are @samp{$&*+-_<>}. In standard C, the only non-word-constituent character that is valid in symbols is underscore (@samp{_}). @end deffn @deffn {Syntax class} @w{punctuation character} @dfn{Punctuation characters} (designated by @samp{.}) are those characters that are used as punctuation in English, or are used in some way in a programming language to separate symbols from one another. Most programming language modes, including Emacs Lisp mode, have no characters in this class since the few characters that are not symbol or word constituents all have other uses. @end deffn @deffn {Syntax class} @w{open parenthesis character} @deffnx {Syntax class} @w{close parenthesis character} @cindex parenthesis syntax Open and close @dfn{parenthesis characters} are characters used in dissimilar pairs to surround sentences or expressions. Such a grouping is begun with an open parenthesis character and terminated with a close. Each open parenthesis character matches a particular close parenthesis character, and vice versa. Normally, Emacs indicates momentarily the matching open parenthesis when you insert a close parenthesis. @xref{Blinking}. The class of open parentheses is designated by @samp{(}, and that of close parentheses by @samp{)}. In English text, and in C code, the parenthesis pairs are @samp{()}, @samp{[]}, and @samp{@{@}}. In Emacs Lisp, the delimiters for lists and vectors (@samp{()} and @samp{[]}) are classified as parenthesis characters. @end deffn @deffn {Syntax class} @w{string quote} @dfn{String quote characters} (designated by @samp{"}) are used in many languages, including Lisp and C, to delimit string constants. The same string quote character appears at the beginning and the end of a string. Such quoted strings do not nest. The parsing facilities of Emacs consider a string as a single token. The usual syntactic meanings of the characters in the string are suppressed. The Lisp modes have two string quote characters: double-quote (@samp{"}) and vertical bar (@samp{|}). @samp{|} is not used in Emacs Lisp, but it is used in Common Lisp. C also has two string quote characters: double-quote for strings, and single-quote (@samp{'}) for character constants. English text has no string quote characters because English is not a programming language. Although quotation marks are used in English, we do not want them to turn off the usual syntactic properties of other characters in the quotation. @end deffn @deffn {Syntax class} @w{escape} An @dfn{escape character} (designated by @samp{\}) starts an escape sequence such as is used in C string and character constants. The character @samp{\} belongs to this class in both C and Lisp. (In C, it is used thus only inside strings, but it turns out to cause no trouble to treat it this way throughout C code.) Characters in this class count as part of words if @code{words-include-escapes} is non-@code{nil}. @xref{Word Motion}. @end deffn @deffn {Syntax class} @w{character quote} A @dfn{character quote character} (designated by @samp{/}) quotes the following character so that it loses its normal syntactic meaning. This differs from an escape character in that only the character immediately following is ever affected. Characters in this class count as part of words if @code{words-include-escapes} is non-@code{nil}. @xref{Word Motion}. This class is used for backslash in @TeX{} mode. @end deffn @deffn {Syntax class} @w{paired delimiter} @dfn{Paired delimiter characters} (designated by @samp{$}) are like string quote characters except that the syntactic properties of the characters between the delimiters are not suppressed. Only @TeX{} mode uses a paired delimiter presently---the @samp{$} that both enters and leaves math mode. @end deffn @deffn {Syntax class} @w{expression prefix} An @dfn{expression prefix operator} (designated by @samp{'}) is used for syntactic operators that are considered as part of an expression if they appear next to one. In Lisp modes, these characters include the apostrophe, @samp{'} (used for quoting), the comma, @samp{,} (used in macros), and @samp{#} (used in the read syntax for certain data types). @end deffn @deffn {Syntax class} @w{comment starter} @deffnx {Syntax class} @w{comment ender} @cindex comment syntax The @dfn{comment starter} and @dfn{comment ender} characters are used in various languages to delimit comments. These classes are designated by @samp{<} and @samp{>}, respectively. English text has no comment characters. In Lisp, the semicolon (@samp{;}) starts a comment and a newline or formfeed ends one. @end deffn @deffn {Syntax class} @w{inherit} This syntax class does not specify a particular syntax. It says to look in the standard syntax table to find the syntax of this character. The designator for this syntax code is @samp{@@}. @end deffn @deffn {Syntax class} @w{generic comment delimiter} A @dfn{generic comment delimiter} (designated by @samp{!}) starts or ends a special kind of comment. @emph{Any} generic comment delimiter matches @emph{any} generic comment delimiter, but they cannot match a comment starter or comment ender; generic comment delimiters can only match each other. This syntax class is primarily meant for use with the @code{syntax-table} text property (@pxref{Syntax Properties}). You can mark any range of characters as forming a comment, by giving the first and last characters of the range @code{syntax-table} properties identifying them as generic comment delimiters. @end deffn @deffn {Syntax class} @w{generic string delimiter} A @dfn{generic string delimiter} (designated by @samp{|}) starts or ends a string. This class differs from the string quote class in that @emph{any} generic string delimiter can match any other generic string delimiter; but they do not match ordinary string quote characters. This syntax class is primarily meant for use with the @code{syntax-table} text property (@pxref{Syntax Properties}). You can mark any range of characters as forming a string constant, by giving the first and last characters of the range @code{syntax-table} properties identifying them as generic string delimiters. @end deffn @node Syntax Flags @subsection Syntax Flags @cindex syntax flags In addition to the classes, entries for characters in a syntax table can specify flags. There are seven possible flags, represented by the characters @samp{1}, @samp{2}, @samp{3}, @samp{4}, @samp{b}, @samp{n}, and @samp{p}. All the flags except @samp{n} and @samp{p} are used to describe multi-character comment delimiters. The digit flags indicate that a character can @emph{also} be part of a comment sequence, in addition to the syntactic properties associated with its character class. The flags are independent of the class and each other for the sake of characters such as @samp{*} in C mode, which is a punctuation character, @emph{and} the second character of a start-of-comment sequence (@samp{/*}), @emph{and} the first character of an end-of-comment sequence (@samp{*/}). Here is a table of the possible flags for a character @var{c}, and what they mean: @itemize @bullet @item @samp{1} means @var{c} is the start of a two-character comment-start sequence. @item @samp{2} means @var{c} is the second character of such a sequence. @item @samp{3} means @var{c} is the start of a two-character comment-end sequence. @item @samp{4} means @var{c} is the second character of such a sequence. @item @c Emacs 19 feature @samp{b} means that @var{c} as a comment delimiter belongs to the alternative ``b'' comment style. Emacs supports two comment styles simultaneously in any one syntax table. This is for the sake of C++. Each style of comment syntax has its own comment-start sequence and its own comment-end sequence. Each comment must stick to one style or the other; thus, if it starts with the comment-start sequence of style ``b'', it must also end with the comment-end sequence of style ``b''. The two comment-start sequences must begin with the same character; only the second character may differ. Mark the second character of the ``b''-style comment-start sequence with the @samp{b} flag. A comment-end sequence (one or two characters) applies to the ``b'' style if its first character has the @samp{b} flag set; otherwise, it applies to the ``a'' style. The appropriate comment syntax settings for C++ are as follows: @table @asis @item @samp{/} @samp{124b} @item @samp{*} @samp{23} @item newline @samp{>b} @end table This defines four comment-delimiting sequences: @table @asis @item @samp{/*} This is a comment-start sequence for ``a'' style because the second character, @samp{*}, does not have the @samp{b} flag. @item @samp{//} This is a comment-start sequence for ``b'' style because the second character, @samp{/}, does have the @samp{b} flag. @item @samp{*/} This is a comment-end sequence for ``a'' style because the first character, @samp{*}, does not have the @samp{b} flag. @item newline This is a comment-end sequence for ``b'' style, because the newline character has the @samp{b} flag. @end table @item @samp{n} on a comment delimiter character specifies that this kind of comment can be nested. For a two-character comment delimiter, @samp{n} on either character makes it nestable. @item @c Emacs 19 feature @samp{p} identifies an additional ``prefix character'' for Lisp syntax. These characters are treated as whitespace when they appear between expressions. When they appear within an expression, they are handled according to their usual syntax codes. The function @code{backward-prefix-chars} moves back over these characters, as well as over characters whose primary syntax class is prefix (@samp{'}). @xref{Motion and Syntax}. @end itemize @node Syntax Table Functions @section Syntax Table Functions In this section we describe functions for creating, accessing and altering syntax tables. @defun make-syntax-table This function creates a new syntax table. It inherits the syntax for letters and control characters from the standard syntax table. For other characters, the syntax is copied from the standard syntax table. Most major mode syntax tables are created in this way. @end defun @defun copy-syntax-table &optional table This function constructs a copy of @var{table} and returns it. If @var{table} is not supplied (or is @code{nil}), it returns a copy of the current syntax table. Otherwise, an error is signaled if @var{table} is not a syntax table. @end defun @deffn Command modify-syntax-entry char syntax-descriptor &optional table This function sets the syntax entry for @var{char} according to @var{syntax-descriptor}. The syntax is changed only for @var{table}, which defaults to the current buffer's syntax table, and not in any other syntax table. The argument @var{syntax-descriptor} specifies the desired syntax; this is a string beginning with a class designator character, and optionally containing a matching character and flags as well. @xref{Syntax Descriptors}. This function always returns @code{nil}. The old syntax information in the table for this character is discarded. An error is signaled if the first character of the syntax descriptor is not one of the twelve syntax class designator characters. An error is also signaled if @var{char} is not a character. @example @group @exdent @r{Examples:} ;; @r{Put the space character in class whitespace.} (modify-syntax-entry ?\ " ") @result{} nil @end group @group ;; @r{Make @samp{$} an open parenthesis character,} ;; @r{with @samp{^} as its matching close.} (modify-syntax-entry ?$ "(^") @result{} nil @end group @group ;; @r{Make @samp{^} a close parenthesis character,} ;; @r{with @samp{$} as its matching open.} (modify-syntax-entry ?^ ")$") @result{} nil @end group @group ;; @r{Make @samp{/} a punctuation character,} ;; @r{the first character of a start-comment sequence,} ;; @r{and the second character of an end-comment sequence.} ;; @r{This is used in C mode.} (modify-syntax-entry ?/ ". 14") @result{} nil @end group @end example @end deffn @defun char-syntax character This function returns the syntax class of @var{character}, represented by its mnemonic designator character. This returns @emph{only} the class, not any matching parenthesis or flags. An error is signaled if @var{char} is not a character. The following examples apply to C mode. The first example shows that the syntax class of space is whitespace (represented by a space). The second example shows that the syntax of @samp{/} is punctuation. This does not show the fact that it is also part of comment-start and -end sequences. The third example shows that open parenthesis is in the class of open parentheses. This does not show the fact that it has a matching character, @samp{)}. @example @group (string (char-syntax ?\ )) @result{} " " @end group @group (string (char-syntax ?/)) @result{} "." @end group @group (string (char-syntax ?\()) @result{} "(" @end group @end example We use @code{string} to make it easier to see the character returned by @code{char-syntax}. @end defun @defun set-syntax-table table This function makes @var{table} the syntax table for the current buffer. It returns @var{table}. @end defun @defun syntax-table This function returns the current syntax table, which is the table for the current buffer. @end defun @defmac with-syntax-table @var{table} @var{body}... @tindex with-syntax-table This macro executes @var{body} using @var{table} as the current syntax table. It returns the value of the last form in @var{body}, after restoring the old current syntax table. Since each buffer has its own current syntax table, we should make that more precise: @code{with-syntax-table} temporarily alters the current syntax table of whichever buffer is current at the time the macro execution starts. Other buffers are not affected. @end defmac @node Syntax Properties @section Syntax Properties @kindex syntax-table @r{(text property)} When the syntax table is not flexible enough to specify the syntax of a language, you can use @code{syntax-table} text properties to override the syntax table for specific character occurrences in the buffer. @xref{Text Properties}. The valid values of @code{syntax-table} text property are: @table @asis @item @var{syntax-table} If the property value is a syntax table, that table is used instead of the current buffer's syntax table to determine the syntax for this occurrence of the character. @item @code{(@var{syntax-code} . @var{matching-char})} A cons cell of this format specifies the syntax for this occurrence of the character. (@pxref{Syntax Table Internals}) @item @code{nil} If the property is @code{nil}, the character's syntax is determined from the current syntax table in the usual way. @end table @defvar parse-sexp-lookup-properties If this is non-@code{nil}, the syntax scanning functions pay attention to syntax text properties. Otherwise they use only the current syntax table. @end defvar @node Motion and Syntax @section Motion and Syntax This section describes functions for moving across characters that have certain syntax classes. @defun skip-syntax-forward syntaxes &optional limit This function moves point forward across characters having syntax classes mentioned in @var{syntaxes}. It stops when it encounters the end of the buffer, or position @var{limit} (if specified), or a character it is not supposed to skip. If @var{syntaxes} starts with @samp{^}, then the function skips characters whose syntax is @emph{not} in @var{syntaxes}. The return value is the distance traveled, which is a nonnegative integer. @end defun @defun skip-syntax-backward syntaxes &optional limit This function moves point backward across characters whose syntax classes are mentioned in @var{syntaxes}. It stops when it encounters the beginning of the buffer, or position @var{limit} (if specified), or a character it is not supposed to skip. If @var{syntaxes} starts with @samp{^}, then the function skips characters whose syntax is @emph{not} in @var{syntaxes}. The return value indicates the distance traveled. It is an integer that is zero or less. @end defun @defun backward-prefix-chars This function moves point backward over any number of characters with expression prefix syntax. This includes both characters in the expression prefix syntax class, and characters with the @samp{p} flag. @end defun @node Parsing Expressions @section Parsing Balanced Expressions Here are several functions for parsing and scanning balanced expressions, also known as @dfn{sexps}, in which parentheses match in pairs. The syntax table controls the interpretation of characters, so these functions can be used for Lisp expressions when in Lisp mode and for C expressions when in C mode. @xref{List Motion}, for convenient higher-level functions for moving over balanced expressions. @defun parse-partial-sexp start limit &optional target-depth stop-before state stop-comment This function parses a sexp in the current buffer starting at @var{start}, not scanning past @var{limit}. It stops at position @var{limit} or when certain criteria described below are met, and sets point to the location where parsing stops. It returns a value describing the status of the parse at the point where it stops. If @var{state} is @code{nil}, @var{start} is assumed to be at the top level of parenthesis structure, such as the beginning of a function definition. Alternatively, you might wish to resume parsing in the middle of the structure. To do this, you must provide a @var{state} argument that describes the initial status of parsing. @cindex parenthesis depth If the third argument @var{target-depth} is non-@code{nil}, parsing stops if the depth in parentheses becomes equal to @var{target-depth}. The depth starts at 0, or at whatever is given in @var{state}. If the fourth argument @var{stop-before} is non-@code{nil}, parsing stops when it comes to any character that starts a sexp. If @var{stop-comment} is non-@code{nil}, parsing stops when it comes to the start of a comment. If @var{stop-comment} is the symbol @code{syntax-table}, parsing stops after the start of a comment or a string, or the end of a comment or a string, whichever comes first. @cindex parse state The fifth argument @var{state} is a nine-element list of the same form as the value of this function, described below. (It is OK to omit the last element of the nine.) The return value of one call may be used to initialize the state of the parse on another call to @code{parse-partial-sexp}. The result is a list of nine elements describing the final state of the parse: @enumerate 0 @item The depth in parentheses, counting from 0. @item @cindex innermost containing parentheses The character position of the start of the innermost parenthetical grouping containing the stopping point; @code{nil} if none. @item @cindex previous complete subexpression The character position of the start of the last complete subexpression terminated; @code{nil} if none. @item @cindex inside string Non-@code{nil} if inside a string. More precisely, this is the character that will terminate the string, or @code{t} if a generic string delimiter character should terminate it. @item @cindex inside comment @code{t} if inside a comment (of either style), or the comment nesting level if inside a kind of comment that can be nested. @item @cindex quote character @code{t} if point is just after a quote character. @item The minimum parenthesis depth encountered during this scan. @item What kind of comment is active: @code{nil} for a comment of style ``a'', @code{t} for a comment of style ``b'', and @code{syntax-table} for a comment that should be ended by a generic comment delimiter character. @item The string or comment start position. While inside a comment, this is the position where the comment began; while inside a string, this is the position where the string began. When outside of strings and comments, this element is @code{nil}. @end enumerate Elements 0, 3, 4, 5 and 7 are significant in the argument @var{state}. @cindex indenting with parentheses This function is most often used to compute indentation for languages that have nested parentheses. @end defun @defun scan-lists from count depth This function scans forward @var{count} balanced parenthetical groupings from position @var{from}. It returns the position where the scan stops. If @var{count} is negative, the scan moves backwards. If @var{depth} is nonzero, parenthesis depth counting begins from that value. The only candidates for stopping are places where the depth in parentheses becomes zero; @code{scan-lists} counts @var{count} such places and then stops. Thus, a positive value for @var{depth} means go out @var{depth} levels of parenthesis. Scanning ignores comments if @code{parse-sexp-ignore-comments} is non-@code{nil}. If the scan reaches the beginning or end of the buffer (or its accessible portion), and the depth is not zero, an error is signaled. If the depth is zero but the count is not used up, @code{nil} is returned. @end defun @defun scan-sexps from count This function scans forward @var{count} sexps from position @var{from}. It returns the position where the scan stops. If @var{count} is negative, the scan moves backwards. Scanning ignores comments if @code{parse-sexp-ignore-comments} is non-@code{nil}. If the scan reaches the beginning or end of (the accessible part of) the buffer while in the middle of a parenthetical grouping, an error is signaled. If it reaches the beginning or end between groupings but before count is used up, @code{nil} is returned. @end defun @defvar multibyte-syntax-as-symbol @tindex multibyte-syntax-as-symbol If this variable is non-@code{nil}, @code{scan-sexps} treats all non-@sc{ascii} characters as symbol constituents regardless of what the syntax table says about them. (However, text properties can still override the syntax.) @end defvar @defvar parse-sexp-ignore-comments @cindex skipping comments If the value is non-@code{nil}, then comments are treated as whitespace by the functions in this section and by @code{forward-sexp}. In older Emacs versions, this feature worked only when the comment terminator is something like @samp{*/}, and appears only to end a comment. In languages where newlines terminate comments, it was necessary make this variable @code{nil}, since not every newline is the end of a comment. This limitation no longer exists. @end defvar You can use @code{forward-comment} to move forward or backward over one comment or several comments. @defun forward-comment count This function moves point forward across @var{count} comments (backward, if @var{count} is negative). If it finds anything other than a comment or whitespace, it stops, leaving point at the place where it stopped. It also stops after satisfying @var{count}. @end defun To move forward over all comments and whitespace following point, use @code{(forward-comment (buffer-size))}. @code{(buffer-size)} is a good argument to use, because the number of comments in the buffer cannot exceed that many. @node Standard Syntax Tables @section Some Standard Syntax Tables Most of the major modes in Emacs have their own syntax tables. Here are several of them: @defun standard-syntax-table This function returns the standard syntax table, which is the syntax table used in Fundamental mode. @end defun @defvar text-mode-syntax-table The value of this variable is the syntax table used in Text mode. @end defvar @defvar c-mode-syntax-table The value of this variable is the syntax table for C-mode buffers. @end defvar @defvar emacs-lisp-mode-syntax-table The value of this variable is the syntax table used in Emacs Lisp mode by editing commands. (It has no effect on the Lisp @code{read} function.) @end defvar @node Syntax Table Internals @section Syntax Table Internals @cindex syntax table internals Lisp programs don't usually work with the elements directly; the Lisp-level syntax table functions usually work with syntax descriptors (@pxref{Syntax Descriptors}). Nonetheless, here we document the internal format. This format is used mostly when manipulating syntax properties. Each element of a syntax table is a cons cell of the form @code{(@var{syntax-code} . @var{matching-char})}. The @sc{car}, @var{syntax-code}, is an integer that encodes the syntax class, and any flags. The @sc{cdr}, @var{matching-char}, is non-@code{nil} if a character to match was specified. This table gives the value of @var{syntax-code} which corresponds to each syntactic type. @multitable @columnfractions .05 .3 .3 .3 @item @tab @i{Integer} @i{Class} @tab @i{Integer} @i{Class} @tab @i{Integer} @i{Class} @item @tab 0 @ @ whitespace @tab 5 @ @ close parenthesis @tab 10 @ @ character quote @item @tab 1 @ @ punctuation @tab 6 @ @ expression prefix @tab 11 @ @ comment-start @item @tab 2 @ @ word @tab 7 @ @ string quote @tab 12 @ @ comment-end @item @tab 3 @ @ symbol @tab 8 @ @ paired delimiter @tab 13 @ @ inherit @item @tab 4 @ @ open parenthesis @tab 9 @ @ escape @tab 14 @ @ comment-fence @item @tab 15 @ string-fence @end multitable For example, the usual syntax value for @samp{(} is @code{(4 . 41)}. (41 is the character code for @samp{)}.) The flags are encoded in higher order bits, starting 16 bits from the least significant bit. This table gives the power of two which corresponds to each syntax flag. @multitable @columnfractions .05 .3 .3 .3 @item @tab @i{Prefix} @i{Flag} @tab @i{Prefix} @i{Flag} @tab @i{Prefix} @i{Flag} @item @tab @samp{1} @ @ @code{(lsh 1 16)} @tab @samp{4} @ @ @code{(lsh 1 19)} @tab @samp{b} @ @ @code{(lsh 1 21)} @item @tab @samp{2} @ @ @code{(lsh 1 17)} @tab @samp{p} @ @ @code{(lsh 1 20)} @tab @samp{n} @ @ @code{(lsh 1 22)} @item @tab @samp{3} @ @ @code{(lsh 1 18)} @end multitable @defun string-to-syntax @var{desc} This function returns the internal form @code{(@var{syntax-code} . @var{matching-char})} corresponding to the syntax descriptor @var{desc}. @end defun @node Categories @section Categories @cindex categories of characters @dfn{Categories} provide an alternate way of classifying characters syntactically. You can define several categories as needed, then independently assign each character to one or more categories. Unlike syntax classes, categories are not mutually exclusive; it is normal for one character to belong to several categories. Each buffer has a @dfn{category table} which records which categories are defined and also which characters belong to each category. Each category table defines its own categories, but normally these are initialized by copying from the standard categories table, so that the standard categories are available in all modes. Each category has a name, which is an @sc{ascii} printing character in the range @w{@samp{ }} to @samp{~}. You specify the name of a category when you define it with @code{define-category}. The category table is actually a char-table (@pxref{Char-Tables}). The element of the category table at index @var{c} is a @dfn{category set}---a bool-vector---that indicates which categories character @var{c} belongs to. In this category set, if the element at index @var{cat} is @code{t}, that means category @var{cat} is a member of the set, and that character @var{c} belongs to category @var{cat}. @defun define-category char docstring &optional table This function defines a new category, with name @var{char} and documentation @var{docstring}. The new category is defined for category table @var{table}, which defaults to the current buffer's category table. @end defun @defun category-docstring category &optional table This function returns the documentation string of category @var{category} in category table @var{table}. @example (category-docstring ?a) @result{} "ASCII" (category-docstring ?l) @result{} "Latin" @end example @end defun @defun get-unused-category table This function returns a category name (a character) which is not currently defined in @var{table}. If all possible categories are in use in @var{table}, it returns @code{nil}. @end defun @defun category-table This function returns the current buffer's category table. @end defun @defun category-table-p object This function returns @code{t} if @var{object} is a category table, otherwise @code{nil}. @end defun @defun standard-category-table This function returns the standard category table. @end defun @defun copy-category-table &optional table This function constructs a copy of @var{table} and returns it. If @var{table} is not supplied (or is @code{nil}), it returns a copy of the current category table. Otherwise, an error is signaled if @var{table} is not a category table. @end defun @defun set-category-table table This function makes @var{table} the category table for the current buffer. It returns @var{table}. @end defun @defun make-category-table @tindex make-category-table This creates and returns an empty category table. In an empty category table, no categories have been allocated, and no characters belong to any categories. @end defun @defun make-category-set categories This function returns a new category set---a bool-vector---whose initial contents are the categories listed in the string @var{categories}. The elements of @var{categories} should be category names; the new category set has @code{t} for each of those categories, and @code{nil} for all other categories. @example (make-category-set "al") @result{} #&128"\0\0\0\0\0\0\0\0\0\0\0\0\2\20\0\0" @end example @end defun @defun char-category-set char This function returns the category set for character @var{char}. This is the bool-vector which records which categories the character @var{char} belongs to. The function @code{char-category-set} does not allocate storage, because it returns the same bool-vector that exists in the category table. @example (char-category-set ?a) @result{} #&128"\0\0\0\0\0\0\0\0\0\0\0\0\2\20\0\0" @end example @end defun @defun category-set-mnemonics category-set This function converts the category set @var{category-set} into a string containing the characters that designate the categories that are members of the set. @example (category-set-mnemonics (char-category-set ?a)) @result{} "al" @end example @end defun @defun modify-category-entry character category &optional table reset This function modifies the category set of @var{character} in category table @var{table} (which defaults to the current buffer's category table). Normally, it modifies the category set by adding @var{category} to it. But if @var{reset} is non-@code{nil}, then it deletes @var{category} instead. @end defun @deffn Command describe-categories This function describes the category specifications in the current category table. The descriptions are inserted in a buffer, which is then displayed. @end deffn