2#ifndef INCLUDED_ANALISIS_CPP_
3#define INCLUDED_ANALISIS_CPP_
114 template <
typename T>
121 while (pos < format.size()) {
122 if (format[pos] ==
'{' && pos + 1 < format.size() && format[pos + 1] ==
'{') {
126 }
else if (format[pos] ==
'}' && pos + 1 < format.size() && format[pos + 1] ==
'}') {
130 }
else if (format[pos] ==
'{') {
134 while (pos < format.size()) {
135 if (format[pos] ==
'{') {
136 LOG_RUNTIME(
"Unexpected opening bracket '%s' at position %d!", format.begin(), pos);
138 if (format[pos] ==
'}') {
142 if (isalpha(format[pos]) || format[pos] ==
'_') {
143 while (name < format.size()) {
144 if (isalnum(format[name]) || format[name] ==
'_') {
153 std::string arg_name(&format[pos], name - pos + 1);
155 auto found = args.find(arg_name);
156 if (found == args.end()) {
157 LOG_RUNTIME(
"Argument name '%s' not found!", arg_name.c_str());
159 result += std::to_string(std::distance(args.begin(), found));
166 LOG_RUNTIME(
"Closing bracket in '%s' for position %d not found!", format.begin(), name - 1);
bool CheckCall(TermPtr &proto, TermPtr &call, NameLookupStack &stack)
bool UpcastOpType(TermPtr &op)
bool CheckAssignRef(TermPtr &left, TermPtr &right, NameLookupStack &stack)
bool CheckMatching_(TermPtr &term, NameLookupStack &stack)
bool CreateVar(TermPtr &var, TermPtr &value, NameLookupStack &stack)
bool RecursiveAnalyzer(TermPtr term, NameLookupStack &stack)
static bool CheckStrPrintf(const std::string_view format, TermPtr args, int start)
bool CheckArgs_(TermPtr proto, TermPtr args)
bool CheckItems_(TermPtr &term, NameLookupStack &stack)
bool AssignVar(TermPtr &var, TermPtr &value, NameLookupStack &stack)
bool CheckName(TermPtr &term)
static std::string ConvertToVFormat_(const std::string_view format, T &args)
AstAnalysis(RunTime &rt, Diag *diag)
bool CheckReference(TermPtr &term, const TermPtr &test_ref)
AstAnalysis(const AstAnalysis &)=delete
static std::string MakeInclude(const TermPtr &ast)
TermPtr LookupName(TermPtr &term, NameLookupStack &stack)
TermPtr CheckGetValue_(TermPtr &obj, NameLookupStack &stack)
bool CheckDoWhile_(TermPtr &term, NameLookupStack &stack)
bool CreateOp_(TermPtr &term, NameLookupStack &stack)
bool CheckNative_(TermPtr &term)
bool CheckCallArg(TermPtr &call, size_t arg_pos, NameLookupStack &stack)
TermPtr CalcSummaryType(const TermPtr &term, NameLookupStack &stack)
bool Analyze(TermPtr term, NameLookupStack *stack_ptr=nullptr)
const AstAnalysis & operator=(const AstAnalysis &)=delete
bool CheckWith_(TermPtr &term, NameLookupStack &stack)
void CheckDims(TermPtr &dims, NameLookupStack &stack, bool allow_none, bool allow_ellipsis)
bool CheckOp(TermPtr &term)
bool CheckArgsType_(TermPtr proto, TermPtr value)
bool CheckIndex_(TermPtr &term, TermPtr &index, TermPtr &value, NameLookupStack &stack)
bool CheckSetValue_(TermPtr &obj, TermPtr &value, NameLookupStack &stack)
bool CheckError(bool result)
bool CkeckRange_(TermPtr &term, NameLookupStack &stack)
bool CheckWhile_(TermPtr &term, NameLookupStack &stack)
bool CheckTake_(TermPtr &term, NameLookupStack &stack)
bool CheckFollow_(TermPtr &term, NameLookupStack &stack)
static fmt::dynamic_format_arg_store< fmt::format_context > MakeFormatArgs(TermPtr args, RunTime *rt)
TermPtr CheckField_(TermPtr &term, TermPtr &field, NameLookupStack &stack)
static std::string MakeFormat(const std::string_view format, TermPtr args, RunTime *rt)
bool CalcType(TermPtr &term)
bool CheckOpType(TermPtr &op, TermPtr &left, const TermPtr right)
static bool CheckStrFormat(const std::string_view format, TermPtr args, RunTime *rt)
bool Iterator_(TermPtr &term, NameLookupStack &stack)
#define LOG_RUNTIME(format,...)
#define ASSERT(condition)
std::shared_ptr< Term > TermPtr
std::vector< TermPtr > BlockType