annotate dmd2/lexer.c @ 1650:40bd4a0d4870

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