Changeset 116
- Timestamp:
- 01/05/08 02:22:19 (1 year ago)
- Files:
-
- branches/1.9/source/interpreter.d (modified) (11 diffs)
- branches/1.9/source/value.d (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/1.9/source/interpreter.d
r115 r116 1 1 2 2 private import 3 structure, 3 4 text, 4 5 value; … … 8 9 uint line = 1; 9 10 char last = 0x03; 10 char* c = source[0];11 char* c = &source[0]; 11 12 char* cMark; 13 uint parenCount = 0; 12 14 Value v; 13 15 16 void parseExpression() 17 { 18 Value[] buffer; 19 bool bFlag = false; 20 21 parseOptionalWS(); 22 parseUnaryExpression(); 23 if(v == UNDEFINED) { 24 // there's no contents in this expression? 25 v.s = MESSAGE_unexpected_token; 26 v.type = TYPE.ERROR; 27 throw v; 28 } 29 buffer ~= v; 30 v = UNDEFINED; 31 do { 32 // now we need to read however many combos of binaryOperator unaryExpression we get. 33 parseOptionalWS(); 34 parseBinaryOperator(); 35 if(v == UNDEFINED) // okay, we're done 36 break; 37 bFlag = true; 38 buffer ~= v; 39 v = UNDEFINED; 40 parseOptionalWS(); 41 parseUnaryExpression(); 42 if(v == UNDEFINED) { // we found an operator followed by something other than an operand. 43 v.s = MESSAGE_unexpected_token; 44 v.type = TYPE.ERROR; 45 return v; 46 } 47 } while(1); 48 49 // if we've got more than a unaryexpression 50 if(bFlag) { 51 v.a = buffer; 52 v.type = TYPE.EXPRESSION; 53 return; 54 } 55 // what unaryexpression returned 56 v = buffer[0]; 57 } 58 59 /* consumes whitespace, comments, and then stops. Doesn't store anything in v. */ 14 60 void parseOptionalWS() 15 61 { … … 50 96 } 51 97 } 98 99 /* consumes a number, string, array, object, (expression), or identifier if it's there and stores it in v. */ 52 100 void parseOperand() 53 101 { … … 60 108 case '"': 61 109 // String literal 62 for(cMark = c++; c[0] != c [0]Mark; c++) {110 for(cMark = c++; c[0] != cMark[0]; c++) { 63 111 if(c[0] == 0x03) { 64 112 v.s = MESSAGE_unterminated_string; … … 75 123 case '/': 76 124 // RegExp literal 77 for(cMark = c++; c[0] != c [0]Mark; c++) {125 for(cMark = c++; c[0] != cMark[0]; c++) { 78 126 if(c[0] == 0x03) { 79 127 v.s = MESSAGE_bad_regexp; … … 102 150 case '-': 103 151 // Number literal 152 // BUG: incomplete 104 153 v.type = TYPE.DOUBLE; 105 154 return; 106 155 case '(': 107 // Expression 108 uint count = 0; 109 for(cMark = c; c[0] != 0x03; c++) { 110 if(c[0] == '(') 111 count++; 112 if(c[0] == ')') { 113 if(--count == 0) { 114 v.s = cMark[1..(c-1)]; 115 v.type = TYPE.PARENS; 116 return; 117 } 118 } 119 } 120 goto _unmatched_parens; 156 parenCount++; 157 parseExpression(); 158 if(*c != ')') { 159 v.s = MESSAGE_unmatched_parenthesis; 160 v.type = TYPE.ERROR; 161 throw v; 162 } 163 return; 121 164 case '[': 122 // Array literal 123 uint count = 0; 124 for(cMark = c; c[0] != 0x03; c++) { 125 if(c[0] == '[') 126 count++; 127 if(c[0] == ']') { 128 if(--count == 0) { 129 v.s = cMark[1..(c-1)]; 130 v.type = TYPE.BRACKETS; 131 return; 132 } 133 } 134 } 135 goto _unmatched_parens; 165 parenCount++; 166 parseArrayLiteral(); 167 if(*c != ']') { 168 v.s = MESSAGE_unmatched_parenthesis; 169 v.type = TYPE.ERROR; 170 throw v; 171 } 172 return; 136 173 case '{': 137 // Object literal 138 uint count = 0; 139 for(cMark = c; c[0] != 0x03; c++) { 140 if(c[0] == '{') 141 count++; 142 if(c[0] == '}') { 143 if(--count == 0) { 144 v.s = cMark[1..(c-1)]; 145 v.type = TYPE.BRACES; 146 return; 147 } 148 } 149 } 150 goto _unmatched_parens; 174 parenCount++; 175 parseObjectLiteral(); 176 if(*c != '}') { 177 v.s = MESSAGE_unmatched_parenthesis; 178 v.type = TYPE.ERROR; 179 throw v; 180 } 181 return; 151 182 default: 152 183 // Identifier … … 158 189 return; 159 190 } 160 161 // Shouldn't be here.162 goto _unexpected_token;163 191 } 164 192 } 165 void parseBinaryOp() 193 194 /* consumes (!|++|--)operand(++|--) */ 195 void parseUnaryExpression() 196 { 197 Value[] buffer; 198 bool bFlag = false; 199 200 switch(c[0]) { 201 case '+': 202 if(c[1] == '+') { 203 c+=2; 204 bFlag = true; 205 v.type = TYPE.INC; 206 buffer ~= v; 207 } 208 break; 209 case '-': 210 if(c[1] == '-') { 211 c+=2; 212 bFlag = true; 213 v.type = TYPE.DEC; 214 buffer ~= v; 215 } 216 break; 217 case '!': 218 c++; 219 bFlag = true; 220 v.type = TYPE.NOT; 221 buffer ~= v; 222 } 223 parseOperand(); 224 buffer ~= v; 225 switch(c[0]) { 226 case '+': 227 if(c[1] == '+') { 228 c+=2; 229 bFlag = true; 230 v.type = TYPE.INC; 231 buffer ~= v; 232 } 233 break; 234 case '-': 235 if(c[1] == '-') { 236 c+=2; 237 bFlag = true; 238 v.type = TYPE.DEC; 239 buffer ~= v; 240 } 241 } 242 if(bFlag) { 243 v.a = buffer; 244 v.type = EXPRESSION; 245 } 246 // parseOperand was the last thing to affect v, so we're already straight. 247 } 248 249 /* consumes an operator if it's there and stores it in v. */ 250 void parseBinaryOperator() 166 251 { 167 252 switch(c[0]) { 168 253 case '+': 254 if(c[1] == '+') { 255 c++; 256 v.type = TYPE.INC; 257 return; 258 } 169 259 if(c[1] == '=') { 170 260 c++; … … 175 265 return; 176 266 case '-': 267 if(c[1] == '-') { 268 c++; 269 v.type = TYPE.DEC; 270 return; 271 } 177 272 if(c[1] == '=') { 178 273 c++; … … 206 301 v.type = TYPE.MOD; 207 302 return; 208 case ' ^':303 case '~': 209 304 if(c[1] == '=') { 210 305 c++; … … 239 334 } 240 335 v.type = TYPE.OR; 336 return; 337 case '=': 338 if(c[1] == '=') { 339 c++; 340 v.type == TYPE.CMPE; 341 return; 342 } 343 v.type = TYPE.MOV; 344 return; 345 case '!': 346 if(c[1] == '=') { 347 c++; 348 v.type = TYPE.CMPNE; 349 return; 350 } 351 v.type = TYPE.NOT; 241 352 return; 242 353 case '<': … … 284 395 v.type = TYPE.CMPGT; 285 396 return; 286 default:287 goto _unexpected_token;288 397 } 289 398 } branches/1.9/source/value.d
r115 r116 56 56 EOF = 0x10, 57 57 WS = 0x11, 58 PARENS= 0x12,59 BRACKETS= 0x13,60 BRACES= 0x14,58 EXPRESSION = 0x12, 59 ARRAYLIT = 0x13, 60 OBJECTLIT = 0x14, 61 61 COMMA = 0x15, 62 62 DOT = 0x16,
