annotate dmd/lexer.c @ 1351:8d501abecd24

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