Started adding support for floating-point type, floating-point literals, and logging of floats. Other operations on float probably don't work yet.
This commit is contained in:
parent
35951c92db
commit
caa22c9341
9 changed files with 87 additions and 18 deletions
|
|
@ -255,6 +255,7 @@ tag lit_ {
|
|||
lit_int(int);
|
||||
lit_uint(uint);
|
||||
lit_mach_int(ty_mach, int);
|
||||
lit_float(str);
|
||||
lit_nil;
|
||||
lit_bool(bool);
|
||||
}
|
||||
|
|
@ -274,6 +275,7 @@ tag ty_ {
|
|||
ty_bool;
|
||||
ty_int;
|
||||
ty_uint;
|
||||
ty_float;
|
||||
ty_machine(util.common.ty_mach);
|
||||
ty_char;
|
||||
ty_str;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
import std.io;
|
||||
import std._str;
|
||||
import std._int;
|
||||
import std.map;
|
||||
import std.map.hashmap;
|
||||
import util.common;
|
||||
|
|
@ -314,6 +315,24 @@ impure fn consume_block_comment(reader rdr) {
|
|||
be consume_any_whitespace(rdr);
|
||||
}
|
||||
|
||||
impure fn scan_dec_digits(reader rdr) -> int {
|
||||
|
||||
auto c = rdr.curr();
|
||||
|
||||
let int accum_int = 0;
|
||||
|
||||
while (is_dec_digit(c) || c == '_') {
|
||||
if (c != '_') {
|
||||
accum_int *= 10;
|
||||
accum_int += dec_digit_val(c);
|
||||
}
|
||||
rdr.bump();
|
||||
c = rdr.curr();
|
||||
}
|
||||
|
||||
ret accum_int;
|
||||
}
|
||||
|
||||
impure fn scan_number(mutable char c, reader rdr) -> token.token {
|
||||
auto accum_int = 0;
|
||||
auto n = rdr.next();
|
||||
|
|
@ -330,9 +349,7 @@ impure fn scan_number(mutable char c, reader rdr) -> token.token {
|
|||
rdr.bump();
|
||||
c = rdr.curr();
|
||||
}
|
||||
}
|
||||
|
||||
if (c == '0' && n == 'b') {
|
||||
} else if (c == '0' && n == 'b') {
|
||||
rdr.bump();
|
||||
rdr.bump();
|
||||
c = rdr.curr();
|
||||
|
|
@ -344,16 +361,12 @@ impure fn scan_number(mutable char c, reader rdr) -> token.token {
|
|||
rdr.bump();
|
||||
c = rdr.curr();
|
||||
}
|
||||
} else {
|
||||
accum_int = scan_dec_digits(rdr);
|
||||
}
|
||||
|
||||
while (is_dec_digit(c) || c == '_') {
|
||||
if (c != '_') {
|
||||
accum_int *= 10;
|
||||
accum_int += dec_digit_val(c);
|
||||
}
|
||||
rdr.bump();
|
||||
c = rdr.curr();
|
||||
}
|
||||
c = rdr.curr();
|
||||
n = rdr.next();
|
||||
|
||||
if (c == 'u' || c == 'i') {
|
||||
let bool signed = (c == 'i');
|
||||
|
|
@ -405,7 +418,18 @@ impure fn scan_number(mutable char c, reader rdr) -> token.token {
|
|||
ret token.LIT_UINT(accum_int as uint);
|
||||
}
|
||||
}
|
||||
ret token.LIT_INT(accum_int);
|
||||
n = rdr.curr();
|
||||
if(n == '.') {
|
||||
// Parse a floating-point number.
|
||||
rdr.bump();
|
||||
auto accum_int1 = scan_dec_digits(rdr);
|
||||
ret token.LIT_FLOAT(_int.to_str(accum_int, 10u) + "."
|
||||
+ _int.to_str(accum_int1, 10u));
|
||||
// FIXME: Parse exponent.
|
||||
}
|
||||
else {
|
||||
ret token.LIT_INT(accum_int);
|
||||
}
|
||||
}
|
||||
|
||||
impure fn next_token(reader rdr) -> token.token {
|
||||
|
|
|
|||
|
|
@ -537,6 +537,10 @@ impure fn parse_lit(parser p) -> ast.lit {
|
|||
p.bump();
|
||||
lit = ast.lit_uint(u);
|
||||
}
|
||||
case (token.LIT_FLOAT(?s)) {
|
||||
p.bump();
|
||||
lit = ast.lit_float(s);
|
||||
}
|
||||
case (token.LIT_MACH_INT(?tm, ?i)) {
|
||||
p.bump();
|
||||
lit = ast.lit_mach_int(tm, i);
|
||||
|
|
|
|||
|
|
@ -126,6 +126,7 @@ tag token {
|
|||
LIT_INT(int);
|
||||
LIT_UINT(uint);
|
||||
LIT_MACH_INT(ty_mach, int);
|
||||
LIT_FLOAT(str);
|
||||
LIT_STR(str);
|
||||
LIT_CHAR(char);
|
||||
LIT_BOOL(bool);
|
||||
|
|
@ -295,7 +296,7 @@ fn to_str(token t) -> str {
|
|||
ret _int.to_str(i, 10u)
|
||||
+ "_" + ty_mach_to_str(tm);
|
||||
}
|
||||
|
||||
case (LIT_FLOAT(?s)) { ret s; }
|
||||
case (LIT_STR(?s)) {
|
||||
// FIXME: escape.
|
||||
ret "\"" + s + "\"";
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue