diff options
| author | Graydon Hoare <[email protected]> | 2010-11-22 17:41:26 -0800 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2010-11-22 17:41:32 -0800 |
| commit | e05d7c3ac1e72edff337719fe58da69e959c4cf4 (patch) | |
| tree | b040d23dac019f8caf1157b385e4b6f915696815 /src/comp/front/lexer.rs | |
| parent | rustc: "Expected" and "actual" were swapped. Also un-XFAIL compile-fail/arg-c... (diff) | |
| download | rust-e05d7c3ac1e72edff337719fe58da69e959c4cf4.tar.xz rust-e05d7c3ac1e72edff337719fe58da69e959c4cf4.zip | |
Support mach types in rustc, enable 5 more tests.
Diffstat (limited to 'src/comp/front/lexer.rs')
| -rw-r--r-- | src/comp/front/lexer.rs | 129 |
1 files changed, 95 insertions, 34 deletions
diff --git a/src/comp/front/lexer.rs b/src/comp/front/lexer.rs index 38e9367f..0506ce6c 100644 --- a/src/comp/front/lexer.rs +++ b/src/comp/front/lexer.rs @@ -302,9 +302,102 @@ impure fn consume_block_comment(reader rdr) { be consume_any_whitespace(rdr); } +impure fn scan_number(mutable char c, reader rdr) -> token.token { + auto accum_int = 0; + auto n = rdr.next(); + + if (c == '0' && n == 'x') { + rdr.bump(); + rdr.bump(); + c = rdr.curr(); + while (is_hex_digit(c) || c == '_') { + if (c != '_') { + accum_int *= 16; + accum_int += hex_digit_val(c); + } + rdr.bump(); + c = rdr.curr(); + } + } + + if (c == '0' && n == 'b') { + rdr.bump(); + rdr.bump(); + c = rdr.curr(); + while (is_bin_digit(c) || c == '_') { + if (c != '_') { + accum_int *= 2; + accum_int += bin_digit_value(c); + } + rdr.bump(); + c = rdr.curr(); + } + } + + while (is_dec_digit(c) || c == '_') { + if (c != '_') { + accum_int *= 10; + accum_int += dec_digit_val(c); + } + rdr.bump(); + c = rdr.curr(); + } + + if (c == 'u' || c == 'i') { + let bool signed = (c == 'i'); + rdr.bump(); + c = rdr.curr(); + if (c == '8') { + rdr.bump(); + if (signed) { + ret token.LIT_MACH_INT(common.ty_i8, accum_int); + } else { + ret token.LIT_MACH_INT(common.ty_u8, accum_int); + } + } + + n = rdr.next(); + if (c == '1' && n == '6') { + rdr.bump(); + rdr.bump(); + if (signed) { + ret token.LIT_MACH_INT(common.ty_i16, accum_int); + } else { + ret token.LIT_MACH_INT(common.ty_u16, accum_int); + } + } + if (c == '3' && n == '2') { + rdr.bump(); + rdr.bump(); + if (signed) { + ret token.LIT_MACH_INT(common.ty_i32, accum_int); + } else { + ret token.LIT_MACH_INT(common.ty_u32, accum_int); + } + } + + if (c == '6' && n == '4') { + rdr.bump(); + rdr.bump(); + if (signed) { + ret token.LIT_MACH_INT(common.ty_i64, accum_int); + } else { + ret token.LIT_MACH_INT(common.ty_u64, accum_int); + } + } + + if (signed) { + ret token.LIT_INT(accum_int); + } else { + // FIXME: should cast in the target bit-width. + ret token.LIT_UINT(accum_int as uint); + } + } + ret token.LIT_INT(accum_int); +} + impure fn next_token(reader rdr) -> token.token { auto accum_str = ""; - auto accum_int = 0; consume_any_whitespace(rdr); @@ -328,39 +421,7 @@ impure fn next_token(reader rdr) -> token.token { } if (is_dec_digit(c)) { - auto n = rdr.next(); - if (c == '0' && n == 'x') { - rdr.bump(); - rdr.bump(); - c = rdr.curr(); - while (is_hex_digit(c) || c == '_') { - accum_int *= 16; - accum_int += hex_digit_val(c); - rdr.bump(); - c = rdr.curr(); - } - } - - if (c == '0' && n == 'b') { - rdr.bump(); - rdr.bump(); - c = rdr.curr(); - while (is_bin_digit(c) || c == '_') { - accum_int *= 2; - accum_int += bin_digit_value(c); - rdr.bump(); - c = rdr.curr(); - } - } - - while (is_dec_digit(c) || c == '_') { - accum_int *= 10; - accum_int += dec_digit_val(c); - rdr.bump(); - c = rdr.curr(); - } - - ret token.LIT_INT(accum_int); + ret scan_number(c, rdr); } impure fn binop(reader rdr, token.binop op) -> token.token { |