2024-10-31 07:03:33 +00:00
|
|
|
/*
|
|
|
|
This file is part of TON Blockchain Library.
|
|
|
|
|
|
|
|
TON Blockchain Library is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU Lesser General Public License as published by
|
|
|
|
the Free Software Foundation, either version 2 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
TON Blockchain Library is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU Lesser General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Lesser General Public License
|
|
|
|
along with TON Blockchain Library. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
#include "ast.h"
|
|
|
|
#include "ast-stringifier.h"
|
|
|
|
#include <iostream>
|
|
|
|
|
|
|
|
namespace tolk {
|
|
|
|
|
|
|
|
static_assert(sizeof(ASTNodeBase) == 12);
|
|
|
|
|
|
|
|
#ifdef TOLK_DEBUG
|
|
|
|
|
|
|
|
std::string ASTNodeBase::to_debug_string(bool colored) const {
|
|
|
|
ASTStringifier s(colored);
|
|
|
|
return s.to_string_with_children(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ASTNodeBase::debug_print() const {
|
|
|
|
std::cerr << to_debug_string(true) << std::endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif // TOLK_DEBUG
|
|
|
|
|
|
|
|
UnexpectedASTNodeType::UnexpectedASTNodeType(AnyV v_unexpected, const char* place_where): v_unexpected(v_unexpected) {
|
|
|
|
message = "Unexpected ASTNodeType ";
|
|
|
|
#ifdef TOLK_DEBUG
|
|
|
|
message += ASTStringifier::ast_node_type_to_string(v_unexpected->type);
|
|
|
|
message += " ";
|
|
|
|
#endif
|
|
|
|
message += "in ";
|
|
|
|
message += place_where;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ASTNodeBase::error(const std::string& err_msg) const {
|
|
|
|
throw ParseError(loc, err_msg);
|
|
|
|
}
|
|
|
|
|
2024-10-31 07:11:41 +00:00
|
|
|
AnnotationKind Vertex<ast_annotation>::parse_kind(std::string_view name) {
|
|
|
|
if (name == "@pure") {
|
|
|
|
return AnnotationKind::pure;
|
|
|
|
}
|
|
|
|
if (name == "@inline") {
|
|
|
|
return AnnotationKind::inline_simple;
|
|
|
|
}
|
|
|
|
if (name == "@inline_ref") {
|
|
|
|
return AnnotationKind::inline_ref;
|
|
|
|
}
|
|
|
|
if (name == "@method_id") {
|
|
|
|
return AnnotationKind::method_id;
|
|
|
|
}
|
|
|
|
if (name == "@deprecated") {
|
|
|
|
return AnnotationKind::deprecated;
|
|
|
|
}
|
|
|
|
return AnnotationKind::unknown;
|
|
|
|
}
|
|
|
|
|
|
|
|
int Vertex<ast_genericsT_list>::lookup_idx(std::string_view nameT) const {
|
2024-10-31 07:03:33 +00:00
|
|
|
for (size_t idx = 0; idx < children.size(); ++idx) {
|
2024-10-31 07:11:41 +00:00
|
|
|
if (children[idx] && children[idx]->as<ast_genericsT_item>()->nameT == nameT) {
|
2024-10-31 07:03:33 +00:00
|
|
|
return static_cast<int>(idx);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2024-10-31 07:11:41 +00:00
|
|
|
int Vertex<ast_parameter_list>::lookup_idx(std::string_view param_name) const {
|
2024-10-31 07:03:33 +00:00
|
|
|
for (size_t idx = 0; idx < children.size(); ++idx) {
|
[Tolk] AST-based semantic analysis, get rid of Expr
This is a huge refactoring focusing on untangling compiler internals
(previously forked from FunC).
The goal is to convert AST directly to Op (a kind of IR representation),
doing all code analysis at AST level.
Noteable changes:
- AST-based semantic kernel includes: registering global symbols,
scope handling and resolving local/global identifiers,
lvalue/rvalue calc and check, implicit return detection,
mutability analysis, pure/impure validity checks,
simple constant folding
- values of `const` variables are calculated NOT based on CodeBlob,
but via a newly-introduced AST-based constant evaluator
- AST vertices are now inherited from expression/statement/other;
expression vertices have common properties (TypeExpr, lvalue/rvalue)
- symbol table is rewritten completely, SymDef/SymVal no longer exist,
lexer now doesn't need to register identifiers
- AST vertices have references to symbols, filled at different
stages of pipeline
- the remaining "FunC legacy part" is almost unchanged besides Expr
which was fully dropped; AST is converted to Ops (IR) directly
2024-12-16 18:19:45 +00:00
|
|
|
if (children[idx] && children[idx]->as<ast_parameter>()->param_name == param_name) {
|
2024-10-31 07:03:33 +00:00
|
|
|
return static_cast<int>(idx);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2024-10-31 07:18:54 +00:00
|
|
|
int Vertex<ast_parameter_list>::get_mutate_params_count() const {
|
|
|
|
int n = 0;
|
|
|
|
for (AnyV param : children) {
|
|
|
|
if (param->as<ast_parameter>()->declared_as_mutate) {
|
|
|
|
n++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return n;
|
|
|
|
}
|
|
|
|
|
[Tolk] AST-based semantic analysis, get rid of Expr
This is a huge refactoring focusing on untangling compiler internals
(previously forked from FunC).
The goal is to convert AST directly to Op (a kind of IR representation),
doing all code analysis at AST level.
Noteable changes:
- AST-based semantic kernel includes: registering global symbols,
scope handling and resolving local/global identifiers,
lvalue/rvalue calc and check, implicit return detection,
mutability analysis, pure/impure validity checks,
simple constant folding
- values of `const` variables are calculated NOT based on CodeBlob,
but via a newly-introduced AST-based constant evaluator
- AST vertices are now inherited from expression/statement/other;
expression vertices have common properties (TypeExpr, lvalue/rvalue)
- symbol table is rewritten completely, SymDef/SymVal no longer exist,
lexer now doesn't need to register identifiers
- AST vertices have references to symbols, filled at different
stages of pipeline
- the remaining "FunC legacy part" is almost unchanged besides Expr
which was fully dropped; AST is converted to Ops (IR) directly
2024-12-16 18:19:45 +00:00
|
|
|
// ---------------------------------------------------------
|
|
|
|
// "assign" methods
|
|
|
|
//
|
|
|
|
// From the user's point of view, all AST vertices are constant, fields are public, but can't be modified.
|
|
|
|
// The only way to modify a field is to call "mutate()" and then use these "assign_*" methods.
|
|
|
|
// Therefore, there is a guarantee, that all AST mutations are done via these methods,
|
|
|
|
// easily searched by usages, and there is no another way to modify any other field.
|
|
|
|
|
|
|
|
void ASTNodeExpressionBase::assign_inferred_type(TypeExpr* type) {
|
|
|
|
this->inferred_type = type;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ASTNodeExpressionBase::assign_rvalue_true() {
|
|
|
|
this->is_rvalue = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ASTNodeExpressionBase::assign_lvalue_true() {
|
|
|
|
this->is_lvalue = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Vertex<ast_identifier>::assign_sym(const Symbol* sym) {
|
|
|
|
this->sym = sym;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Vertex<ast_self_keyword>::assign_param_ref(const LocalVarData* self_param) {
|
|
|
|
this->param_ref = self_param;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Vertex<ast_function_call>::assign_fun_ref(const FunctionData* fun_ref) {
|
|
|
|
this->fun_maybe = fun_ref;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Vertex<ast_dot_method_call>::assign_fun_ref(const FunctionData* fun_ref) {
|
|
|
|
this->fun_ref = fun_ref;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Vertex<ast_global_var_declaration>::assign_var_ref(const GlobalVarData* var_ref) {
|
|
|
|
this->var_ref = var_ref;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Vertex<ast_constant_declaration>::assign_const_ref(const GlobalConstData* const_ref) {
|
|
|
|
this->const_ref = const_ref;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Vertex<ast_parameter>::assign_param_ref(const LocalVarData* param_ref) {
|
|
|
|
this->param_ref = param_ref;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Vertex<ast_function_declaration>::assign_fun_ref(const FunctionData* fun_ref) {
|
|
|
|
this->fun_ref = fun_ref;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Vertex<ast_local_var>::assign_var_ref(const Symbol* var_ref) {
|
|
|
|
this->var_maybe = var_ref;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Vertex<ast_import_statement>::assign_src_file(const SrcFile* file) {
|
|
|
|
this->file = file;
|
2024-10-31 07:04:58 +00:00
|
|
|
}
|
|
|
|
|
2024-10-31 07:03:33 +00:00
|
|
|
} // namespace tolk
|