diff --git a/ravi-tests/ravi_test_ast.expected b/ravi-tests/ravi_test_ast.expected index 80b5b63..64218b4 100644 --- a/ravi-tests/ravi_test_ast.expected +++ b/ravi-tests/ravi_test_ast.expected @@ -121,8 +121,8 @@ end ]] function() return - --[binary expr start] any - --[suffixed expr start] any + --[binary expr start] number + --[suffixed expr start] integer --[primary start] --[binary expr start] integer 1 @@ -132,7 +132,7 @@ function() --[primary end] --[suffixed expr end] ^ - --[suffixed expr start] any + --[suffixed expr start] integer --[primary start] --[binary expr start] integer 50 @@ -149,8 +149,8 @@ end ]] function() return - --[binary expr start] any - --[suffixed expr start] any + --[binary expr start] number + --[suffixed expr start] integer --[primary start] --[unary expr start] integer - @@ -159,7 +159,7 @@ function() --[primary end] --[suffixed expr end] ^ - --[suffixed expr start] any + --[suffixed expr start] integer --[primary start] --[binary expr start] integer 31 @@ -177,7 +177,7 @@ end function() return --[binary expr start] any - --[suffixed expr start] any + --[suffixed expr start] number --[primary start] --[binary expr start] number --[unary expr start] number @@ -218,26 +218,26 @@ end ]] function() return - --[binary expr start] any - --[binary expr start] any - --[binary expr start] any - --[unary expr start] any + --[binary expr start] number + --[binary expr start] number + --[binary expr start] number + --[unary expr start] number - - --[suffixed expr start] any + --[suffixed expr start] number --[primary start] - --[binary expr start] any - --[suffixed expr start] any + --[binary expr start] number + --[suffixed expr start] number --[primary start] - --[binary expr start] any + --[binary expr start] number --[binary expr start] number 2.0000000000000000 ^ 8 --[binary expr end] + - --[unary expr start] any + --[unary expr start] integer - - --[suffixed expr start] any + --[suffixed expr start] integer --[primary start] --[unary expr start] integer - @@ -274,23 +274,23 @@ function() --[binary expr start] any --[binary expr start] any --[binary expr start] any - --[unary expr start] any + --[unary expr start] number - - --[suffixed expr start] any + --[suffixed expr start] number --[primary start] - --[binary expr start] any - --[suffixed expr start] any + --[binary expr start] number + --[suffixed expr start] number --[primary start] - --[binary expr start] any + --[binary expr start] number --[binary expr start] number 2 ^ 8 --[binary expr end] + - --[unary expr start] any + --[unary expr start] integer - - --[suffixed expr start] any + --[suffixed expr start] integer --[primary start] --[unary expr start] integer - @@ -383,11 +383,11 @@ end ]] function() return - --[binary expr start] any - --[suffixed expr start] any + --[binary expr start] integer + --[suffixed expr start] integer --[primary start] - --[binary expr start] any - --[suffixed expr start] any + --[binary expr start] integer + --[suffixed expr start] integer --[primary start] --[binary expr start] integer 100 @@ -414,7 +414,7 @@ end ]] function() return - --[binary expr start] any + --[binary expr start] boolean --[binary expr start] number 2 ^ @@ -425,10 +425,10 @@ function() --[binary expr end] --[binary expr end] == - --[binary expr start] any + --[binary expr start] number 2 ^ - --[suffixed expr start] any + --[suffixed expr start] number --[primary start] --[binary expr start] number 3 @@ -446,7 +446,7 @@ end ]] function() return - --[binary expr start] any + --[binary expr start] boolean --[binary expr start] number --[binary expr start] number 2 @@ -457,8 +457,8 @@ function() 4 --[binary expr end] == - --[binary expr start] any - --[suffixed expr start] any + --[binary expr start] number + --[suffixed expr start] number --[primary start] --[binary expr start] number 2 @@ -618,9 +618,9 @@ function() --[unary expr end] --[binary expr end] and - --[binary expr start] any - --[binary expr start] any - --[suffixed expr start] any + --[binary expr start] boolean + --[binary expr start] number + --[suffixed expr start] integer --[primary start] --[unary expr start] integer - @@ -742,7 +742,7 @@ function() --[binary expr start] any --[unary expr start] any not - --[suffixed expr start] any + --[suffixed expr start] boolean --[primary start] --[binary expr start] boolean --[binary expr start] integer @@ -978,7 +978,7 @@ function() == --[binary expr start] any --[binary expr start] any - --[suffixed expr start] any + --[suffixed expr start] integer --[primary start] --[unary expr start] integer - @@ -993,7 +993,7 @@ function() --[suffixed expr start] any --[primary start] --[binary expr start] any - --[suffixed expr start] any + --[suffixed expr start] integer --[primary start] --[binary expr start] integer 4 @@ -1003,12 +1003,12 @@ function() --[primary end] --[suffixed expr end] // - --[suffixed expr start] any + --[suffixed expr start] number --[primary start] - --[binary expr start] any + --[binary expr start] number 2 ^ - --[suffixed expr start] any + --[suffixed expr start] number --[primary start] --[binary expr start] number 3 @@ -1030,10 +1030,10 @@ function() --[suffixed expr end] --[binary expr end] + - --[suffixed expr start] any + --[suffixed expr start] number --[primary start] - --[binary expr start] any - --[suffixed expr start] any + --[binary expr start] number + --[suffixed expr start] integer --[primary start] --[binary expr start] integer 4 @@ -1292,7 +1292,7 @@ function() --[suffixed expr start] any --[primary start] --[binary expr start] any - --[suffixed expr start] any + --[suffixed expr start] boolean --[primary start] --[binary expr start] boolean 2 diff --git a/ravi-tests/ravi_test_ast2.expected b/ravi-tests/ravi_test_ast2.expected index 1bf7ce8..6b8a338 100644 --- a/ravi-tests/ravi_test_ast2.expected +++ b/ravi-tests/ravi_test_ast2.expected @@ -418,21 +418,16 @@ function() --[symbols] t --local symbol integer[] return - --[suffixed expr start] any + --[suffixed expr start] integer --[primary start] t --local symbol integer[] --[primary end] --[suffix list start] - --[Y index start] any + --[Y index start] integer [ 0 ] --[Y index end] - --[Y index start] any - [ - 1 - ] - --[Y index end] --[suffix list end] --[suffixed expr end] end @@ -457,3 +452,23 @@ function() --[suffixed expr end] end +function() + return + --[suffixed expr start] any + --[primary start] + x --global symbol ? + --[primary end] + --[suffix list start] + --[field selector start] any + . + 'y' + --[field selector end] + --[Y index start] any + [ + 1 + ] + --[Y index end] + --[suffix list end] + --[suffixed expr end] +end + diff --git a/ravi-tests/ravi_test_ast2.lua b/ravi-tests/ravi_test_ast2.lua index a1d7def..6507551 100644 --- a/ravi-tests/ravi_test_ast2.lua +++ b/ravi-tests/ravi_test_ast2.lua @@ -86,11 +86,16 @@ str= doast(str) str= -[[local t: integer[]; return t[0][1] +[[local t: integer[]; return t[0] ]] doast(str) str= [[return f()[1] ]] +doast(str) + +str= +[[return x.y[1] +]] doast(str) \ No newline at end of file diff --git a/src/ravi_ast_typecheck.c b/src/ravi_ast_typecheck.c index 323a8f4..043dcbd 100644 --- a/src/ravi_ast_typecheck.c +++ b/src/ravi_ast_typecheck.c @@ -139,11 +139,55 @@ static void typecheck_binaryop(struct ast_node *function, struct ast_node *node) } } +static bool is_unindexable_type(struct var_type *type) { + switch (type->type_code) { + case RAVI_TNUMFLT: + case RAVI_TNUMINT: + case RAVI_TBOOLEAN: + case RAVI_TNIL: + return true; + default: + return false; + } +} + +/* + * Suffixed expression examples: + * f()[1] + * x[1][2] + * x.y[1] + */ static void typecheck_suffixedexpr(struct ast_node *function, struct ast_node *node) { typecheck_ast_node(function, node->suffixed_expr.primary_expr); - if (node->suffixed_expr.suffix_list) { - typecheck_ast_list(function, node->suffixed_expr.suffix_list); + struct ast_node *prev_node = node->suffixed_expr.primary_expr; + struct ast_node *this_node; + FOR_EACH_PTR(node->suffixed_expr.suffix_list, this_node) { + typecheck_ast_node(function, this_node); + if (this_node->type == AST_Y_INDEX_EXPR) { + if (prev_node->common_expr.type.type_code == RAVI_TARRAYFLT) { + if (this_node->index_expr.expr->common_expr.type.type_code == RAVI_TNUMINT) { + set_typecode(this_node->index_expr.type, RAVI_TNUMFLT); + } + else { + // FIXME Error + } + } + else if (prev_node->common_expr.type.type_code == RAVI_TARRAYINT) { + if (this_node->index_expr.expr->common_expr.type.type_code == RAVI_TNUMINT) { + set_typecode(this_node->index_expr.type, RAVI_TNUMINT); + } + else { + // FIXME Error + } + } + else if (is_unindexable_type(&prev_node->common_expr.type)) { + // FIXME Error + } + } + prev_node = this_node; } + END_FOR_EACH_PTR(node); + copy_type(node->suffixed_expr.type, prev_node->common_expr.type); } /* Type checker - WIP */