Add floats
This commit is contained in:
@@ -320,6 +320,9 @@ gen_ast(Ast *ast){
|
|||||||
gen(";");
|
gen(";");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if(sym->type == type_f64){
|
||||||
|
gen("// constant int %s = %f;", node->name.str, sym->f64_val);
|
||||||
|
}
|
||||||
else if(sym->type == type_int){
|
else if(sym->type == type_int){
|
||||||
gen("// constant int %s = %lld;", node->name.str, sym->int_val);
|
gen("// constant int %s = %lld;", node->name.str, sym->int_val);
|
||||||
}
|
}
|
||||||
|
|||||||
16
main.cpp
16
main.cpp
@@ -100,14 +100,14 @@ int main(){
|
|||||||
|
|
||||||
String result = {};
|
String result = {};
|
||||||
#if 1
|
#if 1
|
||||||
result = compile_file("globals.kl"_s);
|
// result = compile_file("globals.kl"_s);
|
||||||
printf("%s", result.str);
|
// printf("%s", result.str);
|
||||||
result = compile_file("enums.kl"_s);
|
// result = compile_file("enums.kl"_s);
|
||||||
printf("%s", result.str);
|
// printf("%s", result.str);
|
||||||
result = compile_file("order1.kl"_s);
|
// result = compile_file("order1.kl"_s);
|
||||||
printf("%s", result.str);
|
// printf("%s", result.str);
|
||||||
result = compile_file("lambdas.kl"_s);
|
// result = compile_file("lambdas.kl"_s);
|
||||||
printf("%s", result.str);
|
// printf("%s", result.str);
|
||||||
result = compile_file("order2.kl"_s);
|
result = compile_file("order2.kl"_s);
|
||||||
printf("%s", result.str);
|
printf("%s", result.str);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -295,6 +295,14 @@ ast_ident(Token *pos, Intern_String string){
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Ast_Atom *
|
||||||
|
ast_float(Token *pos, F64 value){
|
||||||
|
AST_NEW(Atom, VALUE, pos, AST_EXPR | AST_ATOM);
|
||||||
|
result->type = type_f64; // @todo untyped
|
||||||
|
result->f64_val = value;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
function Ast_Atom *
|
function Ast_Atom *
|
||||||
ast_int(Token *pos, S64 integer){
|
ast_int(Token *pos, S64 integer){
|
||||||
AST_NEW(Atom, VALUE, pos, AST_EXPR | AST_ATOM);
|
AST_NEW(Atom, VALUE, pos, AST_EXPR | AST_ATOM);
|
||||||
|
|||||||
37
new_lex.cpp
37
new_lex.cpp
@@ -103,7 +103,7 @@ struct Token{
|
|||||||
|
|
||||||
union {
|
union {
|
||||||
U64 int_val;
|
U64 int_val;
|
||||||
F64 float_val;
|
F64 f64_val;
|
||||||
String error_val;
|
String error_val;
|
||||||
Intern_String intern_val;
|
Intern_String intern_val;
|
||||||
S64 indent;
|
S64 indent;
|
||||||
@@ -137,8 +137,6 @@ force_inline B32 token_is_assign(Token *token){return token_is_assign(token->kin
|
|||||||
force_inline B32 token_is_compare(Token_Kind token){return token >= TK_FirstCompare && token <= TK_LastCompare;}
|
force_inline B32 token_is_compare(Token_Kind token){return token >= TK_FirstCompare && token <= TK_LastCompare;}
|
||||||
force_inline B32 token_is_compare(Token *token){return token_is_compare(token->kind);}
|
force_inline B32 token_is_compare(Token *token){return token_is_compare(token->kind);}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function U8
|
function U8
|
||||||
lexc(Lex_Stream *s){
|
lexc(Lex_Stream *s){
|
||||||
return s->stream.str[s->iter];
|
return s->stream.str[s->iter];
|
||||||
@@ -209,6 +207,7 @@ token_error(Token *t, String error_val){
|
|||||||
|
|
||||||
function void
|
function void
|
||||||
lex_parse_u64(Token *t){
|
lex_parse_u64(Token *t){
|
||||||
|
t->kind = TK_Integer;
|
||||||
U64 result = 0;
|
U64 result = 0;
|
||||||
U64 m = 1;
|
U64 m = 1;
|
||||||
for(S64 i = t->len - 1; i >= 0; --i){
|
for(S64 i = t->len - 1; i >= 0; --i){
|
||||||
@@ -224,6 +223,16 @@ lex_parse_u64(Token *t){
|
|||||||
t->int_val = result;
|
t->int_val = result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function void
|
||||||
|
lex_parse_f64(Token *t){
|
||||||
|
t->kind = TK_Float;
|
||||||
|
char buffer[128];
|
||||||
|
S64 len = clamp_top((int)t->len, 126);
|
||||||
|
memory_copy(buffer, t->str, len);
|
||||||
|
buffer[len] = 0;
|
||||||
|
t->f64_val = strtod(buffer, 0);
|
||||||
|
}
|
||||||
|
|
||||||
function void
|
function void
|
||||||
lex_advance(Lex_Stream *s){
|
lex_advance(Lex_Stream *s){
|
||||||
if(s->iter >= s->stream.len){
|
if(s->iter >= s->stream.len){
|
||||||
@@ -574,11 +583,25 @@ lex__stream(Intern_Table *table, Array<Token> *array, Lex_Stream *s){
|
|||||||
|
|
||||||
case '0':case '1':case '2':case '3':case '4':
|
case '0':case '1':case '2':case '3':case '4':
|
||||||
case '5':case '6':case '7':case '8':case '9':{
|
case '5':case '6':case '7':case '8':case '9':{
|
||||||
t.kind = TK_Integer;
|
B32 found_dot = false;
|
||||||
while(lex_is_numeric(lexc(s)))
|
for(;;){
|
||||||
|
if(lex_is_numeric(lexc(s)))
|
||||||
|
;
|
||||||
|
else if(lexc(s) == '.'){
|
||||||
|
if(found_dot){
|
||||||
|
token_error(&t, "Multiple '.' in float literal"_s);
|
||||||
|
goto end_of_switch;
|
||||||
|
}
|
||||||
|
found_dot = true;
|
||||||
|
}
|
||||||
|
else break;
|
||||||
|
|
||||||
lex_advance(s);
|
lex_advance(s);
|
||||||
|
}
|
||||||
lex_set_len(s, &t);
|
lex_set_len(s, &t);
|
||||||
lex_parse_u64(&t);
|
if(found_dot) lex_parse_f64(&t);
|
||||||
|
else lex_parse_u64(&t);
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case 'A':case 'a':case 'M':case 'm':case 'B':
|
case 'A':case 'a':case 'M':case 'm':case 'B':
|
||||||
@@ -603,7 +626,7 @@ lex__stream(Intern_Table *table, Array<Token> *array, Lex_Stream *s){
|
|||||||
default: {
|
default: {
|
||||||
token_error(&t, "Unknown token"_s);
|
token_error(&t, "Unknown token"_s);
|
||||||
}
|
}
|
||||||
}
|
}end_of_switch:
|
||||||
|
|
||||||
if(t.len==0)
|
if(t.len==0)
|
||||||
lex_set_len(s,&t);
|
lex_set_len(s,&t);
|
||||||
|
|||||||
@@ -362,6 +362,7 @@ parse_expr(S64 min_bp){
|
|||||||
case TK_StringLit : left = ast_str(token, token->intern_val); break;
|
case TK_StringLit : left = ast_str(token, token->intern_val); break;
|
||||||
case TK_Identifier : left = ast_ident(token, token->intern_val); break;
|
case TK_Identifier : left = ast_ident(token, token->intern_val); break;
|
||||||
case TK_Integer : left = ast_int(token, token->int_val); break;
|
case TK_Integer : left = ast_int(token, token->int_val); break;
|
||||||
|
case TK_Float : left = ast_float(token, token->f64_val); break;
|
||||||
case TK_Pointer : left = ast_expr_unary(token, TK_Pointer, parse_expr(prefix_bp.right)); break;
|
case TK_Pointer : left = ast_expr_unary(token, TK_Pointer, parse_expr(prefix_bp.right)); break;
|
||||||
case TK_Dereference: left = ast_expr_unary(token, TK_Dereference, parse_expr(prefix_bp.right)); break;
|
case TK_Dereference: left = ast_expr_unary(token, TK_Dereference, parse_expr(prefix_bp.right)); break;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user