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() function()
return return
--[binary expr start] any --[binary expr start] number
--[suffixed expr start] any --[suffixed expr start] integer
--[primary start] --[primary start]
--[binary expr start] integer --[binary expr start] integer
1 1
@ -132,7 +132,7 @@ function()
--[primary end] --[primary end]
--[suffixed expr end] --[suffixed expr end]
^ ^
--[suffixed expr start] any --[suffixed expr start] integer
--[primary start] --[primary start]
--[binary expr start] integer --[binary expr start] integer
50 50
@ -149,8 +149,8 @@ end
]] ]]
function() function()
return return
--[binary expr start] any --[binary expr start] number
--[suffixed expr start] any --[suffixed expr start] integer
--[primary start] --[primary start]
--[unary expr start] integer --[unary expr start] integer
- -
@ -159,7 +159,7 @@ function()
--[primary end] --[primary end]
--[suffixed expr end] --[suffixed expr end]
^ ^
--[suffixed expr start] any --[suffixed expr start] integer
--[primary start] --[primary start]
--[binary expr start] integer --[binary expr start] integer
31 31
@ -177,7 +177,7 @@ end
function() function()
return return
--[binary expr start] any --[binary expr start] any
--[suffixed expr start] any --[suffixed expr start] number
--[primary start] --[primary start]
--[binary expr start] number --[binary expr start] number
--[unary expr start] number --[unary expr start] number
@ -218,26 +218,26 @@ end
]] ]]
function() function()
return return
--[binary expr start] any --[binary expr start] number
--[binary expr start] any --[binary expr start] number
--[binary expr start] any --[binary expr start] number
--[unary expr start] any --[unary expr start] number
- -
--[suffixed expr start] any --[suffixed expr start] number
--[primary start] --[primary start]
--[binary expr start] any --[binary expr start] number
--[suffixed expr start] any --[suffixed expr start] number
--[primary start] --[primary start]
--[binary expr start] any --[binary expr start] number
--[binary expr start] number --[binary expr start] number
2.0000000000000000 2.0000000000000000
^ ^
8 8
--[binary expr end] --[binary expr end]
+ +
--[unary expr start] any --[unary expr start] integer
- -
--[suffixed expr start] any --[suffixed expr start] integer
--[primary start] --[primary start]
--[unary expr start] integer --[unary expr start] integer
- -
@ -274,23 +274,23 @@ function()
--[binary expr start] any --[binary expr start] any
--[binary expr start] any --[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] --[primary start]
--[binary expr start] any --[binary expr start] number
--[suffixed expr start] any --[suffixed expr start] number
--[primary start] --[primary start]
--[binary expr start] any --[binary expr start] number
--[binary expr start] number --[binary expr start] number
2 2
^ ^
8 8
--[binary expr end] --[binary expr end]
+ +
--[unary expr start] any --[unary expr start] integer
- -
--[suffixed expr start] any --[suffixed expr start] integer
--[primary start] --[primary start]
--[unary expr start] integer --[unary expr start] integer
- -
@ -383,11 +383,11 @@ end
]] ]]
function() function()
return return
--[binary expr start] any --[binary expr start] integer
--[suffixed expr start] any --[suffixed expr start] integer
--[primary start] --[primary start]
--[binary expr start] any --[binary expr start] integer
--[suffixed expr start] any --[suffixed expr start] integer
--[primary start] --[primary start]
--[binary expr start] integer --[binary expr start] integer
100 100
@ -414,7 +414,7 @@ end
]] ]]
function() function()
return return
--[binary expr start] any --[binary expr start] boolean
--[binary expr start] number --[binary expr start] number
2 2
^ ^
@ -425,10 +425,10 @@ function()
--[binary expr end] --[binary expr end]
--[binary expr end] --[binary expr end]
== ==
--[binary expr start] any --[binary expr start] number
2 2
^ ^
--[suffixed expr start] any --[suffixed expr start] number
--[primary start] --[primary start]
--[binary expr start] number --[binary expr start] number
3 3
@ -446,7 +446,7 @@ end
]] ]]
function() function()
return return
--[binary expr start] any --[binary expr start] boolean
--[binary expr start] number --[binary expr start] number
--[binary expr start] number --[binary expr start] number
2 2
@ -457,8 +457,8 @@ function()
4 4
--[binary expr end] --[binary expr end]
== ==
--[binary expr start] any --[binary expr start] number
--[suffixed expr start] any --[suffixed expr start] number
--[primary start] --[primary start]
--[binary expr start] number --[binary expr start] number
2 2
@ -618,9 +618,9 @@ function()
--[unary expr end] --[unary expr end]
--[binary expr end] --[binary expr end]
and and
--[binary expr start] any --[binary expr start] boolean
--[binary expr start] any --[binary expr start] number
--[suffixed expr start] any --[suffixed expr start] integer
--[primary start] --[primary start]
--[unary expr start] integer --[unary expr start] integer
- -
@ -742,7 +742,7 @@ function()
--[binary expr start] any --[binary expr start] any
--[unary expr start] any --[unary expr start] any
not not
--[suffixed expr start] any --[suffixed expr start] boolean
--[primary start] --[primary start]
--[binary expr start] boolean --[binary expr start] boolean
--[binary expr start] integer --[binary expr start] integer
@ -978,7 +978,7 @@ function()
== ==
--[binary expr start] any --[binary expr start] any
--[binary expr start] any --[binary expr start] any
--[suffixed expr start] any --[suffixed expr start] integer
--[primary start] --[primary start]
--[unary expr start] integer --[unary expr start] integer
- -
@ -993,7 +993,7 @@ function()
--[suffixed expr start] any --[suffixed expr start] any
--[primary start] --[primary start]
--[binary expr start] any --[binary expr start] any
--[suffixed expr start] any --[suffixed expr start] integer
--[primary start] --[primary start]
--[binary expr start] integer --[binary expr start] integer
4 4
@ -1003,12 +1003,12 @@ function()
--[primary end] --[primary end]
--[suffixed expr end] --[suffixed expr end]
// //
--[suffixed expr start] any --[suffixed expr start] number
--[primary start] --[primary start]
--[binary expr start] any --[binary expr start] number
2 2
^ ^
--[suffixed expr start] any --[suffixed expr start] number
--[primary start] --[primary start]
--[binary expr start] number --[binary expr start] number
3 3
@ -1030,10 +1030,10 @@ function()
--[suffixed expr end] --[suffixed expr end]
--[binary expr end] --[binary expr end]
+ +
--[suffixed expr start] any --[suffixed expr start] number
--[primary start] --[primary start]
--[binary expr start] any --[binary expr start] number
--[suffixed expr start] any --[suffixed expr start] integer
--[primary start] --[primary start]
--[binary expr start] integer --[binary expr start] integer
4 4
@ -1292,7 +1292,7 @@ function()
--[suffixed expr start] any --[suffixed expr start] any
--[primary start] --[primary start]
--[binary expr start] any --[binary expr start] any
--[suffixed expr start] any --[suffixed expr start] boolean
--[primary start] --[primary start]
--[binary expr start] boolean --[binary expr start] boolean
2 2

@ -418,21 +418,16 @@ function()
--[symbols] --[symbols]
t --local symbol integer[] t --local symbol integer[]
return return
--[suffixed expr start] any --[suffixed expr start] integer
--[primary start] --[primary start]
t --local symbol integer[] t --local symbol integer[]
--[primary end] --[primary end]
--[suffix list start] --[suffix list start]
--[Y index start] any --[Y index start] integer
[ [
0 0
] ]
--[Y index end] --[Y index end]
--[Y index start] any
[
1
]
--[Y index end]
--[suffix list end] --[suffix list end]
--[suffixed expr end] --[suffixed expr end]
end end
@ -457,3 +452,23 @@ function()
--[suffixed expr end] --[suffixed expr end]
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) doast(str)
str= str=
[[local t: integer[]; return t[0][1] [[local t: integer[]; return t[0]
]] ]]
doast(str) doast(str)
str= str=
[[return f()[1] [[return f()[1]
]] ]]
doast(str)
str=
[[return x.y[1]
]]
doast(str) 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) { static void typecheck_suffixedexpr(struct ast_node *function, struct ast_node *node) {
typecheck_ast_node(function, node->suffixed_expr.primary_expr); typecheck_ast_node(function, node->suffixed_expr.primary_expr);
if (node->suffixed_expr.suffix_list) { struct ast_node *prev_node = node->suffixed_expr.primary_expr;
typecheck_ast_list(function, node->suffixed_expr.suffix_list); 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 */ /* Type checker - WIP */

Loading…
Cancel
Save