1 |
EBNF (Extended Backus Normal Form) description of the format of the tags |
-*- indented-text -*- |
2 |
file created by etags.c and interpreted by etags.el |
|
3 |
|
This file contains two sections: |
4 |
|
|
5 |
|
1) An EBNF (Extended Backus Normal Form) description of the format of |
6 |
|
the tags file created by etags.c and interpreted by etags.el; |
7 |
|
2) A discussion of tag names and implicit tag names. |
8 |
|
|
9 |
|
====================== 1) EBNF tag file description ===================== |
10 |
|
|
11 |
|
Productions created from current behaviour to aid extensions |
12 |
Francesco Potorti` <pot@gnu.org> 2002 |
Francesco Potorti` <pot@gnu.org> 2002 |
13 |
================================================================ |
---------------- |
14 |
|
|
15 |
FF ::= #x0c /* form feed */ |
FF ::= #x0c /* tag section starter */ |
16 |
|
|
17 |
LF ::= #x0a /* line feed */ |
LF ::= #x0a /* line terminator */ |
18 |
|
|
19 |
DEL ::= #x7f /* pattern terminator */ |
DEL ::= #x7f /* pattern terminator */ |
20 |
|
|
38 |
|
|
39 |
filename ::= regchar regstring /* a file name */ |
filename ::= regchar regstring /* a file name */ |
40 |
|
|
41 |
fileprop ::= DEL "(" regstring ")" |
fileprop ::= "(" regstring ")" /* an elisp alist */ |
42 |
|
|
43 |
tag ::= directtag | patterntag |
tag ::= directtag | patterntag |
44 |
|
|
45 |
directtag ::= DEL realposition |
directtag ::= DEL realposition /* no pattern */ |
46 |
|
|
47 |
patterntag ::= pattern DEL [ tagname SOH ] position |
patterntag ::= pattern DEL [ tagname SOH ] position |
48 |
|
|
50 |
|
|
51 |
tagname ::= regchar regstring /* a tag name */ |
tagname ::= regchar regstring /* a tag name */ |
52 |
|
|
53 |
position ::= realposition | "," |
position ::= realposition | "," /* charpos,linepos */ |
54 |
|
|
55 |
realposition ::= "," unsint | unsint "," | unsint "," unsint |
realposition ::= "," unsint | unsint "," | unsint "," unsint |
56 |
|
|
57 |
|
==================== end of EBNF tag file description ==================== |
58 |
|
|
59 |
|
|
60 |
|
|
61 |
|
======================= 2) discussion of tag names ======================= |
62 |
|
|
63 |
|
- WHAT ARE TAG NAMES |
64 |
|
Tag lines in a tags file are usually made from the above defined pattern |
65 |
|
and by an optional tag name. The pattern is a string that is searched |
66 |
|
in the source file to find the tagged line. |
67 |
|
|
68 |
|
- WHY TAG NAMES ARE GOOD |
69 |
|
When a user looks for a tag, Emacs first compares the tag with the tag |
70 |
|
names contained in the tags file. If no match is found, Emacs compares |
71 |
|
the tag with the patterns. The tag name is then the preferred way to |
72 |
|
look for tags in the tags file, because when the tag name is present |
73 |
|
Emacs can find a tag faster and more accurately. These tag names are |
74 |
|
part of tag lines in the tags file, so we call them "explicit". |
75 |
|
|
76 |
|
- WHY IMPLICIT TAG NAMES ARE EVEN BETTER |
77 |
|
When a tag line has no name, but a name can be deduced from the pattern, |
78 |
|
we say that the tag line has an implicit tag name. Often tag names are |
79 |
|
redundant; this happens when the name of a tag is an easily guessable |
80 |
|
substring of the tag pattern. We define a set of rules to decide |
81 |
|
whether it is possible to deduce the tag name from the pattern, and make |
82 |
|
an unnamed tag in those cases. The name deduced from the pattern of an |
83 |
|
unnamed tag is the implicit name of that tag. |
84 |
|
When the user looks for a tag, and Emacs founds no explicit tag names |
85 |
|
that match it, Emacs then looks for an tag whose implicit tag name |
86 |
|
matches the request. etags.c uses implicit tag names when possible, in |
87 |
|
order to reduce the size of the tags file. |
88 |
|
An implicit tag name is deduced from the pattern by discarding the |
89 |
|
last character if it is one of ` \f\t\n\r()=,;', then taking all the |
90 |
|
rightmost consecutive characters in the pattern which are not one of |
91 |
|
those. |
92 |
|
|
93 |
|
===================== end of discussion of tag names ===================== |