Change syntax of compound exprs
This commit is contained in:
@@ -285,7 +285,7 @@ gen_ast(Ast *ast){
|
|||||||
else if(sym->type == type_type){
|
else if(sym->type == type_type){
|
||||||
if(sym->type_val->kind == TYPE_STRUCT){
|
if(sym->type_val->kind == TYPE_STRUCT){
|
||||||
Ast_Struct *agg = const_get_struct(sym->type_val->sym->ast);
|
Ast_Struct *agg = const_get_struct(sym->type_val->sym->ast);
|
||||||
if(agg){
|
if(node->value->kind == AST_STRUCT){
|
||||||
gen("struct %s{", node->name.str);
|
gen("struct %s{", node->name.str);
|
||||||
global_indent++;
|
global_indent++;
|
||||||
For(agg->members){
|
For(agg->members){
|
||||||
|
|||||||
@@ -22,14 +22,14 @@ bool_null: bool = null
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Compound expressions
|
// Compound expressions
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
array1: [4]int = {1,2,3,4}
|
array1: [4]int = [4]int(1,2,3,4)
|
||||||
array2: [32]int = {1,2,3,4}
|
array2 := [32]int(1,2,3,4)
|
||||||
array3: [32]int = {
|
array3 := [32]int(
|
||||||
[0] = null,
|
[0] = null,
|
||||||
[1] = 1,
|
[1] = 1,
|
||||||
[2] = 2,
|
[2] = 2,
|
||||||
[31] = 31,
|
[31] = 31,
|
||||||
}
|
)
|
||||||
array_item := array1[0]
|
array_item := array1[0]
|
||||||
array_item_imp: int = array2[2]
|
array_item_imp: int = array2[2]
|
||||||
|
|
||||||
|
|||||||
18
main.cpp
18
main.cpp
@@ -26,13 +26,15 @@
|
|||||||
|
|
||||||
/// @todo
|
/// @todo
|
||||||
/// [x] - Typespecs should probably be expressions so stuff like would be possible :: *[32]int
|
/// [x] - Typespecs should probably be expressions so stuff like would be possible :: *[32]int
|
||||||
/// [ ] - Lexer: Need to insert scope endings when hitting End of file
|
/// [x] - Initial order independence algorithm
|
||||||
/// [ ] - Add single line lambda expressions/
|
/// [ ] - Cleanup the mess with constant bindings
|
||||||
/// [ ] - Think about compound expressions, unify with calls - maybe Thing(a=1) instead of Thing{a=1}
|
|
||||||
/// [ ] - Structs
|
/// [ ] - Structs
|
||||||
/// [ ] - Enums
|
/// [ ] - Enums
|
||||||
/// [ ] - For loop
|
/// [ ] - For loop
|
||||||
/// [ ] - Switch
|
/// [ ] - Switch
|
||||||
|
/// [ ] - Think about compound expressions, unify with calls - maybe Thing(a=1) instead of Thing{a=1}
|
||||||
|
/// [ ] - Lexer: Need to insert scope endings when hitting End of file
|
||||||
|
/// [ ] - Add single line lambda expressions/
|
||||||
|
|
||||||
|
|
||||||
int main(){
|
int main(){
|
||||||
@@ -47,12 +49,12 @@ int main(){
|
|||||||
test_intern_table();
|
test_intern_table();
|
||||||
lex_test();
|
lex_test();
|
||||||
|
|
||||||
// String result = compile_file("globals.kl"_s);
|
String result = {};
|
||||||
String result = compile_file("structs.kl"_s);
|
// result = compile_file("order1.kl"_s);
|
||||||
// String result = compile_file("order_independent_globals.kl"_s);
|
// result = compile_file("lambdas.kl"_s);
|
||||||
|
// result = compile_file("order2.kl"_s);
|
||||||
|
result = compile_file("globals.kl"_s);
|
||||||
printf("%s", result.str);
|
printf("%s", result.str);
|
||||||
|
|
||||||
// compile_file("lambdas.kl"_s);
|
|
||||||
// compile_file("globals.kl"_s);
|
|
||||||
__debugbreak();
|
__debugbreak();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,12 +136,12 @@ Compound literals
|
|||||||
function Ast_Expr *parse_expr(S64 rbp = 0);
|
function Ast_Expr *parse_expr(S64 rbp = 0);
|
||||||
|
|
||||||
function Ast_Compound *
|
function Ast_Compound *
|
||||||
parse_expr_compound(){
|
parse_expr_compound(Ast_Expr *left){
|
||||||
Scratch scratch;
|
Scratch scratch;
|
||||||
Token *pos = token_get();
|
Token *pos = token_get();
|
||||||
Array<Ast_Compound_Item *> exprs = {scratch};
|
Array<Ast_Compound_Item *> exprs = {scratch};
|
||||||
|
|
||||||
while(!token_is(TK_CloseBrace)){
|
while(!token_is(TK_CloseParen)){
|
||||||
Token *token = token_get();
|
Token *token = token_get();
|
||||||
Ast_Expr *index = 0;
|
Ast_Expr *index = 0;
|
||||||
Ast_Atom *name = 0;
|
Ast_Atom *name = 0;
|
||||||
@@ -164,9 +164,9 @@ parse_expr_compound(){
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
token_expect(TK_CloseBrace);
|
token_expect(TK_CloseParen);
|
||||||
|
|
||||||
Ast_Compound *result = ast_expr_compound(pos, 0, exprs);
|
Ast_Compound *result = ast_expr_compound(pos, left, exprs);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -287,12 +287,14 @@ null_denotation(Token *token){
|
|||||||
case TK_Integer : return ast_int(token, token->int_val, AST_EXPR);
|
case TK_Integer : return ast_int(token, token->int_val, AST_EXPR);
|
||||||
case TK_Pointer : return ast_expr_unary(token, TK_Pointer, 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_Dereference: return ast_expr_unary(token, TK_Dereference, parse_expr());
|
||||||
|
|
||||||
case TK_OpenBracket: {
|
case TK_OpenBracket: {
|
||||||
Ast_Array *result = ast_array(token, parse_expr());
|
Ast_Array *result = ast_array(token, parse_expr());
|
||||||
token_expect(TK_CloseBracket);
|
token_expect(TK_CloseBracket);
|
||||||
result->base = parse_expr();
|
result->base = parse_expr(1);
|
||||||
return result;
|
return result;
|
||||||
}break;
|
}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);
|
||||||
@@ -307,7 +309,7 @@ null_denotation(Token *token){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}break;
|
}break;
|
||||||
case TK_OpenBrace: return parse_expr_compound();
|
|
||||||
case TK_OpenParen: {
|
case TK_OpenParen: {
|
||||||
if (token_is(TK_CloseParen)) return parse_lambda(token);
|
if (token_is(TK_CloseParen)) return parse_lambda(token);
|
||||||
else if(token_is(TK_Identifier) && token_is(TK_Colon, 1)) return parse_lambda(token);
|
else if(token_is(TK_Identifier) && token_is(TK_Colon, 1)) return parse_lambda(token);
|
||||||
@@ -330,14 +332,6 @@ left_binding_power(Token_Kind kind){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function S64
|
|
||||||
postfix_binding_power(Token_Kind kind){
|
|
||||||
switch(kind){
|
|
||||||
case TK_Increment: case TK_Decrement: case TK_OpenBracket: return 1;
|
|
||||||
default: return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function Ast_Expr *
|
function Ast_Expr *
|
||||||
left_denotation(Token *op, Ast_Expr *left){
|
left_denotation(Token *op, Ast_Expr *left){
|
||||||
enum{ Left_Associative, Right_Associative };
|
enum{ Left_Associative, Right_Associative };
|
||||||
@@ -349,6 +343,14 @@ left_denotation(Token *op, Ast_Expr *left){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function S64
|
||||||
|
postfix_binding_power(Token_Kind kind){
|
||||||
|
switch(kind){
|
||||||
|
case TK_Decrement: case TK_Increment: case TK_OpenBracket: case TK_OpenParen: return 1;
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function Ast_Expr *
|
function Ast_Expr *
|
||||||
parse_expr(S64 rbp){
|
parse_expr(S64 rbp){
|
||||||
Token *token = token_next();
|
Token *token = token_next();
|
||||||
@@ -356,19 +358,25 @@ 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_OpenBracket)){
|
if(postfix_binding_power(token->kind) > rbp){
|
||||||
token_next();
|
token_next();
|
||||||
if(token->kind == TK_OpenBracket){
|
// @note: parse postfix
|
||||||
|
switch(token->kind){
|
||||||
|
case TK_OpenBracket:{
|
||||||
Ast_Expr *index = parse_expr();
|
Ast_Expr *index = parse_expr();
|
||||||
left = ast_expr_index(token, left, index);
|
left = ast_expr_index(token, left, index);
|
||||||
token_expect(TK_CloseBracket);
|
token_expect(TK_CloseBracket);
|
||||||
}
|
}break;
|
||||||
else{
|
case TK_OpenParen:{
|
||||||
|
left = parse_expr_compound(left);
|
||||||
|
}break;
|
||||||
|
default:{
|
||||||
if(token->kind == TK_Increment) token->kind = TK_PostIncrement;
|
if(token->kind == TK_Increment) token->kind = TK_PostIncrement;
|
||||||
else if(token->kind == TK_Decrement) token->kind = TK_PostDecrement;
|
else if(token->kind == TK_Decrement) token->kind = TK_PostDecrement;
|
||||||
left = ast_expr_unary(token, token->kind, left);
|
left = ast_expr_unary(token, token->kind, left);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
else if(rbp < left_binding_power(token->kind)){
|
else if(rbp < left_binding_power(token->kind)){
|
||||||
token = token_next();
|
token = token_next();
|
||||||
|
|||||||
17
order1.kl
Normal file
17
order1.kl
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
other_func :: ()
|
||||||
|
a_val := recursive_lambda
|
||||||
|
|
||||||
|
recursive_lambda :: (thing: int)
|
||||||
|
in_val := recursive_lambda
|
||||||
|
some_value := thing + const_in_lambda
|
||||||
|
|
||||||
|
const_in_lambda :: 10
|
||||||
|
|
||||||
|
not_const := val + 10
|
||||||
|
val := 10
|
||||||
|
|
||||||
|
DEPENDENCE :: CONSTANT_VAL
|
||||||
|
CONSTANT_VAL :: 10
|
||||||
|
|
||||||
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
Str16 :: String16
|
||||||
|
|
||||||
arena_pointer: *Arena = null
|
arena_pointer: *Arena = null
|
||||||
thing: Arena
|
thing: Arena
|
||||||
@@ -21,4 +22,3 @@ pointer := &with_type
|
|||||||
deref := *pointer
|
deref := *pointer
|
||||||
|
|
||||||
|
|
||||||
Str16 :: String16
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
|
|
||||||
/*
|
|
||||||
@todo: !!!
|
|
||||||
Maybe instead of compound exprs like this:
|
|
||||||
[4]Thing{1,2,3,4}
|
|
||||||
|
|
||||||
Do it like this
|
|
||||||
[4]Thing(1,2,3,4)
|
|
||||||
[4]Thing([0]=1, [3]=3)
|
|
||||||
Thing(a=1, b=2)
|
|
||||||
|
|
||||||
unifying the call expression and compound expression
|
|
||||||
seems more unified and better for coherence
|
|
||||||
but more abigous and probably harder to implement
|
|
||||||
|
|
||||||
value :: call((thing: int): int thing += 1; return thing, )
|
|
||||||
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
other_func :: ()
|
|
||||||
a_val := recursive_lambda
|
|
||||||
|
|
||||||
recursive_lambda :: (thing: int)
|
|
||||||
in_val := recursive_lambda
|
|
||||||
some_value := thing + const_in_lambda
|
|
||||||
|
|
||||||
const_in_lambda :: 10
|
|
||||||
|
|
||||||
not_const := val + 10
|
|
||||||
val := 10
|
|
||||||
|
|
||||||
DEPENDENCE :: CONSTANT_VAL
|
|
||||||
CONSTANT_VAL :: 10
|
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user