annotate dmd/lexer.c @ 837:331a176c1f4f

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