Changing typespecs to be normal expressions
This commit is contained in:
6
main.cpp
6
main.cpp
@@ -9,6 +9,12 @@
|
|||||||
|
|
||||||
/// @todo
|
/// @todo
|
||||||
/// [ ] - Typespecs should probably be expressions so stuff like would be possible :: *[32]int
|
/// [ ] - Typespecs should probably be expressions so stuff like would be possible :: *[32]int
|
||||||
|
/*
|
||||||
|
thing1 :: *int // type
|
||||||
|
thing2 :: *get_value // value from pointer
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
int main(){
|
int main(){
|
||||||
test_os_memory();
|
test_os_memory();
|
||||||
|
|||||||
21
new_ast.cpp
21
new_ast.cpp
@@ -91,6 +91,8 @@ enum Ast_Kind{
|
|||||||
AST_COMPOUND_ITEM,
|
AST_COMPOUND_ITEM,
|
||||||
AST_COMPOUND,
|
AST_COMPOUND,
|
||||||
|
|
||||||
|
AST_POINTER,
|
||||||
|
AST_ARRAY,
|
||||||
AST_INIT,
|
AST_INIT,
|
||||||
AST_IF,
|
AST_IF,
|
||||||
AST_IF_NODE,
|
AST_IF_NODE,
|
||||||
@@ -190,16 +192,20 @@ struct Ast_If: Ast{
|
|||||||
|
|
||||||
struct Ast_Lambda_Arg: Ast_Expr{
|
struct Ast_Lambda_Arg: Ast_Expr{
|
||||||
Intern_String name;
|
Intern_String name;
|
||||||
Ast_Typespec *typespec;
|
Ast_Expr *typespec;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Ast_Lambda : Ast_Expr {
|
struct Ast_Lambda : Ast_Expr {
|
||||||
Array<Ast_Lambda_Arg *> args;
|
Array<Ast_Lambda_Arg *> args;
|
||||||
Ast_Typespec *ret;
|
Ast_Expr *ret;
|
||||||
Ast_Block *block;
|
Ast_Block *block;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Ast_Resolved_Type;
|
struct Ast_Array: Ast_Expr{
|
||||||
|
Ast_Expr *base;
|
||||||
|
Ast_Expr *expr;
|
||||||
|
};
|
||||||
|
|
||||||
struct Ast_Typespec:Ast{
|
struct Ast_Typespec:Ast{
|
||||||
union{
|
union{
|
||||||
Ast_Typespec *base;
|
Ast_Typespec *base;
|
||||||
@@ -331,7 +337,7 @@ ast_expr_lambda_empty(Token *pos){
|
|||||||
}
|
}
|
||||||
|
|
||||||
function Ast_Lambda_Arg *
|
function Ast_Lambda_Arg *
|
||||||
ast_expr_lambda_arg(Token *pos, Intern_String name, Ast_Typespec *typespec){
|
ast_expr_lambda_arg(Token *pos, Intern_String name, Ast_Expr *typespec){
|
||||||
AST_NEW(Lambda_Arg, LAMBDA_ARG, pos);
|
AST_NEW(Lambda_Arg, LAMBDA_ARG, pos);
|
||||||
result->name = name;
|
result->name = name;
|
||||||
result->typespec = typespec;
|
result->typespec = typespec;
|
||||||
@@ -370,6 +376,13 @@ ast_init(Token *pos, Token_Kind op, Ast_Atom *ident, Ast_Expr *expr){
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Ast_Array *
|
||||||
|
ast_array(Token *pos, Ast_Expr *base){
|
||||||
|
AST_NEW(Array, ARRAY, pos);
|
||||||
|
result->base = base;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Typespecs
|
// Typespecs
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|||||||
11
new_lex.cpp
11
new_lex.cpp
@@ -26,6 +26,7 @@ enum Token_Kind{
|
|||||||
|
|
||||||
TK_BitAnd,
|
TK_BitAnd,
|
||||||
TK_BitOr,
|
TK_BitOr,
|
||||||
|
TK_BitXor,
|
||||||
TK_And,
|
TK_And,
|
||||||
TK_Or,
|
TK_Or,
|
||||||
TK_FirstLogical = TK_BitAnd,
|
TK_FirstLogical = TK_BitAnd,
|
||||||
@@ -82,12 +83,12 @@ enum Token_Kind{
|
|||||||
TK_Integer,
|
TK_Integer,
|
||||||
TK_Keyword,
|
TK_Keyword,
|
||||||
|
|
||||||
TK_Pointer,
|
TK_Pointer = TK_Mul,
|
||||||
TK_Dereference,
|
TK_Dereference = TK_BitAnd,
|
||||||
|
|
||||||
// These are not produced by lexer
|
// These are not produced by lexer
|
||||||
// but identified by parser
|
// but identified by parser
|
||||||
OPEN_SCOPE,
|
OPEN_SCOPE = 128,
|
||||||
CLOSE_SCOPE,
|
CLOSE_SCOPE,
|
||||||
SAME_SCOPE,
|
SAME_SCOPE,
|
||||||
};
|
};
|
||||||
@@ -443,7 +444,7 @@ lex__stream(Intern_Table *table, Array<Token> *array, Lex_Stream *s){
|
|||||||
case '~': t.kind = TK_Neg; break;
|
case '~': t.kind = TK_Neg; break;
|
||||||
case '?': t.kind = TK_Question; break;
|
case '?': t.kind = TK_Question; break;
|
||||||
case '#': t.kind = TK_Pound; break;
|
case '#': t.kind = TK_Pound; break;
|
||||||
case '^': t.kind = TK_Pointer; break;
|
case '^': t.kind = TK_BitXor; break;
|
||||||
CASE2('!', TK_Not, TK_NotEquals);
|
CASE2('!', TK_Not, TK_NotEquals);
|
||||||
CASE2('=', TK_Assign, TK_Equals);
|
CASE2('=', TK_Assign, TK_Equals);
|
||||||
CASE2('*', TK_Mul, TK_MulAssign);
|
CASE2('*', TK_Mul, TK_MulAssign);
|
||||||
@@ -697,7 +698,7 @@ token_kind_string(Token_Kind kind){
|
|||||||
case TK_Mod: return "%"_s;
|
case TK_Mod: return "%"_s;
|
||||||
case TK_BitAnd: return "&"_s;
|
case TK_BitAnd: return "&"_s;
|
||||||
case TK_BitOr: return "|"_s;
|
case TK_BitOr: return "|"_s;
|
||||||
case TK_Pointer: return "^"_s;
|
case TK_BitXor: return "^"_s;
|
||||||
case TK_Neg: return "~"_s;
|
case TK_Neg: return "~"_s;
|
||||||
case TK_Not: return "!"_s;
|
case TK_Not: return "!"_s;
|
||||||
case TK_OpenParen: return "("_s;
|
case TK_OpenParen: return "("_s;
|
||||||
|
|||||||
@@ -134,7 +134,6 @@ Compound literals
|
|||||||
- { }
|
- { }
|
||||||
*/
|
*/
|
||||||
function Ast_Expr *parse_expr(S64 rbp = 0);
|
function Ast_Expr *parse_expr(S64 rbp = 0);
|
||||||
function Ast_Typespec *parse_typespec();
|
|
||||||
|
|
||||||
function Ast_Compound *
|
function Ast_Compound *
|
||||||
parse_expr_compound(){
|
parse_expr_compound(){
|
||||||
@@ -170,10 +169,10 @@ parse_expr_compound(){
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
function Ast_Typespec *
|
function Ast_Expr *
|
||||||
parse_optional_type(){
|
parse_optional_type(){
|
||||||
Ast_Typespec *result = 0;
|
Ast_Expr *result = 0;
|
||||||
if(token_match(TK_Colon)) result = parse_typespec();
|
if(token_match(TK_Colon)) result = parse_expr();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -261,7 +260,7 @@ parse_lambda(Token *token, B32 is_typespec = false){
|
|||||||
for(;;){
|
for(;;){
|
||||||
Token *name = token_expect(TK_Identifier);
|
Token *name = token_expect(TK_Identifier);
|
||||||
token_expect(TK_Colon);
|
token_expect(TK_Colon);
|
||||||
Ast_Typespec *typespec = parse_typespec();
|
Ast_Expr *typespec = parse_expr();
|
||||||
Ast_Lambda_Arg *param = ast_expr_lambda_arg(name, name->intern_val, typespec);
|
Ast_Lambda_Arg *param = ast_expr_lambda_arg(name, name->intern_val, typespec);
|
||||||
params.add(param);
|
params.add(param);
|
||||||
|
|
||||||
@@ -281,10 +280,16 @@ parse_lambda(Token *token, B32 is_typespec = false){
|
|||||||
function Ast_Expr *
|
function Ast_Expr *
|
||||||
null_denotation(Token *token){
|
null_denotation(Token *token){
|
||||||
switch(token->kind){
|
switch(token->kind){
|
||||||
case TK_StringLit : return ast_expr_string(token, token->intern_val);
|
case TK_StringLit : return ast_expr_string(token, token->intern_val);
|
||||||
case TK_Identifier: return ast_expr_identifier(token, token->intern_val);
|
case TK_Identifier : return ast_expr_identifier(token, token->intern_val);
|
||||||
case TK_Integer : return ast_expr_integer(token, token->int_val);
|
case TK_Integer : return ast_expr_integer(token, token->int_val);
|
||||||
case TK_Pointer : return ast_expr_unary(token, TK_Dereference, parse_expr());
|
case TK_Pointer : return ast_expr_unary(token, TK_Pointer, parse_expr());
|
||||||
|
case TK_Dereference: return ast_expr_unary(token, TK_Dereference, parse_expr());
|
||||||
|
case TK_OpenBracket: {
|
||||||
|
Ast_Array *result = ast_array(token, parse_expr());
|
||||||
|
token_expect(TK_CloseBracket);
|
||||||
|
return result;
|
||||||
|
}break;
|
||||||
case TK_Keyword: {
|
case TK_Keyword: {
|
||||||
if(token->intern_val == keyword_cast){
|
if(token->intern_val == keyword_cast){
|
||||||
token_expect(TK_OpenParen);
|
token_expect(TK_OpenParen);
|
||||||
@@ -325,7 +330,7 @@ left_binding_power(Token_Kind kind){
|
|||||||
function S64
|
function S64
|
||||||
postfix_binding_power(Token_Kind kind){
|
postfix_binding_power(Token_Kind kind){
|
||||||
switch(kind){
|
switch(kind){
|
||||||
case TK_Increment: case TK_Decrement: case TK_Pointer: case TK_OpenBracket: return 1;
|
case TK_Increment: case TK_Decrement: case TK_OpenBracket: return 1;
|
||||||
default: return 0;
|
default: return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -348,7 +353,7 @@ parse_expr(S64 rbp){
|
|||||||
for(;;){
|
for(;;){
|
||||||
token = token_get();
|
token = token_get();
|
||||||
|
|
||||||
if((rbp == 0) && (token->kind == TK_Increment || token->kind == TK_Decrement || token->kind == TK_Pointer || token->kind == TK_OpenBracket)){
|
if((rbp == 0) && (token->kind == TK_Increment || token->kind == TK_Decrement || token->kind == TK_OpenBracket)){
|
||||||
token_next();
|
token_next();
|
||||||
if(token->kind == TK_OpenBracket){
|
if(token->kind == TK_OpenBracket){
|
||||||
Ast_Expr *index = parse_expr();
|
Ast_Expr *index = parse_expr();
|
||||||
@@ -376,40 +381,40 @@ parse_expr(S64 rbp){
|
|||||||
// Parsing declarations
|
// Parsing declarations
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// [10]*int - Array of 10 pointers to ints
|
// [10]*int - Array of 10 pointers to ints
|
||||||
function Ast_Typespec *
|
// function Ast_Typespec *
|
||||||
parse_typespec_recurse(){
|
// parse_typespec_recurse(){
|
||||||
Token *token = token_get();
|
// Token *token = token_get();
|
||||||
if(token_match(TK_Pointer)){
|
// if(token_match(TK_Pointer)){
|
||||||
Ast_Typespec *result = parse_typespec_recurse();
|
// Ast_Typespec *result = parse_typespec_recurse();
|
||||||
result = ast_typespec_pointer(token, result);
|
// result = ast_typespec_pointer(token, result);
|
||||||
return result;
|
// return result;
|
||||||
}
|
// }
|
||||||
else if(token_match(TK_OpenBracket)){
|
// else if(token_match(TK_OpenBracket)){
|
||||||
Ast_Expr *expr = parse_expr();
|
// Ast_Expr *expr = parse_expr();
|
||||||
token_expect(TK_CloseBracket);
|
// token_expect(TK_CloseBracket);
|
||||||
Ast_Typespec *result = parse_typespec_recurse();
|
// Ast_Typespec *result = parse_typespec_recurse();
|
||||||
result = ast_typespec_array(token, result, expr);
|
// result = ast_typespec_array(token, result, expr);
|
||||||
return result;
|
// return result;
|
||||||
}
|
// }
|
||||||
else if(token_match(TK_OpenParen)){
|
// else if(token_match(TK_OpenParen)){
|
||||||
Ast_Lambda *result = parse_lambda(token, true);
|
// Ast_Lambda *result = parse_lambda(token, true);
|
||||||
return ast_typespec_lambda(token, result);
|
// return ast_typespec_lambda(token, result);
|
||||||
}
|
// }
|
||||||
else if(token_match(TK_Identifier)){
|
// else if(token_match(TK_Identifier)){
|
||||||
Ast_Typespec *result = ast_typespec_name(token, token->intern_val);
|
// Ast_Typespec *result = ast_typespec_name(token, token->intern_val);
|
||||||
return result;
|
// return result;
|
||||||
}
|
// }
|
||||||
else{
|
// else{
|
||||||
parsing_error(token, "Failed to parse type, unexpected token of kind", token_kind_string(token->kind).str);
|
// parsing_error(token, "Failed to parse type, unexpected token of kind", token_kind_string(token->kind).str);
|
||||||
return 0;
|
// return 0;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
function Ast_Typespec *
|
// function Ast_Typespec *
|
||||||
parse_typespec(){
|
// parse_typespec(){
|
||||||
Ast_Typespec *result = parse_typespec_recurse();
|
// Ast_Typespec *result = parse_typespec_recurse();
|
||||||
return result;
|
// return result;
|
||||||
}
|
// }
|
||||||
|
|
||||||
function Ast_Expr *
|
function Ast_Expr *
|
||||||
parse_assign_expr(){
|
parse_assign_expr(){
|
||||||
|
|||||||
Reference in New Issue
Block a user