annotate dmd/lexer.c @ 1650:40bd4a0d4870

Update to work with LLVM 2.7. Removed use of dyn_cast, llvm no compiles without exceptions and rtti by default. We do need exceptions for the libconfig stuff, but rtti isn't necessary (anymore). Debug info needs to be rewritten, as in LLVM 2.7 the format has completely changed. To have something to look at while rewriting, the old code has been wrapped inside #ifndef DISABLE_DEBUG_INFO , this means that you have to define this to compile at the moment. Updated tango 0.99.9 patch to include updated EH runtime code, which is needed for LLVM 2.7 as well.
author Tomas Lindquist Olsen
date Wed, 19 May 2010 12:42:32 +0200
parents dbf7b54f542f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2 // Compiler implementation of the D programming language
1195
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1165
diff changeset
3 // Copyright (c) 1999-2009 by Digital Mars
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4 // All Rights Reserved
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5 // written by Walter Bright
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6 // http://www.digitalmars.com
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7 // License for redistribution is by either the Artistic License
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8 // in artistic.txt, or the GNU General Public License in gnu.txt.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9 // See the included readme.txt for details.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
10
1431
5f6f0929ee4c Define __C99FEATURES__ in lexer.c for Solaris. Fixes #313.
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
11 #if __sun && __SVR4
5f6f0929ee4c Define __C99FEATURES__ in lexer.c for Solaris. Fixes #313.
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
12 #define __C99FEATURES__ 1 // Needed on Solaris for NaN and more, LDC#313
5f6f0929ee4c Define __C99FEATURES__ in lexer.c for Solaris. Fixes #313.
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
13 #endif
5f6f0929ee4c Define __C99FEATURES__ in lexer.c for Solaris. Fixes #313.
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
14
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1195
diff changeset
15 #if IN_LLVM
1195
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1165
diff changeset
16 #include <cmath>
1228
79758fd2f48a Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1195
diff changeset
17 #endif
872
aa953cc960b6 Apply BlueZeniX's patch for OpenSolaris compatibility. Fixes #158.
Christian Kamm <kamm incasoftware de>
parents: 846
diff changeset
18
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
19 /* Lexical Analyzer */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
20
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
21 #include <stdio.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
22 #include <string.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
23 #include <ctype.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
24 #include <stdarg.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
25 #include <errno.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
26 #include <wchar.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
27 #include <stdlib.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
28 #include <assert.h>
1195
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1165
diff changeset
29 #include <time.h> // for time() and ctime()
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
30
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 872
diff changeset
31 #include "rmem.h"
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
32
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
33 #include "stringtable.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
34
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
35 #include "lexer.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
36 #include "utf.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
37 #include "identifier.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
38 #include "id.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
39 #include "module.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
40
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
41 #if _WIN32 && __DMC__
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
42 // from \dm\src\include\setlocal.h
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
43 extern "C" char * __cdecl __locale_decpoint;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
44 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
45
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
46 extern int HtmlNamedEntity(unsigned char *p, int length);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
47
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
48 #define LS 0x2028 // UTF line separator
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
49 #define PS 0x2029 // UTF paragraph separator
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
50
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
51 /********************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
52 * Do our own char maps
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
53 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
54
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
55 static unsigned char cmtable[256];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
56
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
57 const int CMoctal = 0x1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
58 const int CMhex = 0x2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
59 const int CMidchar = 0x4;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
60
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
61 inline unsigned char isoctal (unsigned char c) { return cmtable[c] & CMoctal; }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
62 inline unsigned char ishex (unsigned char c) { return cmtable[c] & CMhex; }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
63 inline unsigned char isidchar(unsigned char c) { return cmtable[c] & CMidchar; }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
64
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
65 static void cmtable_init()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
66 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
67 for (unsigned c = 0; c < sizeof(cmtable) / sizeof(cmtable[0]); c++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
68 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
69 if ('0' <= c && c <= '7')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
70 cmtable[c] |= CMoctal;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
71 if (isdigit(c) || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F'))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
72 cmtable[c] |= CMhex;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
73 if (isalnum(c) || c == '_')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
74 cmtable[c] |= CMidchar;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
75 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
76 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
77
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
78
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
79 /************************* Token **********************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
80
658
50383e476c7e Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 366
diff changeset
81 const char *Token::tochars[TOKMAX];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
82
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
83 void *Token::operator new(size_t size)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
84 { Token *t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
85
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
86 if (Lexer::freelist)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
87 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
88 t = Lexer::freelist;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
89 Lexer::freelist = t->next;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
90 return t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
91 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
92
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
93 return ::operator new(size);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
94 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
95
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
96 #ifdef DEBUG
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
97 void Token::print()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
98 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
99 fprintf(stdmsg, "%s\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
100 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
101 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
102
658
50383e476c7e Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 366
diff changeset
103 const char *Token::toChars()
50383e476c7e Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 366
diff changeset
104 { const char *p;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
105 static char buffer[3 + 3 * sizeof(value) + 1];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
106
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
107 p = buffer;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
108 switch (value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
109 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
110 case TOKint32v:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
111 sprintf(buffer,"%d",(d_int32)int64value);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
112 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
113
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
114 case TOKuns32v:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
115 case TOKcharv:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
116 case TOKwcharv:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
117 case TOKdcharv:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
118 sprintf(buffer,"%uU",(d_uns32)uns64value);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
119 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
120
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
121 case TOKint64v:
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 872
diff changeset
122 sprintf(buffer,"%jdL",int64value);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
123 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
124
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
125 case TOKuns64v:
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 872
diff changeset
126 sprintf(buffer,"%juUL",uns64value);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
127 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
128
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
129 #if IN_GCC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
130 case TOKfloat32v:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
131 case TOKfloat64v:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
132 case TOKfloat80v:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
133 float80value.format(buffer, sizeof(buffer));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
134 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
135 case TOKimaginary32v:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
136 case TOKimaginary64v:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
137 case TOKimaginary80v:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
138 float80value.format(buffer, sizeof(buffer));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
139 // %% buffer
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
140 strcat(buffer, "i");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
141 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
142 #else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
143 case TOKfloat32v:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
144 sprintf(buffer,"%Lgf", float80value);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
145 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
146
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
147 case TOKfloat64v:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
148 sprintf(buffer,"%Lg", float80value);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
149 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
150
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
151 case TOKfloat80v:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
152 sprintf(buffer,"%LgL", float80value);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
153 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
154
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
155 case TOKimaginary32v:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
156 sprintf(buffer,"%Lgfi", float80value);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
157 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
158
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
159 case TOKimaginary64v:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
160 sprintf(buffer,"%Lgi", float80value);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
161 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
162
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
163 case TOKimaginary80v:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
164 sprintf(buffer,"%LgLi", float80value);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
165 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
166 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
167
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
168 case TOKstring:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
169 #if CSTRINGS
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
170 p = string;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
171 #else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
172 { OutBuffer buf;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
173
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
174 buf.writeByte('"');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
175 for (size_t i = 0; i < len; )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
176 { unsigned c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
177
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
178 utf_decodeChar((unsigned char *)ustring, len, &i, &c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
179 switch (c)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
180 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
181 case 0:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
182 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
183
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
184 case '"':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
185 case '\\':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
186 buf.writeByte('\\');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
187 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
188 if (isprint(c))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
189 buf.writeByte(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
190 else if (c <= 0x7F)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
191 buf.printf("\\x%02x", c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
192 else if (c <= 0xFFFF)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
193 buf.printf("\\u%04x", c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
194 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
195 buf.printf("\\U%08x", c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
196 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
197 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
198 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
199 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
200 buf.writeByte('"');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
201 if (postfix)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
202 buf.writeByte('"');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
203 buf.writeByte(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
204 p = (char *)buf.extractData();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
205 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
206 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
207 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
208
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
209 case TOKidentifier:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
210 case TOKenum:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
211 case TOKstruct:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
212 case TOKimport:
1603
eae495e6ae8d Merge DMD r248: implement Denis Koroskin's macro suggestion
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
213 case BASIC_TYPES:
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
214 p = ident->toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
215 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
216
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
217 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
218 p = toChars(value);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
219 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
220 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
221 return p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
222 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
223
658
50383e476c7e Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 366
diff changeset
224 const char *Token::toChars(enum TOK value)
50383e476c7e Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 366
diff changeset
225 { const char *p;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
226 static char buffer[3 + 3 * sizeof(value) + 1];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
227
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
228 p = tochars[value];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
229 if (!p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
230 { sprintf(buffer,"TOK%d",value);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
231 p = buffer;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
232 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
233 return p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
234 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
235
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
236 /*************************** Lexer ********************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
237
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
238 Token *Lexer::freelist = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
239 StringTable Lexer::stringtable;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
240 OutBuffer Lexer::stringbuffer;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
241
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
242 Lexer::Lexer(Module *mod,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
243 unsigned char *base, unsigned begoffset, unsigned endoffset,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
244 int doDocComment, int commentToken)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
245 : loc(mod, 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
246 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
247 //printf("Lexer::Lexer(%p,%d)\n",base,length);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
248 //printf("lexer.mod = %p, %p\n", mod, this->loc.mod);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
249 memset(&token,0,sizeof(token));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
250 this->base = base;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
251 this->end = base + endoffset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
252 p = base + begoffset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
253 this->mod = mod;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
254 this->doDocComment = doDocComment;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
255 this->anyToken = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
256 this->commentToken = commentToken;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
257 //initKeywords();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
258
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
259 /* If first line starts with '#!', ignore the line
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
260 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
261
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
262 if (p[0] == '#' && p[1] =='!')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
263 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
264 p += 2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
265 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
266 { unsigned char c = *p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
267 switch (c)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
268 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
269 case '\n':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
270 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
271 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
272
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
273 case '\r':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
274 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
275 if (*p == '\n')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
276 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
277 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
278
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
279 case 0:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
280 case 0x1A:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
281 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
282
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
283 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
284 if (c & 0x80)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
285 { unsigned u = decodeUTF();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
286 if (u == PS || u == LS)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
287 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
288 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
289 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
290 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
291 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
292 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
293 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
294 loc.linnum = 2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
295 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
296 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
297
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
298
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
299 void Lexer::error(const char *format, ...)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
300 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
301 if (mod && !global.gag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
302 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
303 char *p = loc.toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
304 if (*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
305 fprintf(stdmsg, "%s: ", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
306 mem.free(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
307
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
308 va_list ap;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
309 va_start(ap, format);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
310 vfprintf(stdmsg, format, ap);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
311 va_end(ap);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
312
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
313 fprintf(stdmsg, "\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
314 fflush(stdmsg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
315
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
316 if (global.errors >= 20) // moderate blizzard of cascading messages
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
317 fatal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
318 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
319 global.errors++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
320 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
321
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
322 void Lexer::error(Loc loc, const char *format, ...)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
323 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
324 if (mod && !global.gag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
325 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
326 char *p = loc.toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
327 if (*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
328 fprintf(stdmsg, "%s: ", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
329 mem.free(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
330
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
331 va_list ap;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
332 va_start(ap, format);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
333 vfprintf(stdmsg, format, ap);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
334 va_end(ap);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
335
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
336 fprintf(stdmsg, "\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
337 fflush(stdmsg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
338
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
339 if (global.errors >= 20) // moderate blizzard of cascading messages
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
340 fatal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
341 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
342 global.errors++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
343 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
344
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
345 TOK Lexer::nextToken()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
346 { Token *t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
347
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
348 if (token.next)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
349 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
350 t = token.next;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
351 memcpy(&token,t,sizeof(Token));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
352 t->next = freelist;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
353 freelist = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
354 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
355 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
356 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
357 scan(&token);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
358 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
359 //token.print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
360 return token.value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
361 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
362
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
363 Token *Lexer::peek(Token *ct)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
364 { Token *t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
365
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
366 if (ct->next)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
367 t = ct->next;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
368 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
369 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
370 t = new Token();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
371 scan(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
372 t->next = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
373 ct->next = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
374 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
375 return t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
376 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
377
717
a26b0c5d5942 Merged DMD 1.036.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 697
diff changeset
378 /***********************
a26b0c5d5942 Merged DMD 1.036.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 697
diff changeset
379 * Look ahead at next token's value.
a26b0c5d5942 Merged DMD 1.036.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 697
diff changeset
380 */
a26b0c5d5942 Merged DMD 1.036.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 697
diff changeset
381
a26b0c5d5942 Merged DMD 1.036.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 697
diff changeset
382 TOK Lexer::peekNext()
a26b0c5d5942 Merged DMD 1.036.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 697
diff changeset
383 {
a26b0c5d5942 Merged DMD 1.036.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 697
diff changeset
384 return peek(&token)->value;
a26b0c5d5942 Merged DMD 1.036.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 697
diff changeset
385 }
a26b0c5d5942 Merged DMD 1.036.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 697
diff changeset
386
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
387 /*********************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
388 * tk is on the opening (.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
389 * Look ahead and return token that is past the closing ).
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
390 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
391
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
392 Token *Lexer::peekPastParen(Token *tk)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
393 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
394 //printf("peekPastParen()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
395 int parens = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
396 int curlynest = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
397 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
398 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
399 tk = peek(tk);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
400 //tk->print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
401 switch (tk->value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
402 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
403 case TOKlparen:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
404 parens++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
405 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
406
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
407 case TOKrparen:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
408 --parens;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
409 if (parens)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
410 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
411 tk = peek(tk);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
412 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
413
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
414 case TOKlcurly:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
415 curlynest++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
416 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
417
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
418 case TOKrcurly:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
419 if (--curlynest >= 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
420 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
421 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
422
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
423 case TOKsemicolon:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
424 if (curlynest)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
425 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
426 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
427
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
428 case TOKeof:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
429 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
430
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
431 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
432 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
433 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
434 return tk;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
435 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
436 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
437
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
438 /**********************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
439 * Determine if string is a valid Identifier.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
440 * Placed here because of commonality with Lexer functionality.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
441 * Returns:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
442 * 0 invalid
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
443 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
444
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
445 int Lexer::isValidIdentifier(char *p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
446 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
447 size_t len;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
448 size_t idx;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
449
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
450 if (!p || !*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
451 goto Linvalid;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
452
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
453 if (*p >= '0' && *p <= '9') // beware of isdigit() on signed chars
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
454 goto Linvalid;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
455
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
456 len = strlen(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
457 idx = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
458 while (p[idx])
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
459 { dchar_t dc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
460
658
50383e476c7e Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 366
diff changeset
461 const char *q = utf_decodeChar((unsigned char *)p, len, &idx, &dc);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
462 if (q)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
463 goto Linvalid;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
464
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
465 if (!((dc >= 0x80 && isUniAlpha(dc)) || isalnum(dc) || dc == '_'))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
466 goto Linvalid;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
467 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
468 return 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
469
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
470 Linvalid:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
471 return 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
472 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
473
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
474 /****************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
475 * Turn next token in buffer into a token.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
476 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
477
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
478 void Lexer::scan(Token *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
479 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
480 unsigned lastLine = loc.linnum;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
481 unsigned linnum;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
482
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
483 t->blockComment = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
484 t->lineComment = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
485 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
486 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
487 t->ptr = p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
488 //printf("p = %p, *p = '%c'\n",p,*p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
489 switch (*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
490 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
491 case 0:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
492 case 0x1A:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
493 t->value = TOKeof; // end of file
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
494 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
495
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
496 case ' ':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
497 case '\t':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
498 case '\v':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
499 case '\f':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
500 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
501 continue; // skip white space
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
502
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
503 case '\r':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
504 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
505 if (*p != '\n') // if CR stands by itself
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
506 loc.linnum++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
507 continue; // skip white space
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
508
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
509 case '\n':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
510 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
511 loc.linnum++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
512 continue; // skip white space
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
513
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
514 case '0': case '1': case '2': case '3': case '4':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
515 case '5': case '6': case '7': case '8': case '9':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
516 t->value = number(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
517 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
518
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
519 #if CSTRINGS
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
520 case '\'':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
521 t->value = charConstant(t, 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
522 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
523
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
524 case '"':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
525 t->value = stringConstant(t,0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
526 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
527
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
528 case 'l':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
529 case 'L':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
530 if (p[1] == '\'')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
531 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
532 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
533 t->value = charConstant(t, 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
534 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
535 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
536 else if (p[1] == '"')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
537 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
538 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
539 t->value = stringConstant(t, 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
540 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
541 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
542 #else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
543 case '\'':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
544 t->value = charConstant(t,0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
545 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
546
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
547 case 'r':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
548 if (p[1] != '"')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
549 goto case_ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
550 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
551 case '`':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
552 t->value = wysiwygStringConstant(t, *p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
553 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
554
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
555 case 'x':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
556 if (p[1] != '"')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
557 goto case_ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
558 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
559 t->value = hexStringConstant(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
560 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
561
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
562 #if DMDV2
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
563 case 'q':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
564 if (p[1] == '"')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
565 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
566 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
567 t->value = delimitedStringConstant(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
568 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
569 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
570 else if (p[1] == '{')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
571 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
572 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
573 t->value = tokenStringConstant(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
574 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
575 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
576 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
577 goto case_ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
578 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
579
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
580 case '"':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
581 t->value = escapeStringConstant(t,0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
582 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
583
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
584 case '\\': // escaped string literal
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
585 { unsigned c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
586
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
587 stringbuffer.reset();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
588 do
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
589 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
590 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
591 switch (*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
592 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
593 case 'u':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
594 case 'U':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
595 case '&':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
596 c = escapeSequence();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
597 stringbuffer.writeUTF8(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
598 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
599
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
600 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
601 c = escapeSequence();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
602 stringbuffer.writeByte(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
603 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
604 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
605 } while (*p == '\\');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
606 t->len = stringbuffer.offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
607 stringbuffer.writeByte(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
608 t->ustring = (unsigned char *)mem.malloc(stringbuffer.offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
609 memcpy(t->ustring, stringbuffer.data, stringbuffer.offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
610 t->postfix = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
611 t->value = TOKstring;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
612 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
613 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
614
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
615 case 'l':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
616 case 'L':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
617 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
618 case 'a': case 'b': case 'c': case 'd': case 'e':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
619 case 'f': case 'g': case 'h': case 'i': case 'j':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
620 case 'k': case 'm': case 'n': case 'o':
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
621 #if DMDV2
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
622 case 'p': /*case 'q': case 'r':*/ case 's': case 't':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
623 #else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
624 case 'p': case 'q': /*case 'r':*/ case 's': case 't':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
625 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
626 case 'u': case 'v': case 'w': /*case 'x':*/ case 'y':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
627 case 'z':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
628 case 'A': case 'B': case 'C': case 'D': case 'E':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
629 case 'F': case 'G': case 'H': case 'I': case 'J':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
630 case 'K': case 'M': case 'N': case 'O':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
631 case 'P': case 'Q': case 'R': case 'S': case 'T':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
632 case 'U': case 'V': case 'W': case 'X': case 'Y':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
633 case 'Z':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
634 case '_':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
635 case_ident:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
636 { unsigned char c;
1614
dbf7b54f542f Merge DMD r292: bugzilla 3455 Some Unicode characters not allowed...
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
637
dbf7b54f542f Merge DMD r292: bugzilla 3455 Some Unicode characters not allowed...
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
638 while (1)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
639 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
640 c = *++p;
1614
dbf7b54f542f Merge DMD r292: bugzilla 3455 Some Unicode characters not allowed...
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
641 if (isidchar(c))
dbf7b54f542f Merge DMD r292: bugzilla 3455 Some Unicode characters not allowed...
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
642 continue;
dbf7b54f542f Merge DMD r292: bugzilla 3455 Some Unicode characters not allowed...
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
643 else if (c & 0x80)
dbf7b54f542f Merge DMD r292: bugzilla 3455 Some Unicode characters not allowed...
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
644 { unsigned char *s = p;
dbf7b54f542f Merge DMD r292: bugzilla 3455 Some Unicode characters not allowed...
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
645 unsigned u = decodeUTF();
dbf7b54f542f Merge DMD r292: bugzilla 3455 Some Unicode characters not allowed...
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
646 if (isUniAlpha(u))
dbf7b54f542f Merge DMD r292: bugzilla 3455 Some Unicode characters not allowed...
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
647 continue;
dbf7b54f542f Merge DMD r292: bugzilla 3455 Some Unicode characters not allowed...
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
648 error("char 0x%04x not allowed in identifier", u);
dbf7b54f542f Merge DMD r292: bugzilla 3455 Some Unicode characters not allowed...
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
649 p = s;
dbf7b54f542f Merge DMD r292: bugzilla 3455 Some Unicode characters not allowed...
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
650 }
dbf7b54f542f Merge DMD r292: bugzilla 3455 Some Unicode characters not allowed...
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
651 break;
dbf7b54f542f Merge DMD r292: bugzilla 3455 Some Unicode characters not allowed...
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
652 }
dbf7b54f542f Merge DMD r292: bugzilla 3455 Some Unicode characters not allowed...
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
653
dbf7b54f542f Merge DMD r292: bugzilla 3455 Some Unicode characters not allowed...
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
654 StringValue *sv = stringtable.update((char *)t->ptr, p - t->ptr);
dbf7b54f542f Merge DMD r292: bugzilla 3455 Some Unicode characters not allowed...
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
655 Identifier *id = (Identifier *) sv->ptrvalue;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
656 if (!id)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
657 { id = new Identifier(sv->lstring.string,TOKidentifier);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
658 sv->ptrvalue = id;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
659 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
660 t->ident = id;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
661 t->value = (enum TOK) id->value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
662 anyToken = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
663 if (*t->ptr == '_') // if special identifier token
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
664 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
665 static char date[11+1];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
666 static char time[8+1];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
667 static char timestamp[24+1];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
668
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
669 if (!date[0]) // lazy evaluation
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
670 { time_t t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
671 char *p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
672
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
673 ::time(&t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
674 p = ctime(&t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
675 assert(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
676 sprintf(date, "%.6s %.4s", p + 4, p + 20);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
677 sprintf(time, "%.8s", p + 11);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
678 sprintf(timestamp, "%.24s", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
679 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
680
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
681 #if DMDV1
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
682 if (mod && id == Id::FILE)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
683 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
684 t->ustring = (unsigned char *)(loc.filename ? loc.filename : mod->ident->toChars());
1195
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1165
diff changeset
685 goto Lstr;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
686 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
687 else if (mod && id == Id::LINE)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
688 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
689 t->value = TOKint64v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
690 t->uns64value = loc.linnum;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
691 }
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
692 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
693 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
694 if (id == Id::DATE)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
695 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
696 t->ustring = (unsigned char *)date;
1195
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1165
diff changeset
697 goto Lstr;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
698 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
699 else if (id == Id::TIME)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
700 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
701 t->ustring = (unsigned char *)time;
1195
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1165
diff changeset
702 goto Lstr;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
703 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
704 else if (id == Id::VENDOR)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
705 {
664
eef8ac26c66c Some missed LLVMDC -> LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
706 t->ustring = (unsigned char *)"LDC";
1195
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1165
diff changeset
707 goto Lstr;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
708 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
709 else if (id == Id::TIMESTAMP)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
710 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
711 t->ustring = (unsigned char *)timestamp;
1195
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1165
diff changeset
712 Lstr:
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
713 t->value = TOKstring;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
714 Llen:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
715 t->postfix = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
716 t->len = strlen((char *)t->ustring);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
717 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
718 else if (id == Id::VERSIONX)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
719 { unsigned major = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
720 unsigned minor = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
721
658
50383e476c7e Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 366
diff changeset
722 for (const char *p = global.version + 1; 1; p++)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
723 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
724 char c = *p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
725 if (isdigit(c))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
726 minor = minor * 10 + c - '0';
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
727 else if (c == '.')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
728 { major = minor;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
729 minor = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
730 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
731 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
732 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
733 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
734 t->value = TOKint64v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
735 t->uns64value = major * 1000 + minor;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
736 }
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
737 #if DMDV2
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
738 else if (id == Id::EOFX)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
739 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
740 t->value = TOKeof;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
741 // Advance scanner to end of file
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
742 while (!(*p == 0 || *p == 0x1A))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
743 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
744 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
745 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
746 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
747 //printf("t->value = %d\n",t->value);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
748 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
749 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
750
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
751 case '/':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
752 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
753 switch (*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
754 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
755 case '=':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
756 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
757 t->value = TOKdivass;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
758 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
759
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
760 case '*':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
761 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
762 linnum = loc.linnum;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
763 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
764 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
765 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
766 { unsigned char c = *p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
767 switch (c)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
768 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
769 case '/':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
770 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
771
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
772 case '\n':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
773 loc.linnum++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
774 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
775 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
776
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
777 case '\r':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
778 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
779 if (*p != '\n')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
780 loc.linnum++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
781 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
782
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
783 case 0:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
784 case 0x1A:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
785 error("unterminated /* */ comment");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
786 p = end;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
787 t->value = TOKeof;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
788 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
789
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
790 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
791 if (c & 0x80)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
792 { unsigned u = decodeUTF();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
793 if (u == PS || u == LS)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
794 loc.linnum++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
795 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
796 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
797 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
798 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
799 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
800 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
801 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
802 if (p[-2] == '*' && p - 3 != t->ptr)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
803 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
804 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
805 if (commentToken)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
806 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
807 t->value = TOKcomment;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
808 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
809 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
810 else if (doDocComment && t->ptr[2] == '*' && p - 4 != t->ptr)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
811 { // if /** but not /**/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
812 getDocComment(t, lastLine == linnum);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
813 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
814 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
815
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
816 case '/': // do // style comments
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
817 linnum = loc.linnum;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
818 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
819 { unsigned char c = *++p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
820 switch (c)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
821 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
822 case '\n':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
823 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
824
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
825 case '\r':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
826 if (p[1] == '\n')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
827 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
828 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
829
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
830 case 0:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
831 case 0x1A:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
832 if (commentToken)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
833 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
834 p = end;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
835 t->value = TOKcomment;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
836 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
837 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
838 if (doDocComment && t->ptr[2] == '/')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
839 getDocComment(t, lastLine == linnum);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
840 p = end;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
841 t->value = TOKeof;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
842 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
843
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
844 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
845 if (c & 0x80)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
846 { unsigned u = decodeUTF();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
847 if (u == PS || u == LS)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
848 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
849 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
850 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
851 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
852 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
853 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
854
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
855 if (commentToken)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
856 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
857 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
858 loc.linnum++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
859 t->value = TOKcomment;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
860 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
861 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
862 if (doDocComment && t->ptr[2] == '/')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
863 getDocComment(t, lastLine == linnum);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
864
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
865 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
866 loc.linnum++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
867 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
868
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
869 case '+':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
870 { int nest;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
871
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
872 linnum = loc.linnum;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
873 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
874 nest = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
875 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
876 { unsigned char c = *p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
877 switch (c)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
878 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
879 case '/':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
880 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
881 if (*p == '+')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
882 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
883 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
884 nest++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
885 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
886 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
887
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
888 case '+':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
889 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
890 if (*p == '/')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
891 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
892 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
893 if (--nest == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
894 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
895 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
896 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
897
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
898 case '\r':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
899 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
900 if (*p != '\n')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
901 loc.linnum++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
902 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
903
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
904 case '\n':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
905 loc.linnum++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
906 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
907 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
908
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
909 case 0:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
910 case 0x1A:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
911 error("unterminated /+ +/ comment");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
912 p = end;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
913 t->value = TOKeof;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
914 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
915
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
916 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
917 if (c & 0x80)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
918 { unsigned u = decodeUTF();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
919 if (u == PS || u == LS)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
920 loc.linnum++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
921 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
922 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
923 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
924 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
925 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
926 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
927 if (commentToken)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
928 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
929 t->value = TOKcomment;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
930 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
931 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
932 if (doDocComment && t->ptr[2] == '+' && p - 4 != t->ptr)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
933 { // if /++ but not /++/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
934 getDocComment(t, lastLine == linnum);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
935 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
936 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
937 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
938 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
939 t->value = TOKdiv;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
940 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
941
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
942 case '.':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
943 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
944 if (isdigit(*p))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
945 { /* Note that we don't allow ._1 and ._ as being
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
946 * valid floating point numbers.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
947 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
948 p--;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
949 t->value = inreal(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
950 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
951 else if (p[0] == '.')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
952 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
953 if (p[1] == '.')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
954 { p += 2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
955 t->value = TOKdotdotdot;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
956 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
957 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
958 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
959 t->value = TOKslice;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
960 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
961 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
962 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
963 t->value = TOKdot;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
964 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
965
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
966 case '&':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
967 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
968 if (*p == '=')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
969 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
970 t->value = TOKandass;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
971 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
972 else if (*p == '&')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
973 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
974 t->value = TOKandand;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
975 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
976 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
977 t->value = TOKand;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
978 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
979
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
980 case '|':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
981 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
982 if (*p == '=')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
983 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
984 t->value = TOKorass;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
985 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
986 else if (*p == '|')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
987 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
988 t->value = TOKoror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
989 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
990 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
991 t->value = TOKor;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
992 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
993
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
994 case '-':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
995 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
996 if (*p == '=')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
997 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
998 t->value = TOKminass;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
999 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1000 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1001 else if (*p == '>')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1002 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1003 t->value = TOKarrow;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1004 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1005 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1006 else if (*p == '-')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1007 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1008 t->value = TOKminusminus;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1009 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1010 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1011 t->value = TOKmin;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1012 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1013
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1014 case '+':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1015 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1016 if (*p == '=')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1017 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1018 t->value = TOKaddass;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1019 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1020 else if (*p == '+')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1021 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1022 t->value = TOKplusplus;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1023 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1024 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1025 t->value = TOKadd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1026 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1027
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1028 case '<':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1029 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1030 if (*p == '=')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1031 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1032 t->value = TOKle; // <=
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1033 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1034 else if (*p == '<')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1035 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1036 if (*p == '=')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1037 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1038 t->value = TOKshlass; // <<=
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1039 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1040 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1041 t->value = TOKshl; // <<
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1042 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1043 else if (*p == '>')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1044 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1045 if (*p == '=')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1046 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1047 t->value = TOKleg; // <>=
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1048 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1049 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1050 t->value = TOKlg; // <>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1051 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1052 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1053 t->value = TOKlt; // <
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1054 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1055
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1056 case '>':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1057 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1058 if (*p == '=')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1059 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1060 t->value = TOKge; // >=
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1061 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1062 else if (*p == '>')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1063 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1064 if (*p == '=')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1065 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1066 t->value = TOKshrass; // >>=
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1067 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1068 else if (*p == '>')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1069 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1070 if (*p == '=')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1071 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1072 t->value = TOKushrass; // >>>=
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1073 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1074 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1075 t->value = TOKushr; // >>>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1076 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1077 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1078 t->value = TOKshr; // >>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1079 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1080 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1081 t->value = TOKgt; // >
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1082 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1083
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1084 case '!':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1085 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1086 if (*p == '=')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1087 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1088 if (*p == '=' && global.params.Dversion == 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1089 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1090 t->value = TOKnotidentity; // !==
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1091 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1092 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1093 t->value = TOKnotequal; // !=
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1094 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1095 else if (*p == '<')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1096 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1097 if (*p == '>')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1098 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1099 if (*p == '=')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1100 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1101 t->value = TOKunord; // !<>=
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1102 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1103 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1104 t->value = TOKue; // !<>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1105 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1106 else if (*p == '=')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1107 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1108 t->value = TOKug; // !<=
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1109 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1110 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1111 t->value = TOKuge; // !<
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1112 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1113 else if (*p == '>')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1114 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1115 if (*p == '=')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1116 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1117 t->value = TOKul; // !>=
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1118 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1119 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1120 t->value = TOKule; // !>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1121 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1122 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1123 t->value = TOKnot; // !
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1124 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1125
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1126 case '=':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1127 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1128 if (*p == '=')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1129 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1130 if (*p == '=' && global.params.Dversion == 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1131 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1132 t->value = TOKidentity; // ===
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1133 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1134 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1135 t->value = TOKequal; // ==
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1136 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1137 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1138 t->value = TOKassign; // =
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1139 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1140
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1141 case '~':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1142 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1143 if (*p == '=')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1144 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1145 t->value = TOKcatass; // ~=
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1146 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1147 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1148 t->value = TOKtilde; // ~
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1149 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1150
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1151 #define SINGLE(c,tok) case c: p++; t->value = tok; return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1152
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1153 SINGLE('(', TOKlparen)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1154 SINGLE(')', TOKrparen)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1155 SINGLE('[', TOKlbracket)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1156 SINGLE(']', TOKrbracket)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1157 SINGLE('{', TOKlcurly)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1158 SINGLE('}', TOKrcurly)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1159 SINGLE('?', TOKquestion)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1160 SINGLE(',', TOKcomma)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1161 SINGLE(';', TOKsemicolon)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1162 SINGLE(':', TOKcolon)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1163 SINGLE('$', TOKdollar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1164
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1165 #undef SINGLE
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1166
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1167 #define DOUBLE(c1,tok1,c2,tok2) \
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1168 case c1: \
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1169 p++; \
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1170 if (*p == c2) \
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1171 { p++; \
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1172 t->value = tok2; \
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1173 } \
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1174 else \
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1175 t->value = tok1; \
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1176 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1177
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1178 DOUBLE('*', TOKmul, '=', TOKmulass)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1179 DOUBLE('%', TOKmod, '=', TOKmodass)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1180 DOUBLE('^', TOKxor, '=', TOKxorass)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1181
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1182 #undef DOUBLE
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1183
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1184 case '#':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1185 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1186 pragma();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1187 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1188
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1189 default:
1614
dbf7b54f542f Merge DMD r292: bugzilla 3455 Some Unicode characters not allowed...
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
1190 { unsigned c = *p;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1191
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1192 if (c & 0x80)
1614
dbf7b54f542f Merge DMD r292: bugzilla 3455 Some Unicode characters not allowed...
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
1193 { c = decodeUTF();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1194
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1195 // Check for start of unicode identifier
1614
dbf7b54f542f Merge DMD r292: bugzilla 3455 Some Unicode characters not allowed...
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
1196 if (isUniAlpha(c))
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1197 goto case_ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1198
1614
dbf7b54f542f Merge DMD r292: bugzilla 3455 Some Unicode characters not allowed...
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
1199 if (c == PS || c == LS)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1200 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1201 loc.linnum++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1202 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1203 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1204 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1205 }
1614
dbf7b54f542f Merge DMD r292: bugzilla 3455 Some Unicode characters not allowed...
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
1206 if (c < 0x80 && isprint(c))
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1207 error("unsupported char '%c'", c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1208 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1209 error("unsupported char 0x%02x", c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1210 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1211 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1212 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1213 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1214 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1215 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1216
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1217 /*******************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1218 * Parse escape sequence.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1219 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1220
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1221 unsigned Lexer::escapeSequence()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1222 { unsigned c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1223 int n;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1224 int ndigits;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1225
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1226 c = *p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1227 switch (c)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1228 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1229 case '\'':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1230 case '"':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1231 case '?':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1232 case '\\':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1233 Lconsume:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1234 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1235 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1236
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1237 case 'a': c = 7; goto Lconsume;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1238 case 'b': c = 8; goto Lconsume;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1239 case 'f': c = 12; goto Lconsume;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1240 case 'n': c = 10; goto Lconsume;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1241 case 'r': c = 13; goto Lconsume;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1242 case 't': c = 9; goto Lconsume;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1243 case 'v': c = 11; goto Lconsume;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1244
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1245 case 'u':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1246 ndigits = 4;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1247 goto Lhex;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1248 case 'U':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1249 ndigits = 8;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1250 goto Lhex;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1251 case 'x':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1252 ndigits = 2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1253 Lhex:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1254 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1255 c = *p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1256 if (ishex(c))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1257 { unsigned v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1258
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1259 n = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1260 v = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1261 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1262 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1263 if (isdigit(c))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1264 c -= '0';
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1265 else if (islower(c))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1266 c -= 'a' - 10;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1267 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1268 c -= 'A' - 10;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1269 v = v * 16 + c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1270 c = *++p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1271 if (++n == ndigits)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1272 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1273 if (!ishex(c))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1274 { error("escape hex sequence has %d hex digits instead of %d", n, ndigits);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1275 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1276 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1277 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1278 if (ndigits != 2 && !utf_isValidDchar(v))
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1431
diff changeset
1279 { error("invalid UTF character \\U%08x", v);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1431
diff changeset
1280 v = '?'; // recover with valid UTF character
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1431
diff changeset
1281 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1282 c = v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1283 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1284 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1285 error("undefined escape hex sequence \\%c\n",c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1286 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1287
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1288 case '&': // named character entity
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1289 for (unsigned char *idstart = ++p; 1; p++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1290 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1291 switch (*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1292 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1293 case ';':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1294 c = HtmlNamedEntity(idstart, p - idstart);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1295 if (c == ~0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1296 { error("unnamed character entity &%.*s;", (int)(p - idstart), idstart);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1297 c = ' ';
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1298 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1299 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1300 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1301
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1302 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1303 if (isalpha(*p) ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1304 (p != idstart + 1 && isdigit(*p)))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1305 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1306 error("unterminated named entity");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1307 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1308 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1309 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1310 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1311 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1312
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1313 case 0:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1314 case 0x1A: // end of file
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1315 c = '\\';
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1316 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1317
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1318 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1319 if (isoctal(c))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1320 { unsigned v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1321
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1322 n = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1323 v = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1324 do
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1325 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1326 v = v * 8 + (c - '0');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1327 c = *++p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1328 } while (++n < 3 && isoctal(c));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1329 c = v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1330 if (c > 0xFF)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1331 error("0%03o is larger than a byte", c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1332 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1333 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1334 error("undefined escape sequence \\%c\n",c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1335 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1336 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1337 return c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1338 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1339
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1340 /**************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1341 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1342
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1343 TOK Lexer::wysiwygStringConstant(Token *t, int tc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1344 { unsigned c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1345 Loc start = loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1346
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1347 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1348 stringbuffer.reset();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1349 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1350 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1351 c = *p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1352 switch (c)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1353 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1354 case '\n':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1355 loc.linnum++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1356 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1357
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1358 case '\r':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1359 if (*p == '\n')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1360 continue; // ignore
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1361 c = '\n'; // treat EndOfLine as \n character
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1362 loc.linnum++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1363 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1364
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1365 case 0:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1366 case 0x1A:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1367 error("unterminated string constant starting at %s", start.toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1368 t->ustring = (unsigned char *)"";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1369 t->len = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1370 t->postfix = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1371 return TOKstring;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1372
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1373 case '"':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1374 case '`':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1375 if (c == tc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1376 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1377 t->len = stringbuffer.offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1378 stringbuffer.writeByte(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1379 t->ustring = (unsigned char *)mem.malloc(stringbuffer.offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1380 memcpy(t->ustring, stringbuffer.data, stringbuffer.offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1381 stringPostfix(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1382 return TOKstring;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1383 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1384 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1385
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1386 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1387 if (c & 0x80)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1388 { p--;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1389 unsigned u = decodeUTF();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1390 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1391 if (u == PS || u == LS)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1392 loc.linnum++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1393 stringbuffer.writeUTF8(u);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1394 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1395 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1396 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1397 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1398 stringbuffer.writeByte(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1399 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1400 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1401
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1402 /**************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1403 * Lex hex strings:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1404 * x"0A ae 34FE BD"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1405 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1406
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1407 TOK Lexer::hexStringConstant(Token *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1408 { unsigned c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1409 Loc start = loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1410 unsigned n = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1411 unsigned v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1412
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1413 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1414 stringbuffer.reset();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1415 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1416 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1417 c = *p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1418 switch (c)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1419 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1420 case ' ':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1421 case '\t':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1422 case '\v':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1423 case '\f':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1424 continue; // skip white space
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1425
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1426 case '\r':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1427 if (*p == '\n')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1428 continue; // ignore
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1429 // Treat isolated '\r' as if it were a '\n'
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1430 case '\n':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1431 loc.linnum++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1432 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1433
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1434 case 0:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1435 case 0x1A:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1436 error("unterminated string constant starting at %s", start.toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1437 t->ustring = (unsigned char *)"";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1438 t->len = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1439 t->postfix = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1440 return TOKstring;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1441
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1442 case '"':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1443 if (n & 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1444 { error("odd number (%d) of hex characters in hex string", n);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1445 stringbuffer.writeByte(v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1446 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1447 t->len = stringbuffer.offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1448 stringbuffer.writeByte(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1449 t->ustring = (unsigned char *)mem.malloc(stringbuffer.offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1450 memcpy(t->ustring, stringbuffer.data, stringbuffer.offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1451 stringPostfix(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1452 return TOKstring;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1453
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1454 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1455 if (c >= '0' && c <= '9')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1456 c -= '0';
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1457 else if (c >= 'a' && c <= 'f')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1458 c -= 'a' - 10;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1459 else if (c >= 'A' && c <= 'F')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1460 c -= 'A' - 10;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1461 else if (c & 0x80)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1462 { p--;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1463 unsigned u = decodeUTF();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1464 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1465 if (u == PS || u == LS)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1466 loc.linnum++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1467 else
1614
dbf7b54f542f Merge DMD r292: bugzilla 3455 Some Unicode characters not allowed...
Leandro Lucarella <llucax@gmail.com>
parents: 1603
diff changeset
1468 error("non-hex character \\u%04x", u);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1469 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1470 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1471 error("non-hex character '%c'", c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1472 if (n & 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1473 { v = (v << 4) | c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1474 stringbuffer.writeByte(v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1475 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1476 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1477 v = c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1478 n++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1479 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1480 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1481 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1482 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1483
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1484
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1485 #if DMDV2
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1486 /**************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1487 * Lex delimited strings:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1488 * q"(foo(xxx))" // "foo(xxx)"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1489 * q"[foo(]" // "foo("
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1490 * q"/foo]/" // "foo]"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1491 * q"HERE
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1492 * foo
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1493 * HERE" // "foo\n"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1494 * Input:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1495 * p is on the "
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1496 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1497
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1498 TOK Lexer::delimitedStringConstant(Token *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1499 { unsigned c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1500 Loc start = loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1501 unsigned delimleft = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1502 unsigned delimright = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1503 unsigned nest = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1504 unsigned nestcount;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1505 Identifier *hereid = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1506 unsigned blankrol = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1507 unsigned startline = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1508
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1509 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1510 stringbuffer.reset();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1511 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1512 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1513 c = *p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1514 //printf("c = '%c'\n", c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1515 switch (c)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1516 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1517 case '\n':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1518 Lnextline:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1519 loc.linnum++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1520 startline = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1521 if (blankrol)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1522 { blankrol = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1523 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1524 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1525 if (hereid)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1526 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1527 stringbuffer.writeUTF8(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1528 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1529 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1530 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1531
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1532 case '\r':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1533 if (*p == '\n')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1534 continue; // ignore
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1535 c = '\n'; // treat EndOfLine as \n character
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1536 goto Lnextline;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1537
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1538 case 0:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1539 case 0x1A:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1540 goto Lerror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1541
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1542 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1543 if (c & 0x80)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1544 { p--;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1545 c = decodeUTF();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1546 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1547 if (c == PS || c == LS)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1548 goto Lnextline;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1549 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1550 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1551 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1552 if (delimleft == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1553 { delimleft = c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1554 nest = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1555 nestcount = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1556 if (c == '(')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1557 delimright = ')';
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1558 else if (c == '{')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1559 delimright = '}';
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1560 else if (c == '[')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1561 delimright = ']';
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1562 else if (c == '<')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1563 delimright = '>';
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1564 else if (isalpha(c) || c == '_' || (c >= 0x80 && isUniAlpha(c)))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1565 { // Start of identifier; must be a heredoc
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1566 Token t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1567 p--;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1568 scan(&t); // read in heredoc identifier
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1569 if (t.value != TOKidentifier)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1570 { error("identifier expected for heredoc, not %s", t.toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1571 delimright = c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1572 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1573 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1574 { hereid = t.ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1575 //printf("hereid = '%s'\n", hereid->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1576 blankrol = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1577 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1578 nest = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1579 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1580 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1581 { delimright = c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1582 nest = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1583 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1584 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1585 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1586 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1587 if (blankrol)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1588 { error("heredoc rest of line should be blank");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1589 blankrol = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1590 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1591 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1592 if (nest == 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1593 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1594 if (c == delimleft)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1595 nestcount++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1596 else if (c == delimright)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1597 { nestcount--;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1598 if (nestcount == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1599 goto Ldone;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1600 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1601 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1602 else if (c == delimright)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1603 goto Ldone;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1604 if (startline && isalpha(c))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1605 { Token t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1606 unsigned char *psave = p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1607 p--;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1608 scan(&t); // read in possible heredoc identifier
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1609 //printf("endid = '%s'\n", t.ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1610 if (t.value == TOKidentifier && t.ident->equals(hereid))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1611 { /* should check that rest of line is blank
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1612 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1613 goto Ldone;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1614 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1615 p = psave;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1616 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1617 stringbuffer.writeUTF8(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1618 startline = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1619 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1620 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1621
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1622 Ldone:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1623 if (*p == '"')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1624 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1625 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1626 error("delimited string must end in %c\"", delimright);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1627 t->len = stringbuffer.offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1628 stringbuffer.writeByte(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1629 t->ustring = (unsigned char *)mem.malloc(stringbuffer.offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1630 memcpy(t->ustring, stringbuffer.data, stringbuffer.offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1631 stringPostfix(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1632 return TOKstring;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1633
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1634 Lerror:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1635 error("unterminated string constant starting at %s", start.toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1636 t->ustring = (unsigned char *)"";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1637 t->len = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1638 t->postfix = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1639 return TOKstring;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1640 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1641
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1642 /**************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1643 * Lex delimited strings:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1644 * q{ foo(xxx) } // " foo(xxx) "
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1645 * q{foo(} // "foo("
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1646 * q{{foo}"}"} // "{foo}"}""
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1647 * Input:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1648 * p is on the q
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1649 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1650
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1651 TOK Lexer::tokenStringConstant(Token *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1652 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1653 unsigned nest = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1654 Loc start = loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1655 unsigned char *pstart = ++p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1656
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1657 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1658 { Token tok;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1659
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1660 scan(&tok);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1661 switch (tok.value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1662 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1663 case TOKlcurly:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1664 nest++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1665 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1666
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1667 case TOKrcurly:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1668 if (--nest == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1669 goto Ldone;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1670 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1671
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1672 case TOKeof:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1673 goto Lerror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1674
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1675 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1676 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1677 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1678 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1679
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1680 Ldone:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1681 t->len = p - 1 - pstart;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1682 t->ustring = (unsigned char *)mem.malloc(t->len + 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1683 memcpy(t->ustring, pstart, t->len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1684 t->ustring[t->len] = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1685 stringPostfix(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1686 return TOKstring;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1687
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1688 Lerror:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1689 error("unterminated token string constant starting at %s", start.toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1690 t->ustring = (unsigned char *)"";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1691 t->len = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1692 t->postfix = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1693 return TOKstring;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1694 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1695
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1696 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1697
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1698
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1699 /**************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1700 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1701
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1702 TOK Lexer::escapeStringConstant(Token *t, int wide)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1703 { unsigned c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1704 Loc start = loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1705
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1706 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1707 stringbuffer.reset();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1708 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1709 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1710 c = *p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1711 switch (c)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1712 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1713 case '\\':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1714 switch (*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1715 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1716 case 'u':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1717 case 'U':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1718 case '&':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1719 c = escapeSequence();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1720 stringbuffer.writeUTF8(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1721 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1722
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1723 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1724 c = escapeSequence();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1725 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1726 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1727 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1728
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1729 case '\n':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1730 loc.linnum++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1731 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1732
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1733 case '\r':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1734 if (*p == '\n')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1735 continue; // ignore
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1736 c = '\n'; // treat EndOfLine as \n character
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1737 loc.linnum++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1738 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1739
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1740 case '"':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1741 t->len = stringbuffer.offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1742 stringbuffer.writeByte(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1743 t->ustring = (unsigned char *)mem.malloc(stringbuffer.offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1744 memcpy(t->ustring, stringbuffer.data, stringbuffer.offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1745 stringPostfix(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1746 return TOKstring;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1747
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1748 case 0:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1749 case 0x1A:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1750 p--;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1751 error("unterminated string constant starting at %s", start.toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1752 t->ustring = (unsigned char *)"";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1753 t->len = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1754 t->postfix = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1755 return TOKstring;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1756
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1757 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1758 if (c & 0x80)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1759 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1760 p--;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1761 c = decodeUTF();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1762 if (c == LS || c == PS)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1763 { c = '\n';
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1764 loc.linnum++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1765 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1766 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1767 stringbuffer.writeUTF8(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1768 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1769 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1770 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1771 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1772 stringbuffer.writeByte(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1773 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1774 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1775
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1776 /**************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1777 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1778
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1779 TOK Lexer::charConstant(Token *t, int wide)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1780 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1781 unsigned c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1782 TOK tk = TOKcharv;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1783
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1784 //printf("Lexer::charConstant\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1785 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1786 c = *p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1787 switch (c)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1788 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1789 case '\\':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1790 switch (*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1791 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1792 case 'u':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1793 t->uns64value = escapeSequence();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1794 tk = TOKwcharv;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1795 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1796
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1797 case 'U':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1798 case '&':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1799 t->uns64value = escapeSequence();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1800 tk = TOKdcharv;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1801 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1802
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1803 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1804 t->uns64value = escapeSequence();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1805 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1806 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1807 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1808
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1809 case '\n':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1810 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1811 loc.linnum++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1812 case '\r':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1813 case 0:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1814 case 0x1A:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1815 case '\'':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1816 error("unterminated character constant");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1817 return tk;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1818
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1819 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1820 if (c & 0x80)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1821 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1822 p--;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1823 c = decodeUTF();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1824 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1825 if (c == LS || c == PS)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1826 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1827 if (c < 0xD800 || (c >= 0xE000 && c < 0xFFFE))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1828 tk = TOKwcharv;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1829 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1830 tk = TOKdcharv;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1831 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1832 t->uns64value = c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1833 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1834 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1835
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1836 if (*p != '\'')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1837 { error("unterminated character constant");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1838 return tk;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1839 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1840 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1841 return tk;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1842 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1843
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1844 /***************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1845 * Get postfix of string literal.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1846 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1847
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1848 void Lexer::stringPostfix(Token *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1849 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1850 switch (*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1851 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1852 case 'c':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1853 case 'w':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1854 case 'd':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1855 t->postfix = *p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1856 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1857 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1858
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1859 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1860 t->postfix = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1861 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1862 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1863 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1864
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1865 /***************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1866 * Read \u or \U unicode sequence
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1867 * Input:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1868 * u 'u' or 'U'
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1869 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1870
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1871 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1872 unsigned Lexer::wchar(unsigned u)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1873 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1874 unsigned value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1875 unsigned n;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1876 unsigned char c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1877 unsigned nchars;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1878
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1879 nchars = (u == 'U') ? 8 : 4;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1880 value = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1881 for (n = 0; 1; n++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1882 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1883 ++p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1884 if (n == nchars)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1885 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1886 c = *p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1887 if (!ishex(c))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1888 { error("\\%c sequence must be followed by %d hex characters", u, nchars);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1889 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1890 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1891 if (isdigit(c))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1892 c -= '0';
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1893 else if (islower(c))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1894 c -= 'a' - 10;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1895 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1896 c -= 'A' - 10;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1897 value <<= 4;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1898 value |= c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1899 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1900 return value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1901 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1902 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1903
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1904 /**************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1905 * Read in a number.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1906 * If it's an integer, store it in tok.TKutok.Vlong.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1907 * integers can be decimal, octal or hex
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1908 * Handle the suffixes U, UL, LU, L, etc.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1909 * If it's double, store it in tok.TKutok.Vdouble.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1910 * Returns:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1911 * TKnum
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1912 * TKdouble,...
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1913 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1914
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1915 TOK Lexer::number(Token *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1916 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1917 // We use a state machine to collect numbers
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1918 enum STATE { STATE_initial, STATE_0, STATE_decimal, STATE_octal, STATE_octale,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1919 STATE_hex, STATE_binary, STATE_hex0, STATE_binary0,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1920 STATE_hexh, STATE_error };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1921 enum STATE state;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1922
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1923 enum FLAGS
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1924 { FLAGS_decimal = 1, // decimal
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1925 FLAGS_unsigned = 2, // u or U suffix
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1926 FLAGS_long = 4, // l or L suffix
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1927 };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1928 enum FLAGS flags = FLAGS_decimal;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1929
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1930 int i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1931 int base;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1932 unsigned c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1933 unsigned char *start;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1934 TOK result;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1935
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1936 //printf("Lexer::number()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1937 state = STATE_initial;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1938 base = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1939 stringbuffer.reset();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1940 start = p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1941 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1942 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1943 c = *p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1944 switch (state)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1945 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1946 case STATE_initial: // opening state
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1947 if (c == '0')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1948 state = STATE_0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1949 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1950 state = STATE_decimal;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1951 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1952
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1953 case STATE_0:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1954 flags = (FLAGS) (flags & ~FLAGS_decimal);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1955 switch (c)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1956 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1957 #if ZEROH
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1958 case 'H': // 0h
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1959 case 'h':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1960 goto hexh;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1961 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1962 case 'X':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1963 case 'x':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1964 state = STATE_hex0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1965 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1966
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1967 case '.':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1968 if (p[1] == '.') // .. is a separate token
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1969 goto done;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1970 case 'i':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1971 case 'f':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1972 case 'F':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1973 goto real;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1974 #if ZEROH
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1975 case 'E':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1976 case 'e':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1977 goto case_hex;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1978 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1979 case 'B':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1980 case 'b':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1981 state = STATE_binary0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1982 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1983
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1984 case '0': case '1': case '2': case '3':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1985 case '4': case '5': case '6': case '7':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1986 state = STATE_octal;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1987 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1988
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1989 #if ZEROH
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1990 case '8': case '9': case 'A':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1991 case 'C': case 'D': case 'F':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1992 case 'a': case 'c': case 'd': case 'f':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1993 case_hex:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1994 state = STATE_hexh;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1995 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1996 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1997 case '_':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1998 state = STATE_octal;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1999 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2000 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2001
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2002 case 'L':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2003 if (p[1] == 'i')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2004 goto real;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2005 goto done;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2006
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2007 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2008 goto done;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2009 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2010 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2011
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2012 case STATE_decimal: // reading decimal number
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2013 if (!isdigit(c))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2014 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2015 #if ZEROH
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2016 if (ishex(c)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2017 || c == 'H' || c == 'h'
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2018 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2019 goto hexh;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2020 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2021 if (c == '_') // ignore embedded _
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2022 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2023 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2024 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2025 if (c == '.' && p[1] != '.')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2026 goto real;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2027 else if (c == 'i' || c == 'f' || c == 'F' ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2028 c == 'e' || c == 'E')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2029 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2030 real: // It's a real number. Back up and rescan as a real
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2031 p = start;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2032 return inreal(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2033 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2034 else if (c == 'L' && p[1] == 'i')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2035 goto real;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2036 goto done;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2037 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2038 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2039
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2040 case STATE_hex0: // reading hex number
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2041 case STATE_hex:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2042 if (!ishex(c))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2043 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2044 if (c == '_') // ignore embedded _
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2045 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2046 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2047 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2048 if (c == '.' && p[1] != '.')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2049 goto real;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2050 if (c == 'P' || c == 'p' || c == 'i')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2051 goto real;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2052 if (state == STATE_hex0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2053 error("Hex digit expected, not '%c'", c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2054 goto done;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2055 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2056 state = STATE_hex;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2057 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2058
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2059 #if ZEROH
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2060 hexh:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2061 state = STATE_hexh;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2062 case STATE_hexh: // parse numbers like 0FFh
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2063 if (!ishex(c))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2064 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2065 if (c == 'H' || c == 'h')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2066 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2067 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2068 base = 16;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2069 goto done;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2070 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2071 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2072 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2073 // Check for something like 1E3 or 0E24
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2074 if (memchr((char *)stringbuffer.data, 'E', stringbuffer.offset) ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2075 memchr((char *)stringbuffer.data, 'e', stringbuffer.offset))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2076 goto real;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2077 error("Hex digit expected, not '%c'", c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2078 goto done;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2079 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2080 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2081 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2082 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2083
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2084 case STATE_octal: // reading octal number
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2085 case STATE_octale: // reading octal number with non-octal digits
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2086 if (!isoctal(c))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2087 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2088 #if ZEROH
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2089 if (ishex(c)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2090 || c == 'H' || c == 'h'
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2091 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2092 goto hexh;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2093 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2094 if (c == '_') // ignore embedded _
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2095 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2096 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2097 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2098 if (c == '.' && p[1] != '.')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2099 goto real;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2100 if (c == 'i')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2101 goto real;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2102 if (isdigit(c))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2103 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2104 state = STATE_octale;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2105 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2106 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2107 goto done;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2108 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2109 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2110
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2111 case STATE_binary0: // starting binary number
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2112 case STATE_binary: // reading binary number
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2113 if (c != '0' && c != '1')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2114 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2115 #if ZEROH
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2116 if (ishex(c)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2117 || c == 'H' || c == 'h'
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2118 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2119 goto hexh;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2120 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2121 if (c == '_') // ignore embedded _
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2122 { p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2123 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2124 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2125 if (state == STATE_binary0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2126 { error("binary digit expected");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2127 state = STATE_error;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2128 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2129 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2130 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2131 goto done;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2132 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2133 state = STATE_binary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2134 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2135
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2136 case STATE_error: // for error recovery
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2137 if (!isdigit(c)) // scan until non-digit
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2138 goto done;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2139 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2140
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2141 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2142 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2143 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2144 stringbuffer.writeByte(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2145 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2146 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2147 done:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2148 stringbuffer.writeByte(0); // terminate string
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2149 if (state == STATE_octale)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2150 error("Octal digit expected");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2151
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2152 uinteger_t n; // unsigned >=64 bit integer type
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2153
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2154 if (stringbuffer.offset == 2 && (state == STATE_decimal || state == STATE_0))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2155 n = stringbuffer.data[0] - '0';
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2156 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2157 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2158 // Convert string to integer
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2159 #if __DMC__
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2160 errno = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2161 n = strtoull((char *)stringbuffer.data,NULL,base);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2162 if (errno == ERANGE)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2163 error("integer overflow");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2164 #else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2165 // Not everybody implements strtoull()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2166 char *p = (char *)stringbuffer.data;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2167 int r = 10, d;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2168
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2169 if (*p == '0')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2170 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2171 if (p[1] == 'x' || p[1] == 'X')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2172 p += 2, r = 16;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2173 else if (p[1] == 'b' || p[1] == 'B')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2174 p += 2, r = 2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2175 else if (isdigit(p[1]))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2176 p += 1, r = 8;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2177 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2178
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2179 n = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2180 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2181 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2182 if (*p >= '0' && *p <= '9')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2183 d = *p - '0';
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2184 else if (*p >= 'a' && *p <= 'z')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2185 d = *p - 'a' + 10;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2186 else if (*p >= 'A' && *p <= 'Z')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2187 d = *p - 'A' + 10;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2188 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2189 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2190 if (d >= r)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2191 break;
658
50383e476c7e Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 366
diff changeset
2192 uinteger_t n2 = n * r;
50383e476c7e Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 366
diff changeset
2193 //printf("n2 / r = %llx, n = %llx\n", n2/r, n);
50383e476c7e Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 366
diff changeset
2194 if (n2 / r != n || n2 + d < n)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2195 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2196 error ("integer overflow");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2197 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2198 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2199
658
50383e476c7e Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 366
diff changeset
2200 n = n2 + d;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2201 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2202 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2203 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2204 if (sizeof(n) > 8 &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2205 n > 0xFFFFFFFFFFFFFFFFULL) // if n needs more than 64 bits
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2206 error("integer overflow");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2207 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2208
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2209 // Parse trailing 'u', 'U', 'l' or 'L' in any combination
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2210 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2211 { unsigned char f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2212
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2213 switch (*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2214 { case 'U':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2215 case 'u':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2216 f = FLAGS_unsigned;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2217 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2218
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2219 case 'l':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2220 if (1 || !global.params.useDeprecated)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2221 error("'l' suffix is deprecated, use 'L' instead");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2222 case 'L':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2223 f = FLAGS_long;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2224 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2225 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2226 if (flags & f)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2227 error("unrecognized token");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2228 flags = (FLAGS) (flags | f);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2229 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2230 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2231 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2232 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2233 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2234 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2235
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2236 switch (flags)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2237 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2238 case 0:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2239 /* Octal or Hexadecimal constant.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2240 * First that fits: int, uint, long, ulong
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2241 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2242 if (n & 0x8000000000000000LL)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2243 result = TOKuns64v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2244 else if (n & 0xFFFFFFFF00000000LL)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2245 result = TOKint64v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2246 else if (n & 0x80000000)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2247 result = TOKuns32v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2248 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2249 result = TOKint32v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2250 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2251
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2252 case FLAGS_decimal:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2253 /* First that fits: int, long, long long
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2254 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2255 if (n & 0x8000000000000000LL)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2256 { error("signed integer overflow");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2257 result = TOKuns64v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2258 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2259 else if (n & 0xFFFFFFFF80000000LL)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2260 result = TOKint64v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2261 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2262 result = TOKint32v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2263 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2264
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2265 case FLAGS_unsigned:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2266 case FLAGS_decimal | FLAGS_unsigned:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2267 /* First that fits: uint, ulong
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2268 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2269 if (n & 0xFFFFFFFF00000000LL)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2270 result = TOKuns64v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2271 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2272 result = TOKuns32v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2273 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2274
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2275 case FLAGS_decimal | FLAGS_long:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2276 if (n & 0x8000000000000000LL)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2277 { error("signed integer overflow");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2278 result = TOKuns64v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2279 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2280 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2281 result = TOKint64v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2282 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2283
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2284 case FLAGS_long:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2285 if (n & 0x8000000000000000LL)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2286 result = TOKuns64v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2287 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2288 result = TOKint64v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2289 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2290
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2291 case FLAGS_unsigned | FLAGS_long:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2292 case FLAGS_decimal | FLAGS_unsigned | FLAGS_long:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2293 result = TOKuns64v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2294 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2295
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2296 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2297 #ifdef DEBUG
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2298 printf("%x\n",flags);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2299 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2300 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2301 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2302 t->uns64value = n;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2303 return result;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2304 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2305
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2306 /**************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2307 * Read in characters, converting them to real.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2308 * Bugs:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2309 * Exponent overflow not detected.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2310 * Too much requested precision is not detected.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2311 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2312
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2313 TOK Lexer::inreal(Token *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2314 #ifdef __DMC__
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2315 __in
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2316 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2317 assert(*p == '.' || isdigit(*p));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2318 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2319 __out (result)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2320 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2321 switch (result)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2322 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2323 case TOKfloat32v:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2324 case TOKfloat64v:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2325 case TOKfloat80v:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2326 case TOKimaginary32v:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2327 case TOKimaginary64v:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2328 case TOKimaginary80v:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2329 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2330
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2331 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2332 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2333 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2334 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2335 __body
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2336 #endif /* __DMC__ */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2337 { int dblstate;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2338 unsigned c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2339 char hex; // is this a hexadecimal-floating-constant?
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2340 TOK result;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2341
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2342 //printf("Lexer::inreal()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2343 stringbuffer.reset();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2344 dblstate = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2345 hex = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2346 Lnext:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2347 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2348 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2349 // Get next char from input
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2350 c = *p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2351 //printf("dblstate = %d, c = '%c'\n", dblstate, c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2352 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2353 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2354 switch (dblstate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2355 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2356 case 0: // opening state
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2357 if (c == '0')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2358 dblstate = 9;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2359 else if (c == '.')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2360 dblstate = 3;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2361 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2362 dblstate = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2363 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2364
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2365 case 9:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2366 dblstate = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2367 if (c == 'X' || c == 'x')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2368 { hex++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2369 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2370 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2371 case 1: // digits to left of .
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2372 case 3: // digits to right of .
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2373 case 7: // continuing exponent digits
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2374 if (!isdigit(c) && !(hex && isxdigit(c)))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2375 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2376 if (c == '_')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2377 goto Lnext; // ignore embedded '_'
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2378 dblstate++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2379 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2380 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2381 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2382
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2383 case 2: // no more digits to left of .
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2384 if (c == '.')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2385 { dblstate++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2386 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2387 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2388 case 4: // no more digits to right of .
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2389 if ((c == 'E' || c == 'e') ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2390 hex && (c == 'P' || c == 'p'))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2391 { dblstate = 5;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2392 hex = 0; // exponent is always decimal
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2393 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2394 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2395 if (hex)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2396 error("binary-exponent-part required");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2397 goto done;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2398
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2399 case 5: // looking immediately to right of E
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2400 dblstate++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2401 if (c == '-' || c == '+')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2402 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2403 case 6: // 1st exponent digit expected
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2404 if (!isdigit(c))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2405 error("exponent expected");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2406 dblstate++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2407 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2408
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2409 case 8: // past end of exponent digits
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2410 goto done;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2411 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2412 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2413 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2414 stringbuffer.writeByte(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2415 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2416 done:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2417 p--;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2418
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2419 stringbuffer.writeByte(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2420
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2421 #if _WIN32 && __DMC__
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2422 char *save = __locale_decpoint;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2423 __locale_decpoint = ".";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2424 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2425 #ifdef IN_GCC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2426 t->float80value = real_t::parse((char *)stringbuffer.data, real_t::LongDouble);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2427 #else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2428 t->float80value = strtold((char *)stringbuffer.data, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2429 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2430 errno = 0;
696
48f462341528 Fix issues with gradual underflow and strtof, strtod on Mac.
Christian Kamm <kamm incasoftware de>
parents: 664
diff changeset
2431 float strtofres;
48f462341528 Fix issues with gradual underflow and strtof, strtod on Mac.
Christian Kamm <kamm incasoftware de>
parents: 664
diff changeset
2432 double strtodres;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2433 switch (*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2434 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2435 case 'F':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2436 case 'f':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2437 #ifdef IN_GCC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2438 real_t::parse((char *)stringbuffer.data, real_t::Float);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2439 #else
696
48f462341528 Fix issues with gradual underflow and strtof, strtod on Mac.
Christian Kamm <kamm incasoftware de>
parents: 664
diff changeset
2440 strtofres = strtof((char *)stringbuffer.data, NULL);
48f462341528 Fix issues with gradual underflow and strtof, strtod on Mac.
Christian Kamm <kamm incasoftware de>
parents: 664
diff changeset
2441 // LDC change: don't error on gradual underflow
48f462341528 Fix issues with gradual underflow and strtof, strtod on Mac.
Christian Kamm <kamm incasoftware de>
parents: 664
diff changeset
2442 if (errno == ERANGE &&
48f462341528 Fix issues with gradual underflow and strtof, strtod on Mac.
Christian Kamm <kamm incasoftware de>
parents: 664
diff changeset
2443 strtofres != 0 && strtofres != HUGE_VALF && strtofres != -HUGE_VALF)
48f462341528 Fix issues with gradual underflow and strtof, strtod on Mac.
Christian Kamm <kamm incasoftware de>
parents: 664
diff changeset
2444 errno = 0;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2445 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2446 result = TOKfloat32v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2447 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2448 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2449
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2450 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2451 #ifdef IN_GCC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2452 real_t::parse((char *)stringbuffer.data, real_t::Double);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2453 #else
696
48f462341528 Fix issues with gradual underflow and strtof, strtod on Mac.
Christian Kamm <kamm incasoftware de>
parents: 664
diff changeset
2454 strtodres = strtod((char *)stringbuffer.data, NULL);
48f462341528 Fix issues with gradual underflow and strtof, strtod on Mac.
Christian Kamm <kamm incasoftware de>
parents: 664
diff changeset
2455 // LDC change: don't error on gradual underflow
48f462341528 Fix issues with gradual underflow and strtof, strtod on Mac.
Christian Kamm <kamm incasoftware de>
parents: 664
diff changeset
2456 if (errno == ERANGE &&
48f462341528 Fix issues with gradual underflow and strtof, strtod on Mac.
Christian Kamm <kamm incasoftware de>
parents: 664
diff changeset
2457 strtodres != 0 && strtodres != HUGE_VAL && strtodres != -HUGE_VAL)
48f462341528 Fix issues with gradual underflow and strtof, strtod on Mac.
Christian Kamm <kamm incasoftware de>
parents: 664
diff changeset
2458 errno = 0;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2459 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2460 result = TOKfloat64v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2461 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2462
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2463 case 'l':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2464 if (!global.params.useDeprecated)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2465 error("'l' suffix is deprecated, use 'L' instead");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2466 case 'L':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2467 result = TOKfloat80v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2468 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2469 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2470 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2471 if (*p == 'i' || *p == 'I')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2472 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2473 if (!global.params.useDeprecated && *p == 'I')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2474 error("'I' suffix is deprecated, use 'i' instead");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2475 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2476 switch (result)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2477 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2478 case TOKfloat32v:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2479 result = TOKimaginary32v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2480 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2481 case TOKfloat64v:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2482 result = TOKimaginary64v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2483 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2484 case TOKfloat80v:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2485 result = TOKimaginary80v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2486 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2487 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2488 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2489 #if _WIN32 && __DMC__
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2490 __locale_decpoint = save;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2491 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2492 if (errno == ERANGE)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2493 error("number is not representable");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2494 return result;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2495 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2496
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2497 /*********************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2498 * Do pragma.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2499 * Currently, the only pragma supported is:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2500 * #line linnum [filespec]
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2501 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2502
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2503 void Lexer::pragma()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2504 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2505 Token tok;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2506 int linnum;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2507 char *filespec = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2508 Loc loc = this->loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2509
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2510 scan(&tok);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2511 if (tok.value != TOKidentifier || tok.ident != Id::line)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2512 goto Lerr;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2513
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2514 scan(&tok);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2515 if (tok.value == TOKint32v || tok.value == TOKint64v)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2516 linnum = tok.uns64value - 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2517 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2518 goto Lerr;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2519
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2520 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2521 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2522 switch (*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2523 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2524 case 0:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2525 case 0x1A:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2526 case '\n':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2527 Lnewline:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2528 this->loc.linnum = linnum;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2529 if (filespec)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2530 this->loc.filename = filespec;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2531 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2532
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2533 case '\r':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2534 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2535 if (*p != '\n')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2536 { p--;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2537 goto Lnewline;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2538 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2539 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2540
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2541 case ' ':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2542 case '\t':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2543 case '\v':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2544 case '\f':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2545 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2546 continue; // skip white space
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2547
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2548 case '_':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2549 if (mod && memcmp(p, "__FILE__", 8) == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2550 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2551 p += 8;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2552 filespec = mem.strdup(loc.filename ? loc.filename : mod->ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2553 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2554 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2555
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2556 case '"':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2557 if (filespec)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2558 goto Lerr;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2559 stringbuffer.reset();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2560 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2561 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2562 { unsigned c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2563
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2564 c = *p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2565 switch (c)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2566 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2567 case '\n':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2568 case '\r':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2569 case 0:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2570 case 0x1A:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2571 goto Lerr;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2572
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2573 case '"':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2574 stringbuffer.writeByte(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2575 filespec = mem.strdup((char *)stringbuffer.data);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2576 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2577 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2578
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2579 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2580 if (c & 0x80)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2581 { unsigned u = decodeUTF();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2582 if (u == PS || u == LS)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2583 goto Lerr;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2584 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2585 stringbuffer.writeByte(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2586 p++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2587 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2588 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2589 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2590 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2591 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2592
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2593 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2594 if (*p & 0x80)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2595 { unsigned u = decodeUTF();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2596 if (u == PS || u == LS)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2597 goto Lnewline;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2598 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2599 goto Lerr;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2600 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2601 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2602
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2603 Lerr:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2604 error(loc, "#line integer [\"filespec\"]\\n expected");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2605 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2606
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2607
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2608 /********************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2609 * Decode UTF character.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2610 * Issue error messages for invalid sequences.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2611 * Return decoded character, advance p to last character in UTF sequence.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2612 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2613
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2614 unsigned Lexer::decodeUTF()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2615 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2616 dchar_t u;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2617 unsigned char c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2618 unsigned char *s = p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2619 size_t len;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2620 size_t idx;
658
50383e476c7e Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 366
diff changeset
2621 const char *msg;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2622
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2623 c = *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2624 assert(c & 0x80);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2625
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2626 // Check length of remaining string up to 6 UTF-8 characters
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2627 for (len = 1; len < 6 && s[len]; len++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2628 ;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2629
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2630 idx = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2631 msg = utf_decodeChar(s, len, &idx, &u);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2632 p += idx - 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2633 if (msg)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2634 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2635 error("%s", msg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2636 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2637 return u;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2638 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2639
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2640
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2641 /***************************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2642 * Parse doc comment embedded between t->ptr and p.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2643 * Remove trailing blanks and tabs from lines.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2644 * Replace all newlines with \n.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2645 * Remove leading comment character from each line.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2646 * Decide if it's a lineComment or a blockComment.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2647 * Append to previous one for this token.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2648 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2649
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2650 void Lexer::getDocComment(Token *t, unsigned lineComment)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2651 {
846
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
2652 /* ct tells us which kind of comment it is: '/', '*', or '+'
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
2653 */
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2654 unsigned char ct = t->ptr[2];
846
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
2655
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
2656 /* Start of comment text skips over / * *, / + +, or / / /
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
2657 */
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2658 unsigned char *q = t->ptr + 3; // start of comment text
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2659
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2660 unsigned char *qend = p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2661 if (ct == '*' || ct == '+')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2662 qend -= 2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2663
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2664 /* Scan over initial row of ****'s or ++++'s or ////'s
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2665 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2666 for (; q < qend; q++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2667 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2668 if (*q != ct)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2669 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2670 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2671
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2672 /* Remove trailing row of ****'s or ++++'s
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2673 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2674 if (ct != '/')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2675 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2676 for (; q < qend; qend--)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2677 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2678 if (qend[-1] != ct)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2679 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2680 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2681 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2682
846
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
2683 /* Comment is now [q .. qend].
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
2684 * Canonicalize it into buf[].
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
2685 */
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
2686 OutBuffer buf;
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
2687 int linestart = 0;
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
2688
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2689 for (; q < qend; q++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2690 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2691 unsigned char c = *q;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2692
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2693 switch (c)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2694 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2695 case '*':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2696 case '+':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2697 if (linestart && c == ct)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2698 { linestart = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2699 /* Trim preceding whitespace up to preceding \n
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2700 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2701 while (buf.offset && (buf.data[buf.offset - 1] == ' ' || buf.data[buf.offset - 1] == '\t'))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2702 buf.offset--;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2703 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2704 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2705 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2706
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2707 case ' ':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2708 case '\t':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2709 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2710
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2711 case '\r':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2712 if (q[1] == '\n')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2713 continue; // skip the \r
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2714 goto Lnewline;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2715
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2716 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2717 if (c == 226)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2718 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2719 // If LS or PS
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2720 if (q[1] == 128 &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2721 (q[2] == 168 || q[2] == 169))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2722 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2723 q += 2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2724 goto Lnewline;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2725 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2726 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2727 linestart = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2728 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2729
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2730 Lnewline:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2731 c = '\n'; // replace all newlines with \n
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2732 case '\n':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2733 linestart = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2734
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2735 /* Trim trailing whitespace
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2736 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2737 while (buf.offset && (buf.data[buf.offset - 1] == ' ' || buf.data[buf.offset - 1] == '\t'))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2738 buf.offset--;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2739
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2740 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2741 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2742 buf.writeByte(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2743 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2744
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2745 // Always end with a newline
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2746 if (!buf.offset || buf.data[buf.offset - 1] != '\n')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2747 buf.writeByte('\n');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2748
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2749 buf.writeByte(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2750
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2751 // It's a line comment if the start of the doc comment comes
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2752 // after other non-whitespace on the same line.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2753 unsigned char** dc = (lineComment && anyToken)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2754 ? &t->lineComment
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2755 : &t->blockComment;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2756
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2757 // Combine with previous doc comment, if any
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2758 if (*dc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2759 *dc = combineComments(*dc, (unsigned char *)buf.data);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2760 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2761 *dc = (unsigned char *)buf.extractData();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2762 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2763
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2764 /********************************************
846
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
2765 * Combine two document comments into one,
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
2766 * separated by a newline.
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2767 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2768
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2769 unsigned char *Lexer::combineComments(unsigned char *c1, unsigned char *c2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2770 {
846
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
2771 //printf("Lexer::combineComments('%s', '%s')\n", c1, c2);
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
2772
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2773 unsigned char *c = c2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2774
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2775 if (c1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2776 { c = c1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2777 if (c2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2778 { size_t len1 = strlen((char *)c1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2779 size_t len2 = strlen((char *)c2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2780
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2781 c = (unsigned char *)mem.malloc(len1 + 1 + len2 + 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2782 memcpy(c, c1, len1);
846
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
2783 if (len1 && c1[len1 - 1] != '\n')
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
2784 { c[len1] = '\n';
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
2785 len1++;
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
2786 }
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
2787 memcpy(c + len1, c2, len2);
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
2788 c[len1 + len2] = 0;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2789 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2790 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2791 return c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2792 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2793
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2794 /********************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2795 * Create an identifier in the string table.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2796 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2797
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2798 Identifier *Lexer::idPool(const char *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2799 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2800 size_t len = strlen(s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2801 StringValue *sv = stringtable.update(s, len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2802 Identifier *id = (Identifier *) sv->ptrvalue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2803 if (!id)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2804 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2805 id = new Identifier(sv->lstring.string, TOKidentifier);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2806 sv->ptrvalue = id;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2807 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2808 return id;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2809 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2810
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2811 /*********************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2812 * Create a unique identifier using the prefix s.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2813 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2814
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2815 Identifier *Lexer::uniqueId(const char *s, int num)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2816 { char buffer[32];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2817 size_t slen = strlen(s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2818
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2819 assert(slen + sizeof(num) * 3 + 1 <= sizeof(buffer));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2820 sprintf(buffer, "%s%d", s, num);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2821 return idPool(buffer);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2822 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2823
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2824 Identifier *Lexer::uniqueId(const char *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2825 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2826 static int num;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2827 return uniqueId(s, ++num);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2828 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2829
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2830 /****************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2831 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2832
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2833 struct Keyword
658
50383e476c7e Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 366
diff changeset
2834 { const char *name;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2835 enum TOK value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2836 };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2837
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2838 static Keyword keywords[] =
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2839 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2840 // { "", TOK },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2841
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2842 { "this", TOKthis },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2843 { "super", TOKsuper },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2844 { "assert", TOKassert },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2845 { "null", TOKnull },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2846 { "true", TOKtrue },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2847 { "false", TOKfalse },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2848 { "cast", TOKcast },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2849 { "new", TOKnew },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2850 { "delete", TOKdelete },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2851 { "throw", TOKthrow },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2852 { "module", TOKmodule },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2853 { "pragma", TOKpragma },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2854 { "typeof", TOKtypeof },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2855 { "typeid", TOKtypeid },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2856
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2857 { "template", TOKtemplate },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2858
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2859 { "void", TOKvoid },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2860 { "byte", TOKint8 },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2861 { "ubyte", TOKuns8 },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2862 { "short", TOKint16 },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2863 { "ushort", TOKuns16 },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2864 { "int", TOKint32 },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2865 { "uint", TOKuns32 },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2866 { "long", TOKint64 },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2867 { "ulong", TOKuns64 },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2868 { "cent", TOKcent, },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2869 { "ucent", TOKucent, },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2870 { "float", TOKfloat32 },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2871 { "double", TOKfloat64 },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2872 { "real", TOKfloat80 },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2873
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2874 { "bool", TOKbool },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2875 { "char", TOKchar },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2876 { "wchar", TOKwchar },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2877 { "dchar", TOKdchar },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2878
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2879 { "ifloat", TOKimaginary32 },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2880 { "idouble", TOKimaginary64 },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2881 { "ireal", TOKimaginary80 },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2882
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2883 { "cfloat", TOKcomplex32 },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2884 { "cdouble", TOKcomplex64 },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2885 { "creal", TOKcomplex80 },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2886
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2887 { "delegate", TOKdelegate },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2888 { "function", TOKfunction },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2889
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2890 { "is", TOKis },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2891 { "if", TOKif },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2892 { "else", TOKelse },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2893 { "while", TOKwhile },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2894 { "for", TOKfor },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2895 { "do", TOKdo },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2896 { "switch", TOKswitch },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2897 { "case", TOKcase },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2898 { "default", TOKdefault },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2899 { "break", TOKbreak },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2900 { "continue", TOKcontinue },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2901 { "synchronized", TOKsynchronized },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2902 { "return", TOKreturn },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2903 { "goto", TOKgoto },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2904 { "try", TOKtry },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2905 { "catch", TOKcatch },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2906 { "finally", TOKfinally },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2907 { "with", TOKwith },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2908 { "asm", TOKasm },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2909 { "foreach", TOKforeach },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2910 { "foreach_reverse", TOKforeach_reverse },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2911 { "scope", TOKscope },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2912
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2913 { "struct", TOKstruct },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2914 { "class", TOKclass },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2915 { "interface", TOKinterface },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2916 { "union", TOKunion },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2917 { "enum", TOKenum },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2918 { "import", TOKimport },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2919 { "mixin", TOKmixin },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2920 { "static", TOKstatic },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2921 { "final", TOKfinal },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2922 { "const", TOKconst },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2923 { "typedef", TOKtypedef },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2924 { "alias", TOKalias },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2925 { "override", TOKoverride },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2926 { "abstract", TOKabstract },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2927 { "volatile", TOKvolatile },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2928 { "debug", TOKdebug },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2929 { "deprecated", TOKdeprecated },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2930 { "in", TOKin },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2931 { "out", TOKout },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2932 { "inout", TOKinout },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2933 { "lazy", TOKlazy },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2934 { "auto", TOKauto },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2935
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2936 { "align", TOKalign },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2937 { "extern", TOKextern },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2938 { "private", TOKprivate },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2939 { "package", TOKpackage },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2940 { "protected", TOKprotected },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2941 { "public", TOKpublic },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2942 { "export", TOKexport },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2943
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2944 { "body", TOKbody },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2945 { "invariant", TOKinvariant },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2946 { "unittest", TOKunittest },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2947 { "version", TOKversion },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2948 //{ "manifest", TOKmanifest },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2949
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2950 // Added after 1.0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2951 { "ref", TOKref },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2952 { "macro", TOKmacro },
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2953 #if DMDV2
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2954 { "pure", TOKpure },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2955 { "nothrow", TOKnothrow },
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2956 { "__thread", TOKtls },
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2957 { "__traits", TOKtraits },
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2958 { "__overloadset", TOKoverloadset },
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2959 { "__FILE__", TOKfile },
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2960 { "__LINE__", TOKline },
658
50383e476c7e Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 366
diff changeset
2961 { "shared", TOKshared },
846
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 794
diff changeset
2962 { "immutable", TOKimmutable },
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2963 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2964 };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2965
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2966 int Token::isKeyword()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2967 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2968 for (unsigned u = 0; u < sizeof(keywords) / sizeof(keywords[0]); u++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2969 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2970 if (keywords[u].value == value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2971 return 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2972 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2973 return 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2974 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2975
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2976 void Lexer::initKeywords()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2977 { StringValue *sv;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2978 unsigned u;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2979 enum TOK v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2980 unsigned nkeywords = sizeof(keywords) / sizeof(keywords[0]);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2981
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2982 if (global.params.Dversion == 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2983 nkeywords -= 2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2984
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2985 cmtable_init();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2986
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2987 for (u = 0; u < nkeywords; u++)
658
50383e476c7e Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 366
diff changeset
2988 { const char *s;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2989
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2990 //printf("keyword[%d] = '%s'\n",u, keywords[u].name);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2991 s = keywords[u].name;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2992 v = keywords[u].value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2993 sv = stringtable.insert(s, strlen(s));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2994 sv->ptrvalue = (void *) new Identifier(sv->lstring.string,v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2995
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2996 //printf("tochars[%d] = '%s'\n",v, s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2997 Token::tochars[v] = s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2998 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2999
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3000 Token::tochars[TOKeof] = "EOF";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3001 Token::tochars[TOKlcurly] = "{";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3002 Token::tochars[TOKrcurly] = "}";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3003 Token::tochars[TOKlparen] = "(";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3004 Token::tochars[TOKrparen] = ")";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3005 Token::tochars[TOKlbracket] = "[";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3006 Token::tochars[TOKrbracket] = "]";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3007 Token::tochars[TOKsemicolon] = ";";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3008 Token::tochars[TOKcolon] = ":";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3009 Token::tochars[TOKcomma] = ",";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3010 Token::tochars[TOKdot] = ".";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3011 Token::tochars[TOKxor] = "^";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3012 Token::tochars[TOKxorass] = "^=";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3013 Token::tochars[TOKassign] = "=";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3014 Token::tochars[TOKconstruct] = "=";
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3015 #if DMDV2
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3016 Token::tochars[TOKblit] = "=";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3017 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3018 Token::tochars[TOKlt] = "<";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3019 Token::tochars[TOKgt] = ">";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3020 Token::tochars[TOKle] = "<=";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3021 Token::tochars[TOKge] = ">=";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3022 Token::tochars[TOKequal] = "==";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3023 Token::tochars[TOKnotequal] = "!=";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3024 Token::tochars[TOKnotidentity] = "!is";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3025 Token::tochars[TOKtobool] = "!!";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3026
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3027 Token::tochars[TOKunord] = "!<>=";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3028 Token::tochars[TOKue] = "!<>";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3029 Token::tochars[TOKlg] = "<>";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3030 Token::tochars[TOKleg] = "<>=";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3031 Token::tochars[TOKule] = "!>";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3032 Token::tochars[TOKul] = "!>=";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3033 Token::tochars[TOKuge] = "!<";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3034 Token::tochars[TOKug] = "!<=";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3035
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3036 Token::tochars[TOKnot] = "!";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3037 Token::tochars[TOKtobool] = "!!";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3038 Token::tochars[TOKshl] = "<<";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3039 Token::tochars[TOKshr] = ">>";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3040 Token::tochars[TOKushr] = ">>>";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3041 Token::tochars[TOKadd] = "+";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3042 Token::tochars[TOKmin] = "-";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3043 Token::tochars[TOKmul] = "*";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3044 Token::tochars[TOKdiv] = "/";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3045 Token::tochars[TOKmod] = "%";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3046 Token::tochars[TOKslice] = "..";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3047 Token::tochars[TOKdotdotdot] = "...";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3048 Token::tochars[TOKand] = "&";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3049 Token::tochars[TOKandand] = "&&";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3050 Token::tochars[TOKor] = "|";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3051 Token::tochars[TOKoror] = "||";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3052 Token::tochars[TOKarray] = "[]";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3053 Token::tochars[TOKindex] = "[i]";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3054 Token::tochars[TOKaddress] = "&";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3055 Token::tochars[TOKstar] = "*";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3056 Token::tochars[TOKtilde] = "~";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3057 Token::tochars[TOKdollar] = "$";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3058 Token::tochars[TOKcast] = "cast";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3059 Token::tochars[TOKplusplus] = "++";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3060 Token::tochars[TOKminusminus] = "--";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3061 Token::tochars[TOKtype] = "type";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3062 Token::tochars[TOKquestion] = "?";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3063 Token::tochars[TOKneg] = "-";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3064 Token::tochars[TOKuadd] = "+";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3065 Token::tochars[TOKvar] = "var";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3066 Token::tochars[TOKaddass] = "+=";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3067 Token::tochars[TOKminass] = "-=";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3068 Token::tochars[TOKmulass] = "*=";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3069 Token::tochars[TOKdivass] = "/=";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3070 Token::tochars[TOKmodass] = "%=";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3071 Token::tochars[TOKshlass] = "<<=";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3072 Token::tochars[TOKshrass] = ">>=";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3073 Token::tochars[TOKushrass] = ">>>=";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3074 Token::tochars[TOKandass] = "&=";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3075 Token::tochars[TOKorass] = "|=";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3076 Token::tochars[TOKcatass] = "~=";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3077 Token::tochars[TOKcat] = "~";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3078 Token::tochars[TOKcall] = "call";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3079 Token::tochars[TOKidentity] = "is";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3080 Token::tochars[TOKnotidentity] = "!is";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3081
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3082 Token::tochars[TOKorass] = "|=";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3083 Token::tochars[TOKidentifier] = "identifier";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3084
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3085 // For debugging
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1431
diff changeset
3086 Token::tochars[TOKerror] = "error";
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3087 Token::tochars[TOKdotexp] = "dotexp";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3088 Token::tochars[TOKdotti] = "dotti";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3089 Token::tochars[TOKdotvar] = "dotvar";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3090 Token::tochars[TOKdottype] = "dottype";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3091 Token::tochars[TOKsymoff] = "symoff";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3092 Token::tochars[TOKarraylength] = "arraylength";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3093 Token::tochars[TOKarrayliteral] = "arrayliteral";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3094 Token::tochars[TOKassocarrayliteral] = "assocarrayliteral";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3095 Token::tochars[TOKstructliteral] = "structliteral";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3096 Token::tochars[TOKstring] = "string";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3097 Token::tochars[TOKdsymbol] = "symbol";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3098 Token::tochars[TOKtuple] = "tuple";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3099 Token::tochars[TOKdeclaration] = "declaration";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3100 Token::tochars[TOKdottd] = "dottd";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3101 Token::tochars[TOKon_scope_exit] = "scope(exit)";
1195
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1165
diff changeset
3102 Token::tochars[TOKon_scope_success] = "scope(success)";
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1165
diff changeset
3103 Token::tochars[TOKon_scope_failure] = "scope(failure)";
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3104 }