1
/****************************************************************************
3
** Copyright (C) 2004-2005 Trolltech AS. All rights reserved.
4
** Copyright (C) 2001-2004 Roberto Raggi
6
** This file is part of the porting application of the Qt Toolkit.
8
** This file may be distributed under the terms of the Q Public License
9
** as defined by Trolltech AS of Norway and appearing in the file
10
** LICENSE.QPL included in the packaging of this file.
12
** This file may be distributed and/or modified under the terms of the
13
** GNU General Public License version 2 as published by the Free Software
14
** Foundation and appearing in the file LICENSE.GPL included in the
15
** packaging of this file.
17
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
18
** information about Qt Commercial License Agreements.
19
** See http://www.trolltech.com/qpl/ for QPL licensing information.
20
** See http://www.trolltech.com/gpl/ for GPL licensing information.
22
** Contact info@trolltech.com if any conditions of this licensing are
25
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
26
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
28
****************************************************************************/
32
using namespace TokenEngine;
39
void CppLexer::setupScanTable()
41
s_scan_keyword_table[0] = &CppLexer::scanKeyword0;
42
s_scan_keyword_table[1] = &CppLexer::scanKeyword0;
43
s_scan_keyword_table[2] = &CppLexer::scanKeyword2;
44
s_scan_keyword_table[3] = &CppLexer::scanKeyword3;
45
s_scan_keyword_table[4] = &CppLexer::scanKeyword4;
46
s_scan_keyword_table[5] = &CppLexer::scanKeyword5;
47
s_scan_keyword_table[6] = &CppLexer::scanKeyword6;
48
s_scan_keyword_table[7] = &CppLexer::scanKeyword7;
49
s_scan_keyword_table[8] = &CppLexer::scanKeyword8;
50
s_scan_keyword_table[9] = &CppLexer::scanKeyword9;
51
s_scan_keyword_table[10] = &CppLexer::scanKeyword10;
52
s_scan_keyword_table[11] = &CppLexer::scanKeyword11;
53
s_scan_keyword_table[12] = &CppLexer::scanKeyword12;
54
s_scan_keyword_table[13] = &CppLexer::scanKeyword0;
55
s_scan_keyword_table[14] = &CppLexer::scanKeyword14;
56
s_scan_keyword_table[15] = &CppLexer::scanKeyword0;
57
s_scan_keyword_table[16] = &CppLexer::scanKeyword16;
59
memset(s_attr_table, 0, 256);
61
for (int i=0; i<128; ++i) {
77
s_scan_table[i] = &CppLexer::scanOperator;
82
s_scan_table[i] = &CppLexer::scanNewline;
86
s_scan_table[i] = &CppLexer::scanCharLiteral;
90
s_scan_table[i] = &CppLexer::scanStringLiteral;
95
s_scan_table[i] = &CppLexer::scanWhiteSpaces;
96
s_attr_table[i] |= A_Whitespace;
97
} else if (isalpha(i) || i == '_') {
98
s_scan_table[i] = &CppLexer::scanIdentifier;
99
s_attr_table[i] |= A_Alpha;
100
} else if (isdigit(i)) {
101
s_scan_table[i] = &CppLexer::scanNumberLiteral;
102
s_attr_table[i] |= A_Digit;
104
s_scan_table[i] = &CppLexer::scanChar;
108
s_scan_table[128] = &CppLexer::scanUnicodeChar;
111
QVector<Type> CppLexer::lex(TokenSectionSequence tokenSectionSequence)
113
QVector<Type> tokenTypes;
114
tokenTypes.reserve(tokenSectionSequence.count());
115
TokenSectionSequenceIterator it(tokenSectionSequence);
116
while(it.nextToken()) {
117
tokenTypes.append(identify(it.tokenTempRef()));
122
Type CppLexer::identify(const TokenTempRef &tokenTempRef)
124
Q_ASSERT(tokenTempRef.length() >= 0 );
125
m_buffer = tokenTempRef.constData();
126
m_len = tokenTempRef.length();
128
const unsigned char ch = m_buffer[0];
130
(this->*s_scan_table[ch < 128 ? ch : 128])(&kind);
134
void CppLexer::scanKeyword0(int *kind)
136
*kind = Token_identifier;
139
void CppLexer::scanKeyword2(int *kind)
141
switch (m_buffer[m_ptr]) {
143
if (m_buffer[m_ptr+1] == 'f')
151
if (m_buffer[m_ptr+1] == 'o')
159
if (m_buffer[m_ptr+1] == 'r')
167
*kind = Token_identifier;
170
void CppLexer::scanKeyword3(int *kind)
172
switch (m_buffer[m_ptr]) {
174
if (m_buffer[m_ptr+1] == 'n' &&
175
m_buffer[m_ptr+2] == 'd')
180
if (m_buffer[m_ptr+1] == 's' &&
181
m_buffer[m_ptr+2] == 'm')
189
if (m_buffer[m_ptr+1] == 'o' &&
190
m_buffer[m_ptr+2] == 'r')
198
if (m_buffer[m_ptr+1] == 'n' &&
199
m_buffer[m_ptr+2] == 't')
207
if (m_buffer[m_ptr+1] == 'e' &&
208
m_buffer[m_ptr+2] == 'w')
213
if (m_buffer[m_ptr+1] == 'o' &&
214
m_buffer[m_ptr+2] == 't')
222
if (m_buffer[m_ptr+1] == 'r' &&
223
m_buffer[m_ptr+2] == 'y')
231
if (m_buffer[m_ptr+1] == 'o' &&
232
m_buffer[m_ptr+2] == 'r')
240
*kind = Token_identifier;
243
void CppLexer::scanKeyword4(int *kind)
245
switch (m_buffer[m_ptr]) {
247
if (m_buffer[m_ptr+1] == 'u' &&
248
m_buffer[m_ptr+2] == 't' &&
249
m_buffer[m_ptr+3] == 'o')
257
if (m_buffer[m_ptr+1] == 'a' &&
258
m_buffer[m_ptr+2] == 's' &&
259
m_buffer[m_ptr+3] == 'e')
264
if (m_buffer[m_ptr+1] == 'h' &&
265
m_buffer[m_ptr+2] == 'a' &&
266
m_buffer[m_ptr+3] == 'r')
274
if (m_buffer[m_ptr+1] == 'o' &&
275
m_buffer[m_ptr+2] == 'o' &&
276
m_buffer[m_ptr+3] == 'l')
284
if (m_buffer[m_ptr+1] == 'l' &&
285
m_buffer[m_ptr+2] == 's' &&
286
m_buffer[m_ptr+3] == 'e')
291
if (m_buffer[m_ptr+1] == 'm' &&
292
m_buffer[m_ptr+2] == 'i' &&
293
m_buffer[m_ptr+3] == 't')
298
if (m_buffer[m_ptr+1] == 'n' &&
299
m_buffer[m_ptr+2] == 'u' &&
300
m_buffer[m_ptr+3] == 'm')
308
if (m_buffer[m_ptr+1] == 'o' &&
309
m_buffer[m_ptr+2] == 't' &&
310
m_buffer[m_ptr+3] == 'o')
318
if (m_buffer[m_ptr+1] == 'o' &&
319
m_buffer[m_ptr+2] == 'n' &&
320
m_buffer[m_ptr+3] == 'g')
328
if (m_buffer[m_ptr+1] == 'h' &&
329
m_buffer[m_ptr+2] == 'i' &&
330
m_buffer[m_ptr+3] == 's')
338
if (m_buffer[m_ptr+1] == 'o' &&
339
m_buffer[m_ptr+2] == 'i' &&
340
m_buffer[m_ptr+3] == 'd')
348
*kind = Token_identifier;
351
void CppLexer::scanKeyword5(int *kind)
353
switch (m_buffer[m_ptr]) {
355
if (m_buffer[m_ptr+1] == 'a' &&
356
m_buffer[m_ptr+2] == 't' &&
357
m_buffer[m_ptr+3] == 'c' &&
358
m_buffer[m_ptr+4] == 'h')
363
if (m_buffer[m_ptr+1] == 'l' &&
364
m_buffer[m_ptr+2] == 'a' &&
365
m_buffer[m_ptr+3] == 's' &&
366
m_buffer[m_ptr+4] == 's')
371
if (m_buffer[m_ptr+1] == 'o' &&
372
m_buffer[m_ptr+2] == 'm' &&
373
m_buffer[m_ptr+3] == 'p' &&
374
m_buffer[m_ptr+4] == 'l')
379
if (m_buffer[m_ptr+1] == 'o' &&
380
m_buffer[m_ptr+2] == 'n' &&
381
m_buffer[m_ptr+3] == 's' &&
382
m_buffer[m_ptr+4] == 't')
390
if (m_buffer[m_ptr+1] == 'i' &&
391
m_buffer[m_ptr+2] == 't' &&
392
m_buffer[m_ptr+3] == 'o' &&
393
m_buffer[m_ptr+4] == 'r')
398
if (m_buffer[m_ptr+1] == 'r' &&
399
m_buffer[m_ptr+2] == 'e' &&
400
m_buffer[m_ptr+3] == 'a' &&
401
m_buffer[m_ptr+4] == 'k')
409
if (m_buffer[m_ptr+1] == 'l' &&
410
m_buffer[m_ptr+2] == 'o' &&
411
m_buffer[m_ptr+3] == 'a' &&
412
m_buffer[m_ptr+4] == 't')
420
if (m_buffer[m_ptr+1] == 'r' &&
421
m_buffer[m_ptr+2] == '_' &&
422
m_buffer[m_ptr+3] == 'e' &&
423
m_buffer[m_ptr+4] == 'q')
431
if (m_buffer[m_ptr+1] == 'h' &&
432
m_buffer[m_ptr+2] == 'o' &&
433
m_buffer[m_ptr+3] == 'r' &&
434
m_buffer[m_ptr+4] == 't')
439
if (m_buffer[m_ptr+1] == 'l' &&
440
m_buffer[m_ptr+2] == 'o' &&
441
m_buffer[m_ptr+3] == 't' &&
442
m_buffer[m_ptr+4] == 's')
450
if (m_buffer[m_ptr+1] == 'n' &&
451
m_buffer[m_ptr+2] == 'i' &&
452
m_buffer[m_ptr+3] == 'o' &&
453
m_buffer[m_ptr+4] == 'n')
458
if (m_buffer[m_ptr+1] == 's' &&
459
m_buffer[m_ptr+2] == 'i' &&
460
m_buffer[m_ptr+3] == 'n' &&
461
m_buffer[m_ptr+4] == 'g')
469
if (m_buffer[m_ptr+1] == 'h' &&
470
m_buffer[m_ptr+2] == 'r' &&
471
m_buffer[m_ptr+3] == 'o' &&
472
m_buffer[m_ptr+4] == 'w')
480
if (m_buffer[m_ptr+1] == 'h' &&
481
m_buffer[m_ptr+2] == 'i' &&
482
m_buffer[m_ptr+3] == 'l' &&
483
m_buffer[m_ptr+4] == 'e')
491
*kind = Token_identifier;
494
void CppLexer::scanKeyword6(int *kind)
496
switch (m_buffer[m_ptr]) {
498
if (m_buffer[m_ptr+1] == 'n' &&
499
m_buffer[m_ptr+2] == 'd' &&
500
m_buffer[m_ptr+3] == '_' &&
501
m_buffer[m_ptr+4] == 'e' &&
502
m_buffer[m_ptr+5] == 'q')
504
*kind = Token_and_eq;
510
if (m_buffer[m_ptr+1] == 'i' &&
511
m_buffer[m_ptr+2] == 't' &&
512
m_buffer[m_ptr+3] == 'a' &&
513
m_buffer[m_ptr+4] == 'n' &&
514
m_buffer[m_ptr+5] == 'd')
516
*kind = Token_bitand;
522
if (m_buffer[m_ptr+1] == 'x' &&
523
m_buffer[m_ptr+2] == 'p' &&
524
m_buffer[m_ptr+3] == 'o' &&
525
m_buffer[m_ptr+4] == 'r' &&
526
m_buffer[m_ptr+5] == 't')
528
*kind = Token_export;
531
if (m_buffer[m_ptr+1] == 'x' &&
532
m_buffer[m_ptr+2] == 't' &&
533
m_buffer[m_ptr+3] == 'e' &&
534
m_buffer[m_ptr+4] == 'r' &&
535
m_buffer[m_ptr+5] == 'n')
537
*kind = Token_extern;
543
if (m_buffer[m_ptr+1] == 'e' &&
544
m_buffer[m_ptr+2] == 'l' &&
545
m_buffer[m_ptr+3] == 'e' &&
546
m_buffer[m_ptr+4] == 't' &&
547
m_buffer[m_ptr+5] == 'e')
549
*kind = Token_delete;
552
if (m_buffer[m_ptr+1] == 'o' &&
553
m_buffer[m_ptr+2] == 'u' &&
554
m_buffer[m_ptr+3] == 'b' &&
555
m_buffer[m_ptr+4] == 'l' &&
556
m_buffer[m_ptr+5] == 'e')
558
*kind = Token_double;
564
if (m_buffer[m_ptr+1] == 'r' &&
565
m_buffer[m_ptr+2] == 'i' &&
566
m_buffer[m_ptr+3] == 'e' &&
567
m_buffer[m_ptr+4] == 'n' &&
568
m_buffer[m_ptr+5] == 'd')
570
*kind = Token_friend;
576
if (m_buffer[m_ptr+1] == 'n' &&
577
m_buffer[m_ptr+2] == 'l' &&
578
m_buffer[m_ptr+3] == 'i' &&
579
m_buffer[m_ptr+4] == 'n' &&
580
m_buffer[m_ptr+5] == 'e')
582
*kind = Token_inline;
588
if (m_buffer[m_ptr+1] == '_' &&
589
m_buffer[m_ptr+2] == 'D' &&
590
m_buffer[m_ptr+3] == 'C' &&
591
m_buffer[m_ptr+4] == 'O' &&
592
m_buffer[m_ptr+5] == 'P')
594
*kind = Token_K_DCOP;
600
if (m_buffer[m_ptr+1] == 'o' &&
601
m_buffer[m_ptr+2] == 't' &&
602
m_buffer[m_ptr+3] == '_' &&
603
m_buffer[m_ptr+4] == 'e' &&
604
m_buffer[m_ptr+5] == 'q')
606
*kind = Token_not_eq;
612
if (m_buffer[m_ptr+1] == 'u' &&
613
m_buffer[m_ptr+2] == 'b' &&
614
m_buffer[m_ptr+3] == 'l' &&
615
m_buffer[m_ptr+4] == 'i' &&
616
m_buffer[m_ptr+5] == 'c')
618
*kind = Token_public;
624
if (m_buffer[m_ptr+1] == 'i' &&
625
m_buffer[m_ptr+2] == 'g' &&
626
m_buffer[m_ptr+3] == 'n' &&
627
m_buffer[m_ptr+4] == 'e' &&
628
m_buffer[m_ptr+5] == 'd')
630
*kind = Token_signed;
633
if (m_buffer[m_ptr+1] == 'i' &&
634
m_buffer[m_ptr+2] == 'z' &&
635
m_buffer[m_ptr+3] == 'e' &&
636
m_buffer[m_ptr+4] == 'o' &&
637
m_buffer[m_ptr+5] == 'f')
639
*kind = Token_sizeof;
642
if (m_buffer[m_ptr+1] == 't' &&
643
m_buffer[m_ptr+2] == 'a' &&
644
m_buffer[m_ptr+3] == 't' &&
645
m_buffer[m_ptr+4] == 'i' &&
646
m_buffer[m_ptr+5] == 'c')
648
*kind = Token_static;
651
if (m_buffer[m_ptr+1] == 't' &&
652
m_buffer[m_ptr+2] == 'r' &&
653
m_buffer[m_ptr+3] == 'u' &&
654
m_buffer[m_ptr+4] == 'c' &&
655
m_buffer[m_ptr+5] == 't')
657
*kind = Token_struct;
660
if (m_buffer[m_ptr+1] == 'w' &&
661
m_buffer[m_ptr+2] == 'i' &&
662
m_buffer[m_ptr+3] == 't' &&
663
m_buffer[m_ptr+4] == 'c' &&
664
m_buffer[m_ptr+5] == 'h')
666
*kind = Token_switch;
672
if (m_buffer[m_ptr+1] == 'e' &&
673
m_buffer[m_ptr+2] == 't' &&
674
m_buffer[m_ptr+3] == 'u' &&
675
m_buffer[m_ptr+4] == 'r' &&
676
m_buffer[m_ptr+5] == 'n')
678
*kind = Token_return;
684
if (m_buffer[m_ptr+1] == 'y' &&
685
m_buffer[m_ptr+2] == 'p' &&
686
m_buffer[m_ptr+3] == 'e' &&
687
m_buffer[m_ptr+4] == 'i' &&
688
m_buffer[m_ptr+5] == 'd')
690
*kind = Token_typeid;
696
if (m_buffer[m_ptr+1] == 'o' &&
697
m_buffer[m_ptr+2] == 'r' &&
698
m_buffer[m_ptr+3] == '_' &&
699
m_buffer[m_ptr+4] == 'e' &&
700
m_buffer[m_ptr+5] == 'q')
702
*kind = Token_xor_eq;
708
if (m_buffer[m_ptr+1] == '_' &&
709
m_buffer[m_ptr+2] == 'd' &&
710
m_buffer[m_ptr+3] == 'c' &&
711
m_buffer[m_ptr+4] == 'o' &&
712
m_buffer[m_ptr+5] == 'p')
714
*kind = Token_k_dcop;
720
*kind = Token_identifier;
723
void CppLexer::scanKeyword7(int *kind)
725
switch (m_buffer[m_ptr]) {
727
if (m_buffer[m_ptr+1] == 'e' &&
728
m_buffer[m_ptr+2] == 'f' &&
729
m_buffer[m_ptr+3] == 'a' &&
730
m_buffer[m_ptr+4] == 'u' &&
731
m_buffer[m_ptr+5] == 'l' &&
732
m_buffer[m_ptr+6] == 't')
734
*kind = Token_default;
740
if (m_buffer[m_ptr+1] == 'u' &&
741
m_buffer[m_ptr+2] == 't' &&
742
m_buffer[m_ptr+3] == 'a' &&
743
m_buffer[m_ptr+4] == 'b' &&
744
m_buffer[m_ptr+5] == 'l' &&
745
m_buffer[m_ptr+6] == 'e')
747
*kind = Token_mutable;
753
if (m_buffer[m_ptr+1] == 'r' &&
754
m_buffer[m_ptr+2] == 'i' &&
755
m_buffer[m_ptr+3] == 'v' &&
756
m_buffer[m_ptr+4] == 'a' &&
757
m_buffer[m_ptr+5] == 't' &&
758
m_buffer[m_ptr+6] == 'e')
760
*kind = Token_private;
766
if (m_buffer[m_ptr+1] == 'i' &&
767
m_buffer[m_ptr+2] == 'g' &&
768
m_buffer[m_ptr+3] == 'n' &&
769
m_buffer[m_ptr+4] == 'a' &&
770
m_buffer[m_ptr+5] == 'l' &&
771
m_buffer[m_ptr+6] == 's')
773
*kind = Token_signals;
779
if (m_buffer[m_ptr+1] == 'y' &&
780
m_buffer[m_ptr+2] == 'p' &&
781
m_buffer[m_ptr+3] == 'e' &&
782
m_buffer[m_ptr+4] == 'd' &&
783
m_buffer[m_ptr+5] == 'e' &&
784
m_buffer[m_ptr+6] == 'f')
786
*kind = Token_typedef;
792
if (m_buffer[m_ptr+1] == 'i' &&
793
m_buffer[m_ptr+2] == 'r' &&
794
m_buffer[m_ptr+3] == 't' &&
795
m_buffer[m_ptr+4] == 'u' &&
796
m_buffer[m_ptr+5] == 'a' &&
797
m_buffer[m_ptr+6] == 'l')
799
*kind = Token_virtual;
804
*kind = Token_identifier;
807
void CppLexer::scanKeyword8(int *kind)
809
switch (m_buffer[m_ptr]) {
811
if (m_buffer[m_ptr+1] == '_' &&
812
m_buffer[m_ptr+2] == 't' &&
813
m_buffer[m_ptr+3] == 'y' &&
814
m_buffer[m_ptr+4] == 'p' &&
815
m_buffer[m_ptr+5] == 'e' &&
816
m_buffer[m_ptr+6] == 'o' &&
817
m_buffer[m_ptr+7] == 'f')
819
*kind = Token___typeof;
825
if (m_buffer[m_ptr+1] == 'o' &&
826
m_buffer[m_ptr+2] == 'n' &&
827
m_buffer[m_ptr+3] == 't' &&
828
m_buffer[m_ptr+4] == 'i' &&
829
m_buffer[m_ptr+5] == 'n' &&
830
m_buffer[m_ptr+6] == 'u' &&
831
m_buffer[m_ptr+7] == 'e')
833
*kind = Token_continue;
839
if (m_buffer[m_ptr+1] == 'x' &&
840
m_buffer[m_ptr+2] == 'p' &&
841
m_buffer[m_ptr+3] == 'l' &&
842
m_buffer[m_ptr+4] == 'i' &&
843
m_buffer[m_ptr+5] == 'c' &&
844
m_buffer[m_ptr+6] == 'i' &&
845
m_buffer[m_ptr+7] == 't')
847
*kind = Token_explicit;
853
if (m_buffer[m_ptr+1] == 'p' &&
854
m_buffer[m_ptr+2] == 'e' &&
855
m_buffer[m_ptr+3] == 'r' &&
856
m_buffer[m_ptr+4] == 'a' &&
857
m_buffer[m_ptr+5] == 't' &&
858
m_buffer[m_ptr+6] == 'o' &&
859
m_buffer[m_ptr+7] == 'r')
861
*kind = Token_operator;
867
if (m_buffer[m_ptr+1] == '_' &&
868
m_buffer[m_ptr+2] == 'O' &&
869
m_buffer[m_ptr+3] == 'B' &&
870
m_buffer[m_ptr+4] == 'J' &&
871
m_buffer[m_ptr+5] == 'E' &&
872
m_buffer[m_ptr+6] == 'C' &&
873
m_buffer[m_ptr+7] == 'T')
875
*kind = Token_Q_OBJECT;
881
if (m_buffer[m_ptr+1] == 'e' &&
882
m_buffer[m_ptr+2] == 'g' &&
883
m_buffer[m_ptr+3] == 'i' &&
884
m_buffer[m_ptr+4] == 's' &&
885
m_buffer[m_ptr+5] == 't' &&
886
m_buffer[m_ptr+6] == 'e' &&
887
m_buffer[m_ptr+7] == 'r')
889
*kind = Token_register;
895
if (m_buffer[m_ptr+1] == 'n' &&
896
m_buffer[m_ptr+2] == 's' &&
897
m_buffer[m_ptr+3] == 'i' &&
898
m_buffer[m_ptr+4] == 'g' &&
899
m_buffer[m_ptr+5] == 'n' &&
900
m_buffer[m_ptr+6] == 'e' &&
901
m_buffer[m_ptr+7] == 'd')
903
*kind = Token_unsigned;
909
if (m_buffer[m_ptr+1] == 'e' &&
910
m_buffer[m_ptr+2] == 'm' &&
911
m_buffer[m_ptr+3] == 'p' &&
912
m_buffer[m_ptr+4] == 'l' &&
913
m_buffer[m_ptr+5] == 'a' &&
914
m_buffer[m_ptr+6] == 't' &&
915
m_buffer[m_ptr+7] == 'e')
917
*kind = Token_template;
920
if (m_buffer[m_ptr+1] == 'y' &&
921
m_buffer[m_ptr+2] == 'p' &&
922
m_buffer[m_ptr+3] == 'e' &&
923
m_buffer[m_ptr+4] == 'n' &&
924
m_buffer[m_ptr+5] == 'a' &&
925
m_buffer[m_ptr+6] == 'm' &&
926
m_buffer[m_ptr+7] == 'e')
928
*kind = Token_typename;
934
if (m_buffer[m_ptr+1] == 'o' &&
935
m_buffer[m_ptr+2] == 'l' &&
936
m_buffer[m_ptr+3] == 'a' &&
937
m_buffer[m_ptr+4] == 't' &&
938
m_buffer[m_ptr+5] == 'i' &&
939
m_buffer[m_ptr+6] == 'l' &&
940
m_buffer[m_ptr+7] == 'e')
942
*kind = Token_volatile;
948
*kind = Token_identifier;
951
void CppLexer::scanKeyword9(int *kind)
953
switch (m_buffer[m_ptr]) {
955
if (m_buffer[m_ptr+1] == 'r' &&
956
m_buffer[m_ptr+2] == 'o' &&
957
m_buffer[m_ptr+3] == 't' &&
958
m_buffer[m_ptr+4] == 'e' &&
959
m_buffer[m_ptr+5] == 'c' &&
960
m_buffer[m_ptr+6] == 't' &&
961
m_buffer[m_ptr+7] == 'e' &&
962
m_buffer[m_ptr+8] == 'd')
964
*kind = Token_protected;
970
if (m_buffer[m_ptr+1] == 'a' &&
971
m_buffer[m_ptr+2] == 'm' &&
972
m_buffer[m_ptr+3] == 'e' &&
973
m_buffer[m_ptr+4] == 's' &&
974
m_buffer[m_ptr+5] == 'p' &&
975
m_buffer[m_ptr+6] == 'a' &&
976
m_buffer[m_ptr+7] == 'c' &&
977
m_buffer[m_ptr+8] == 'e')
979
*kind = Token_namespace;
985
*kind = Token_identifier;
988
void CppLexer::scanKeyword10(int *kind)
990
switch (m_buffer[m_ptr]) {
992
if (m_buffer[m_ptr+1] == 'o' &&
993
m_buffer[m_ptr+2] == 'n' &&
994
m_buffer[m_ptr+3] == 's' &&
995
m_buffer[m_ptr+4] == 't' &&
996
m_buffer[m_ptr+5] == '_' &&
997
m_buffer[m_ptr+6] == 'c' &&
998
m_buffer[m_ptr+7] == 'a' &&
999
m_buffer[m_ptr+8] == 's' &&
1000
m_buffer[m_ptr+9] == 't')
1002
*kind = Token_const_cast;
1008
*kind = Token_identifier;
1011
void CppLexer::scanKeyword11(int *kind)
1013
switch (m_buffer[m_ptr]) {
1015
if (m_buffer[m_ptr+1] == 't' &&
1016
m_buffer[m_ptr+2] == 'a' &&
1017
m_buffer[m_ptr+3] == 't' &&
1018
m_buffer[m_ptr+4] == 'i' &&
1019
m_buffer[m_ptr+5] == 'c' &&
1020
m_buffer[m_ptr+6] == '_' &&
1021
m_buffer[m_ptr+7] == 'c' &&
1022
m_buffer[m_ptr+8] == 'a' &&
1023
m_buffer[m_ptr+9] == 's' &&
1024
m_buffer[m_ptr+10] == 't')
1026
*kind = Token_static_cast;
1032
*kind = Token_identifier;
1035
void CppLexer::scanKeyword12(int *kind)
1037
switch (m_buffer[m_ptr]) {
1039
if (m_buffer[m_ptr+1] == 'y' &&
1040
m_buffer[m_ptr+2] == 'n' &&
1041
m_buffer[m_ptr+3] == 'a' &&
1042
m_buffer[m_ptr+4] == 'm' &&
1043
m_buffer[m_ptr+5] == 'i' &&
1044
m_buffer[m_ptr+6] == 'c' &&
1045
m_buffer[m_ptr+7] == '_' &&
1046
m_buffer[m_ptr+8] == 'c' &&
1047
m_buffer[m_ptr+9] == 'a' &&
1048
m_buffer[m_ptr+10] == 's' &&
1049
m_buffer[m_ptr+11] == 't')
1051
*kind = Token_dynamic_cast;
1057
*kind = Token_identifier;
1060
void CppLexer::scanKeyword14(int *kind)
1062
switch (m_buffer[m_ptr]) {
1064
if (m_buffer[m_ptr+1] == '_' &&
1065
m_buffer[m_ptr+2] == 'd' &&
1066
m_buffer[m_ptr+3] == 'c' &&
1067
m_buffer[m_ptr+4] == 'o' &&
1068
m_buffer[m_ptr+5] == 'p' &&
1069
m_buffer[m_ptr+6] == '_' &&
1070
m_buffer[m_ptr+7] == 's' &&
1071
m_buffer[m_ptr+8] == 'i' &&
1072
m_buffer[m_ptr+9] == 'g' &&
1073
m_buffer[m_ptr+10] == 'n' &&
1074
m_buffer[m_ptr+11] == 'a' &&
1075
m_buffer[m_ptr+12] == 'l' &&
1076
m_buffer[m_ptr+13] == 's')
1078
*kind = Token_k_dcop_signals;
1084
*kind = Token_identifier;
1087
void CppLexer::scanKeyword16(int *kind)
1089
switch (m_buffer[m_ptr]) {
1091
if (m_buffer[m_ptr+1] == 'e' &&
1092
m_buffer[m_ptr+2] == 'i' &&
1093
m_buffer[m_ptr+3] == 'n' &&
1094
m_buffer[m_ptr+4] == 't' &&
1095
m_buffer[m_ptr+5] == 'e' &&
1096
m_buffer[m_ptr+6] == 'r' &&
1097
m_buffer[m_ptr+7] == 'p' &&
1098
m_buffer[m_ptr+8] == 'r' &&
1099
m_buffer[m_ptr+9] == 'e' &&
1100
m_buffer[m_ptr+10] == 't' &&
1101
m_buffer[m_ptr+11] == '_' &&
1102
m_buffer[m_ptr+12] == 'c' &&
1103
m_buffer[m_ptr+13] == 'a' &&
1104
m_buffer[m_ptr+14] == 's' &&
1105
m_buffer[m_ptr+15] == 't')
1107
*kind = Token_reinterpret_cast;
1113
*kind = Token_identifier;
1118
void CppLexer::scanChar(int *kind)
1120
*kind = m_buffer[m_ptr++];
1123
void CppLexer::scanWhiteSpaces(int *kind)
1125
*kind = Token_whitespaces;
1128
void CppLexer::scanNewline(int *kind)
1133
void CppLexer::scanUnicodeChar(int *kind)
1135
*kind = m_buffer[0];
1138
void CppLexer::scanCharLiteral(int *kind)
1140
*kind = Token_char_literal;
1143
void CppLexer::scanStringLiteral(int *kind)
1145
*kind = Token_string_literal;
1148
void CppLexer::scanIdentifier(int *kind)
1151
(this->*s_scan_keyword_table[m_len])(kind);
1153
(this->*s_scan_keyword_table[0])(kind);
1156
void CppLexer::scanNumberLiteral(int *kind)
1158
*kind = Token_number_literal;
1161
void CppLexer::scanOperator(int *kind)
1163
switch (m_buffer[m_ptr]) {
1165
if (m_buffer[m_ptr+1] == ':') {
1166
*kind = Token_scope;
1175
if (m_buffer[m_ptr+1] == '=') {
1176
*kind = Token_assign;
1183
if (m_buffer[m_ptr+1] == '=') {
1190
if (m_buffer[m_ptr+1] == '&') {
1193
} else if (m_buffer[m_ptr+1] == '=') {
1194
*kind = Token_assign;
1200
if (m_buffer[m_ptr+1] == '|' ) {
1203
} else if (m_buffer[m_ptr+1] == '=') {
1204
*kind = Token_assign;
1210
if (m_buffer[m_ptr+1] == '+' ) {
1213
} else if (m_buffer[m_ptr+1] == '=') {
1214
*kind = Token_assign;
1220
if (m_buffer[m_ptr+1] == '<') {
1221
if (m_buffer[m_ptr+2] == '=') {
1222
*kind = Token_assign;
1225
*kind = Token_shift;
1227
} else if (m_buffer[m_ptr+1] == '=') {
1234
if (m_buffer[m_ptr+1] == '>') {
1235
if (m_buffer[m_ptr+2] == '=') {
1236
*kind = Token_assign;
1239
*kind = Token_shift;
1241
} else if (m_buffer[m_ptr+1] == '=') {
1248
if (m_buffer[m_ptr+1] == '>') {
1249
if (m_buffer[m_ptr+2] == '*') {
1250
*kind = Token_ptrmem;
1253
*kind = Token_arrow;
1255
} else if (m_buffer[m_ptr+1] == '-') {
1258
} else if (m_buffer[m_ptr+1] == '=') {
1259
*kind = Token_assign;
1265
if (m_buffer[m_ptr+1] == '.' && m_buffer[m_ptr+2] == '.') {
1266
*kind = Token_ellipsis;
1268
} else if (m_buffer[m_ptr+1] == '*') {
1269
*kind = Token_ptrmem;
1276
*kind = m_buffer[m_ptr++];