annotate dmd/lexer.c @ 984:4c0df37d0421

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