Next: Conditional Construct Symbols, Previous: Function Symbols, Up: Syntactic Symbols [Contents][Index]
Here’s an example which illustrates some C++ class syntactic symbols:
1: class Bass 2: : public Guitar, 3: public Amplifiable 4: { 5: public: 6: Bass() 7: : eString( new BassString( 0.105 )), 8: aString( new BassString( 0.085 )), 9: dString( new BassString( 0.065 )), 10: gString( new BassString( 0.045 )) 11: { 12: eString.tune( 'E' ); 13: aString.tune( 'A' ); 14: dString.tune( 'D' ); 15: gString.tune( 'G' ); 16: } 17: friend class Luthier; 18: };
As in the previous example, line 1 has the topmost-intro
syntax.
Here however, the brace that opens a C++ class definition on line 4 is
assigned the class-open
syntax. Note that in C++, classes,
structs, and unions are essentially equivalent syntactically (and are
very similar semantically), so replacing the class
keyword in the
example above with struct
or union
would still result in a
syntax of class-open
for line 4 37.
Similarly, line 18 is assigned class-close
syntax.
Note that class-open
and class-close
syntactic elements
have two anchor points. The first is the position of the beginning of
the statement, the second is the position of the keyword which defines
the construct (e.g. class
). These are usually the same
position, but differ when the statement starts off with
template
(C++ Mode) or generic
(Java Mode) or similar.
Line 2 introduces the inheritance list for the class so it is assigned
the inher-intro
syntax, and line 3, which continues the
inheritance list is given inher-cont
syntax.
Hitting C-c C-s on line 5 shows the following analysis:
((inclass 58) (access-label 58))
The primary syntactic symbol for this line is access-label
as
this is a label keyword that specifies access protection in C++. However,
because this line is also a top-level construct inside a class
definition, the analysis actually shows two syntactic symbols. The
other syntactic symbol assigned to this line is inclass
.
Similarly, line 6 is given both inclass
and topmost-intro
syntax:
((inclass 58) (topmost-intro 60))
Line 7 introduces a C++ member initialization list and as such is given
member-init-intro
syntax. Note that in this case it is
not assigned inclass
since this is not considered a
top-level construct. Lines 8 through 10 are all assigned
member-init-cont
since they continue the member initialization
list started on line 7.
Line 11’s analysis is a bit more complicated:
((inclass 58) (inline-open))
This line is assigned a syntax of both inline-open
and
inclass
because it opens an in-class C++ inline method
definition. This is distinct from, but related to, the C++ notion of an
inline function in that its definition occurs inside an enclosing class
definition, which in C++ implies that the function should be inlined.
However, if the definition of the Bass
constructor appeared
outside the class definition, the construct would be given the
defun-open
syntax, even if the keyword inline
appeared
before the method name, as in:
1: class Bass 2: : public Guitar, 3: public Amplifiable 4: { 5: public: 6: Bass(); 7: }; 8: 9: inline 10: Bass::Bass() 11: : eString( new BassString( 0.105 )), 12: aString( new BassString( 0.085 )), 13: dString( new BassString( 0.065 )), 14: gString( new BassString( 0.045 )) 15: { 16: eString.tune( 'E' ); 17: aString.tune( 'A' ); 18: dString.tune( 'D' ); 19: gString.tune( 'G' ); 20: }
Returning to the previous example, line 16 is given inline-close
syntax, while line 12 is given defun-block-open
syntax, and lines
13 through 15 are all given statement
syntax. Line 17 is
interesting in that its syntactic analysis list contains three
elements:
((inclass 58) (topmost-intro 380) (friend))
The friend
and inline-open
syntactic symbols are
modifiers that do not have anchor positions.
Template definitions introduce yet another syntactic symbol:
1: ThingManager <int, 2: Framework::Callback *, 3: Mutex> framework_callbacks;
Here, line 1 is analyzed as a topmost-intro
, but lines 2 and 3
are both analyzed as template-args-cont
lines.
This is the case even
for C and Objective-C. For consistency, structs in all supported
languages are syntactically equivalent to classes. Note however that
the keyword class
is meaningless in C and Objective-C.
Next: Conditional Construct Symbols, Previous: Function Symbols, Up: Syntactic Symbols [Contents][Index]