1 rizwank 1.1 /**
2 * Name: cpp
3 * Description: C++ programming language.
4 * Author: Markku Rossi <mtr@iki.fi>
5 */
6
7 cpp_type_re =
8 /* Types.
9 (build-re '(auto bool char class complex const double enum extern
10 float friend inline int long private protected public register
11 short signed static struct template typedef union unsigned virtual
12 void volatile))
13 */
14 /\b(auto|bool|c(har|lass|o(mplex|nst))|double|e(num|xtern)|f(loat|riend)\
15 |in(line|t)|long|p(r(ivate|otected)|ublic)|register\
16 |s(hort|igned|t(atic|ruct))|t(emplate|ypedef)|un(ion|signed)\
17 |v(irtual|o(id|latile)))\b/;
18
19 /*
20 * We inherit the C++ state from the C state. This gives us all the
21 * defaults, etc. All we have to do here is to overwrite things that
22 rizwank 1.1 * are not implemented, or are broken.
23 */
24 state cpp extends c
25 {
26 BEGIN {
27 /* See `c.st' for the comments on this one. */
28 type_re = cpp_type_re;
29 }
30
31 /* One line comments. */
32 /\/\// {
33 comment_face (true);
34 language_print ($0);
35 call (eat_one_line);
36 comment_face (false);
37 }
38
39 /* Keywords; those missing from C, but not types, goto, or case
40 (build-re '(asm catch delete new operator overload this throw try))
41 */
42 /\b(asm|catch|delete|new|o(perator|verload)|t(h(is|row)|ry))\b/ {
43 rizwank 1.1 keyword_face (true);
44 language_print ($0);
45 keyword_face (false);
46 }
47
48 /* Types. */
49 cpp_type_re {
50 type_face (true);
51 language_print ($0);
52 type_face (false);
53 }
54
55 /* Remove false labels. */
56 /[a-zA-Z0-9_]+::/ {
57 language_print ($0);
58 }
59
60 /* Labels. Emacs accepts also bare numbers. */
61 /^([ \t]*)([a-zA-Z0-9_]+)(:)/ {
62 language_print ($1);
63
64 rizwank 1.1 if (strcmp ($2, "public") == 0
65 || strcmp ($2, "private") == 0
66 || strcmp ($2, "protected") == 0)
67 {
68 /* These use the `type' face. */
69 type_face (true);
70 language_print ($2);
71 type_face (false);
72 }
73 else
74 {
75 reference_face (true);
76 language_print ($2);
77 reference_face (false);
78 }
79
80 language_print ($3);
81 }
82
83 /*
84 * Function definitions, but only if you code with the one and only
85 rizwank 1.1 * usable indentation style (GNU).
86 */
87 /^([a-zA-Z_][a-zA-Z_0-9:~]*)([ \t]*\()/ {
88 function_name_face (true);
89 language_print ($1);
90 function_name_face (false);
91
92 language_print ($2);
93 }
94
95 /* Function definitions and prototypes for other (loser) coding styles. */
96 /^([A-Za-z][a-zA-Z0-9_\&\* ]+)([ \*])([a-zA-Z_][a-zA-Z_0-9:~]*)([ \t]*\()/ {
97 garbage = $1;
98 middle_garbage = $2;
99 function_name = $3;
100 tail_garbage = $4;
101
102 highlight_types (garbage, cpp_type_re);
103
104 language_print (middle_garbage);
105
106 rizwank 1.1 function_name_face (true);
107 language_print (function_name);
108 function_name_face (false);
109
110 language_print (tail_garbage);
111 }
112 }
113
114
115 /*
116 Local variables:
117 mode: c
118 End:
119 */
|