issue #98 more on suffixed expr typechecks

pull/168/head
Dibyendu Majumdar 5 years ago
parent cf7f4b33c0
commit e2f91553b6

@ -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

@ -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

@ -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)

@ -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 */

Loading…
Cancel
Save