mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-11-25 07:28:20 +00:00
608 lines
20 KiB
Plaintext
608 lines
20 KiB
Plaintext
\input texinfo
|
|
@setfilename ../../info/semantic.info
|
|
@set TITLE Semantic Manual
|
|
@set AUTHOR Eric M. Ludlam, David Ponce, and Richard Y. Kim
|
|
@settitle @value{TITLE}
|
|
@include docstyle.texi
|
|
|
|
@c *************************************************************************
|
|
@c @ Header
|
|
@c *************************************************************************
|
|
|
|
@c Merge all indexes into a single index for now.
|
|
@c We can always separate them later into two or more as needed.
|
|
@syncodeindex vr cp
|
|
@syncodeindex fn cp
|
|
@syncodeindex ky cp
|
|
@syncodeindex pg cp
|
|
@syncodeindex tp cp
|
|
|
|
@c @footnotestyle separate
|
|
@c @paragraphindent 2
|
|
@c @@smallbook
|
|
@c %**end of header
|
|
|
|
@copying
|
|
This manual documents the Semantic library and utilities.
|
|
|
|
Copyright @copyright{} 1999--2024 Free Software Foundation, Inc.
|
|
|
|
@quotation
|
|
Permission is granted to copy, distribute and/or modify this document
|
|
under the terms of the GNU Free Documentation License, Version 1.3 or
|
|
any later version published by the Free Software Foundation; with no
|
|
Invariant Sections, with the Front-Cover Texts being ``A GNU Manual,''
|
|
and with the Back-Cover Texts as in (a) below. A copy of the license
|
|
is included in the section entitled ``GNU Free Documentation License.''
|
|
|
|
(a) The FSF's Back-Cover Text is: ``You have the freedom to copy and
|
|
modify this GNU manual.''
|
|
@end quotation
|
|
@end copying
|
|
|
|
@dircategory Emacs misc features
|
|
@direntry
|
|
* Semantic: (semantic). Source code parser library and utilities.
|
|
@end direntry
|
|
|
|
@titlepage
|
|
@center @titlefont{Semantic}
|
|
@sp 4
|
|
@center by @value{AUTHOR}
|
|
@page
|
|
@vskip 0pt plus 1filll
|
|
@insertcopying
|
|
@end titlepage
|
|
@page
|
|
|
|
@macro semantic{}
|
|
@i{Semantic}
|
|
@end macro
|
|
|
|
@macro keyword{kw}
|
|
@anchor{\kw\}
|
|
@b{\kw\}
|
|
@end macro
|
|
|
|
@c *************************************************************************
|
|
@c @ Document
|
|
@c *************************************************************************
|
|
@contents
|
|
|
|
@node top
|
|
@top @value{TITLE}
|
|
|
|
@semantic{} is a suite of Emacs libraries and utilities for parsing
|
|
source code. At its core is a lexical analyzer and two parser
|
|
generators (@code{bovinator} and @code{wisent}) written in Emacs Lisp.
|
|
@semantic{} provides a variety of tools for making use of the parser
|
|
output, including user commands for code navigation and completion, as
|
|
well as enhancements for imenu, speedbar, whichfunc, eldoc,
|
|
hippie-expand, and several other parts of Emacs.
|
|
|
|
To send bug reports, or participate in discussions about semantic,
|
|
use the mailing list cedet-semantic@@sourceforge.net via the URL:
|
|
@url{https://lists.sourceforge.net/lists/listinfo/cedet-semantic}
|
|
|
|
@ifnottex
|
|
@insertcopying
|
|
@end ifnottex
|
|
|
|
@menu
|
|
* Introduction::
|
|
* Using Semantic::
|
|
* Semantic Internals::
|
|
* Glossary::
|
|
* GNU Free Documentation License::
|
|
* Index::
|
|
@end menu
|
|
|
|
@node Introduction
|
|
@chapter Introduction
|
|
|
|
This chapter gives an overview of @semantic{} and its goals.
|
|
|
|
Ordinarily, Emacs uses regular expressions (and syntax tables) to
|
|
analyze source code for purposes such as syntax highlighting. This
|
|
approach, though simple and efficient, has its limitations: roughly
|
|
speaking, it only ``guesses'' the meaning of each piece of source code
|
|
in the context of the programming language, instead of rigorously
|
|
``understanding'' it.
|
|
|
|
@semantic{} provides a new infrastructure to analyze source code using
|
|
@dfn{parsers} instead of regular expressions. It contains two
|
|
built-in parser generators (an @acronym{LL} generator named
|
|
@code{Bovine} and an @acronym{LALR} generator named @code{Wisent},
|
|
both written in Emacs Lisp), and parsers for several common
|
|
programming languages. It can also make use of @dfn{external
|
|
parsers}---programs such as GNU Global and GNU IDUtils.
|
|
|
|
@semantic{} provides a uniform, language-independent @acronym{API} for
|
|
accessing the parser output. This output can be used by other Emacs
|
|
Lisp programs to implement ``syntax-aware'' behavior. @semantic{}
|
|
itself includes several such utilities, including user-level Emacs
|
|
commands for navigating, searching, and completing source code.
|
|
|
|
The following diagram illustrates the structure of the @semantic{}
|
|
package:
|
|
|
|
@table @strong
|
|
@item Please Note:
|
|
The words in all-capital are those that @semantic{} itself provides.
|
|
Others are current or future languages or applications that are not
|
|
distributed along with @semantic{}.
|
|
@end table
|
|
|
|
@example
|
|
Applications
|
|
and
|
|
Utilities
|
|
-------
|
|
/ \
|
|
+---------------+ +--------+ +--------+
|
|
C --->| C PARSER |--->| | | |
|
|
+---------------+ | | | |
|
|
+---------------+ | COMMON | | COMMON |<--- SPEEDBAR
|
|
Java --->| JAVA PARSER |--->| PARSE | | |
|
|
+---------------+ | TREE | | PARSE |<--- SEMANTICDB
|
|
+---------------+ | FORMAT | | API |
|
|
Scheme --->| SCHEME PARSER |--->| | | |<--- ecb
|
|
+---------------+ | | | |
|
|
+---------------+ | | | |
|
|
Texinfo --->| TEXI. PARSER |--->| | | |
|
|
+---------------+ | | | |
|
|
|
|
... ... ... ...
|
|
|
|
+---------------+ | | | |
|
|
Lang. Y --->| Y Parser |--->| | | |<--- app. ?
|
|
+---------------+ | | | |
|
|
+---------------+ | | | |<--- app. ?
|
|
Lang. Z --->| Z Parser |--->| | | |
|
|
+---------------+ +--------+ +--------+
|
|
@end example
|
|
|
|
@menu
|
|
* Semantic Components::
|
|
@end menu
|
|
|
|
@node Semantic Components
|
|
@section Semantic Components
|
|
|
|
In this section, we provide a more detailed description of the major
|
|
components of @semantic{}, and how they interact with one another.
|
|
|
|
The first step in parsing a source code file is to break it up into
|
|
its fundamental components. This step is called lexical analysis:
|
|
|
|
@example
|
|
syntax table, keywords list, and options
|
|
|
|
|
|
|
|
v
|
|
input file ----> Lexer ----> token stream
|
|
@end example
|
|
|
|
@noindent
|
|
The output of the lexical analyzer is a list of tokens that make up
|
|
the file. The next step is the actual parsing, shown below:
|
|
|
|
@example
|
|
parser tables
|
|
|
|
|
v
|
|
token stream ---> Parser ----> parse tree
|
|
@end example
|
|
|
|
@noindent
|
|
The end result, the parse tree, is @semantic{}'s internal
|
|
representation of the language grammar. @semantic{} provides an
|
|
@acronym{API} for Emacs Lisp programs to access the parse tree.
|
|
|
|
Parsing large files can take several seconds or more. By default,
|
|
@semantic{} automatically caches parse trees by saving them in your
|
|
@file{.emacs.d} directory. When you revisit a previously-parsed file,
|
|
the parse tree is automatically reloaded from this cache, to save
|
|
time. @xref{SemanticDB}.
|
|
|
|
@node Using Semantic
|
|
@chapter Using Semantic
|
|
|
|
@include sem-user.texi
|
|
|
|
@node Semantic Internals
|
|
@chapter Semantic Internals
|
|
|
|
This chapter provides an overview of the internals of @semantic{}.
|
|
This information is usually not needed by application developers or
|
|
grammar developers; it is useful mostly for the hackers who would like
|
|
to learn more about how @semantic{} works.
|
|
|
|
@menu
|
|
* Parser code:: Code used for the parsers
|
|
* Tag handling:: Code used for manipulating tags
|
|
* Semanticdb Internals:: Code used in the semantic database
|
|
* Analyzer Internals:: Code used in the code analyzer
|
|
* Tools:: Code used in user tools
|
|
@ignore
|
|
* Tests:: Code used for testing
|
|
@end ignore
|
|
@end menu
|
|
|
|
@node Parser code
|
|
@section Parser code
|
|
|
|
@semantic{} parsing code is spread across a range of files.
|
|
|
|
@table @file
|
|
@item semantic.el
|
|
The core infrastructure sets up buffers for parsing, and has all the
|
|
core parsing routines. Most parsing routines are overloadable, so the
|
|
actual implementation may be somewhere else.
|
|
|
|
@item semantic/edit.el
|
|
Incremental reparse based on user edits.
|
|
|
|
@item semantic/grammar.el
|
|
@itemx semantic-grammar.wy
|
|
Parser for the different grammar languages, and a major mode for
|
|
editing grammars in Emacs.
|
|
|
|
@item semantic/lex.el
|
|
Infrastructure for implementing lexical analyzers. Provides macros
|
|
for creating individual analyzers for specific features, and a way to
|
|
combine them together.
|
|
|
|
@item semantic/lex-spp.el
|
|
Infrastructure for a lexical symbolic preprocessor. This was written
|
|
to implement the C preprocessor, but could be used for other lexical
|
|
preprocessors.
|
|
|
|
@item semantic/grammar.el
|
|
@itemx semantic/bovine/grammar.el
|
|
The ``bovine'' grammar. This is the first grammar mode written for
|
|
@semantic{} and is useful for creating simple parsers.
|
|
|
|
@item semantic/wisent.el
|
|
@itemx semantic/wisent/wisent.el
|
|
@itemx semantic/wisent/grammar.el
|
|
A port of bison to Emacs. This infrastructure lets you create LALR
|
|
based parsers for @semantic{}.
|
|
|
|
@item semantic/debug.el
|
|
Infrastructure for debugging grammars.
|
|
|
|
@item semantic/util.el
|
|
Various utilities for manipulating tags, such as describing the tag
|
|
under point, adding labels, and the all important
|
|
@code{semantic-something-to-tag-table}.
|
|
|
|
@end table
|
|
|
|
@node Tag handling
|
|
@section Tag handling
|
|
|
|
A tag represents an individual item found in a buffer, such as a
|
|
function or variable. Tag handling is handled in several source
|
|
files.
|
|
|
|
@table @file
|
|
@item semantic/tag.el
|
|
Basic tag creation, queries, cloning, binding, and unbinding.
|
|
|
|
@item semantic/tag-write.el
|
|
Write a tag or tag list to a stream. These routines are used by
|
|
@file{semanticdb-file.el} when saving a list of tags.
|
|
|
|
@item semantic/tag-file.el
|
|
Files associated with tags. Goto-tag, file for include, and file for
|
|
a prototype.
|
|
|
|
@item semantic/tag-ls.el
|
|
Language dependent features of a tag, such as parent calculation, slot
|
|
protection, and other states like abstract, virtual, static, and leaf.
|
|
|
|
@item semantic/dep.el
|
|
Include file handling. Contains the include path concepts, and
|
|
routines for looking up file names in the include path.
|
|
|
|
@item semantic/format.el
|
|
Convert a tag into a nicely formatted and colored string. Use
|
|
@code{semantic-test-all-format-tag-functions} to test different output
|
|
options.
|
|
|
|
@item semantic/find.el
|
|
Find tags matching different conditions in a tag table.
|
|
These routines are used by @file{semanticdb-find.el} once the database
|
|
has been converted into a simpler tag table.
|
|
|
|
@item semantic/sort.el
|
|
Sorting lists of tags in different ways. Includes sorting a plain
|
|
list of tags forward or backward. Includes binning tags based on
|
|
attributes (bucketize), and tag adoption for multiple references to
|
|
the same thing.
|
|
|
|
@item semantic/doc.el
|
|
Capture documentation comments from near a tag.
|
|
|
|
@end table
|
|
|
|
@node Semanticdb Internals
|
|
@section Semanticdb Internals
|
|
|
|
@acronym{Semanticdb} complexity is certainly an issue. It is a rather
|
|
hairy problem to try and solve.
|
|
|
|
@table @file
|
|
@item semantic/db.el
|
|
Defines a @dfn{database} and a @dfn{table} base class. You can
|
|
instantiate these classes, and use them, but they are not persistent.
|
|
|
|
This file also provides support for @code{semanticdb-minor-mode},
|
|
which automatically associates files with tables in databases so that
|
|
tags are @emph{saved} while a buffer is not in memory.
|
|
|
|
The database and tables both also provide applicable cache information,
|
|
and cache flushing system. The semanticdb search routines use caches
|
|
to save data structures that are complex to calculate.
|
|
|
|
Lastly, it provides the concept of @dfn{project root}. It is a system
|
|
by which a file can be associated with the root of a project, so if
|
|
you have a tree of directories and source files, it can find the root,
|
|
and allow a tag-search to span all available databases in that
|
|
directory hierarchy.
|
|
|
|
@item semantic/db-file.el
|
|
Provides a subclass of the basic table so that it can be saved to
|
|
disk. Implements all the code needed to unbind/rebind tags to a
|
|
buffer and writing them to a file.
|
|
|
|
@item semantic/db-el.el
|
|
Implements a special kind of @dfn{system} database that uses Emacs
|
|
internals to perform queries.
|
|
|
|
@item semantic/db-ebrowse.el
|
|
Implements a system database that uses Ebrowse to parse files into a
|
|
table that can be queried for tag names. Successful tag hits during a
|
|
find causes @semantic{} to pick up and parse the reference files to
|
|
get the full details.
|
|
|
|
@item semantic/db-find.el
|
|
Infrastructure for searching groups @semantic{} databases, and dealing
|
|
with the search results format.
|
|
|
|
@item semantic/db-ref.el
|
|
Tracks cross-references. Cross-references are needed when buffer is
|
|
reparsed, and must alert other tables that any dependent caches may
|
|
need to be flushed. References are in the form of include files.
|
|
|
|
@end table
|
|
|
|
@node Analyzer Internals
|
|
@section Analyzer Internals
|
|
|
|
The @semantic{} analyzer is a complex engine which has been broken
|
|
down across several modules. When the @semantic{} analyzer fails,
|
|
start with @code{semantic-analyze-debug-assist}, then dive into some
|
|
of these files.
|
|
|
|
@table @file
|
|
@item semantic/analyze.el
|
|
The core analyzer for defining the @dfn{current context}. The
|
|
current context is an object that contains references to aspects of
|
|
the local context including the current prefix, and a tag list
|
|
defining what the prefix means.
|
|
|
|
@item semantic/analyze/complete.el
|
|
Provides @code{semantic-analyze-possible-completions}.
|
|
|
|
@item semantic/analyze/debug.el
|
|
The analyzer debugger. Useful when attempting to get everything
|
|
configured.
|
|
|
|
@item semantic/analyze/fcn.el
|
|
Various support functions needed by the analyzer.
|
|
|
|
@item semantic/ctxt.el
|
|
Local context parser. Contains overloadable functions used to move
|
|
around through different scopes, get local variables, and collect the
|
|
current prefix used when doing completion.
|
|
|
|
@item semantic/scope.el
|
|
Calculate @dfn{scope} for a location in a buffer. The scope includes
|
|
local variables, and tag lists in scope for various reasons, such as
|
|
C++ using statements.
|
|
|
|
@item semantic/db-typecache.el
|
|
The typecache is part of @code{semanticdb}, but is used primarily by
|
|
the analyzer to look up datatypes and complex names. The typecache is
|
|
bound across source files and builds a master lookup table for data
|
|
type names.
|
|
|
|
@item semantic/ia.el
|
|
Interactive Analyzer functions. Simple routines that do completion or
|
|
lookups based on the results from the Analyzer. These routines are
|
|
meant as examples for application writers, but are quite useful as
|
|
they are.
|
|
|
|
@item semantic/ia-sb.el
|
|
Speedbar support for the analyzer, displaying context info, and
|
|
completion lists.
|
|
|
|
@end table
|
|
|
|
@node Tools
|
|
@section Tools
|
|
|
|
These files contain various tools for users.
|
|
|
|
@table @file
|
|
@item semantic/idle.el
|
|
Idle scheduler for @semantic{}. Manages reparsing buffers after
|
|
edits, and large work tasks in idle time. Includes modes for showing
|
|
summary help and pop-up completion.
|
|
|
|
@item semantic/senator.el
|
|
The @semantic{} navigator. Provides many ways to move through a
|
|
buffer based on the active tag table.
|
|
|
|
@item semantic/decorate.el
|
|
A minor mode for decorating tags based on details from the parser.
|
|
Includes overlines for functions, or coloring class fields based on
|
|
protection.
|
|
|
|
@item semantic/decorate/include.el
|
|
A decoration mode for include files, which assists users in setting up
|
|
parsing for their includes.
|
|
|
|
@item semantic/complete.el
|
|
Advanced completion prompts for reading tag names in the minibuffer, or
|
|
inline in a buffer.
|
|
|
|
@item semantic/imenu.el
|
|
Imenu support for using @semantic{} tags in imenu.
|
|
|
|
@item semantic/mru-bookmark.el
|
|
Automatic bookmarking based on tags. Jump to locations you've been
|
|
before based on tag name.
|
|
|
|
@item semantic/sb.el
|
|
Support for @semantic{} tag usage in Speedbar.
|
|
|
|
@item semantic/util-modes.el
|
|
A bunch of small minor-modes that exposes aspects of the semantic
|
|
parser state. Includes @code{semantic-stickyfunc-mode}.
|
|
|
|
@item semantic/chart.el
|
|
Draw some charts from stats generated from parsing.
|
|
|
|
@end table
|
|
|
|
@c These files seem to not have been imported from CEDET.
|
|
@ignore
|
|
@node Tests
|
|
@section Tests
|
|
|
|
@table @file
|
|
|
|
@item semantic-utest.el
|
|
Basic testing of parsing and incremental parsing for most supported
|
|
languages.
|
|
|
|
@item semantic-ia-utest.el
|
|
Test the semantic analyzer's ability to provide smart completions.
|
|
|
|
@item semantic-utest-c.el
|
|
Tests for the C parser's lexical pre-processor.
|
|
|
|
@item semantic-regtest.el
|
|
Regression tests from the older Semantic 1.x API.
|
|
|
|
@end table
|
|
@end ignore
|
|
|
|
@node Glossary
|
|
@appendix Glossary
|
|
|
|
@table @asis
|
|
@item BNF
|
|
In semantic 1.4, a BNF file represented ``Bovine Normal Form'', the
|
|
grammar file used for the 1.4 parser generator. This was a play on
|
|
Backus-Naur Form which proved too confusing.
|
|
|
|
@item bovinate
|
|
A verb representing what happens when a bovine parser parses a file.
|
|
|
|
@item bovine lambda
|
|
In a bovine, or LL parser, the bovine lambda is a function to execute
|
|
when a specific set of match rules has succeeded in matching text from
|
|
the buffer.
|
|
|
|
@item bovine parser
|
|
A parser using the bovine parser generator. It is an LL parser
|
|
suitable for small simple languages.
|
|
|
|
@item context
|
|
|
|
@item LALR
|
|
|
|
@item lexer
|
|
A program which converts text into a stream of tokens by analyzing
|
|
them lexically. Lexers will commonly create strings, symbols,
|
|
keywords and punctuation, and strip whitespaces and comments.
|
|
|
|
@item LL
|
|
|
|
@item nonterminal
|
|
A nonterminal symbol or simply a nonterminal stands for a class of
|
|
syntactically equivalent groupings. A nonterminal symbol name is used
|
|
in writing grammar rules.
|
|
|
|
@item overloadable
|
|
Some functions are defined via @code{define-overload}.
|
|
These can be overloaded via ....
|
|
|
|
@item parser
|
|
A program that converts @b{tokens} to @b{tags}.
|
|
|
|
@item tag
|
|
A tag is a representation of some entity in a language file, such as a
|
|
function, variable, or include statement. In semantic, the word tag is
|
|
used the same way it is used for the etags or ctags tools.
|
|
|
|
A tag is usually bound to a buffer region via overlay, or it just
|
|
specifies character locations in a file.
|
|
|
|
@item token
|
|
A single atomic item returned from a lexer. It represents some set
|
|
of characters found in a buffer.
|
|
|
|
@item token stream
|
|
The output of the lexer as well as the input to the parser.
|
|
|
|
@item wisent parser
|
|
A parser using the wisent parser generator. It is a port of bison to
|
|
Emacs Lisp. It is an LALR parser suitable for complex languages.
|
|
@end table
|
|
|
|
|
|
@node GNU Free Documentation License
|
|
@appendix GNU Free Documentation License
|
|
@include doclicense.texi
|
|
|
|
@node Index
|
|
@unnumbered Index
|
|
@printindex cp
|
|
|
|
@iftex
|
|
@contents
|
|
@summarycontents
|
|
@end iftex
|
|
|
|
@bye
|
|
|
|
@c Following comments are for the benefit of ispell.
|
|
|
|
@c LocalWords: alist API APIs arg argc args argv asis assoc autoload Wisent
|
|
@c LocalWords: bnf bovinate bovinates LALR
|
|
@c LocalWords: bovinating bovination bovinator bucketize
|
|
@c LocalWords: cb cdr charquote checkcache cindex CLOS
|
|
@c LocalWords: concat concocting const ctxt Decl defcustom
|
|
@c LocalWords: deffn deffnx defun defvar destructor's dfn diff dir
|
|
@c LocalWords: doc docstring EDE EIEIO elisp emacsman emph enum
|
|
@c LocalWords: eq Exp EXPANDFULL expression fn foo func funcall
|
|
@c LocalWords: ia ids ifinfo imenu imenus init int isearch itemx java kbd
|
|
@c LocalWords: keymap keywordtable lang languagemode lexer lexing Ludlam
|
|
@c LocalWords: menubar metaparent metaparents min minibuffer Misc mode's
|
|
@c LocalWords: multitable NAvigaTOR noindent nomedian nonterm noselect
|
|
@c LocalWords: nosnarf obarray OLE OO outputfile paren parsetable POINT's
|
|
@c LocalWords: popup positionalonly positiononly positionormarker pre
|
|
@c LocalWords: printf printindex Programmatically pt quotemode
|
|
@c LocalWords: ref regex regexp Regexps reparse resetfile samp sb
|
|
@c LocalWords: scopestart SEmantic semanticdb setfilename setq
|
|
@c LocalWords: settitle setupfunction sexp sp SPC speedbar speedbar's
|
|
@c LocalWords: streamorbuffer struct subalist submenu submenus
|
|
@c LocalWords: subsubsection sw sym texi texinfo titlefont titlepage
|
|
@c LocalWords: tok TOKEN's toplevel typemodifiers uml unset untar
|
|
@c LocalWords: uref usedb var vskip xref yak
|