NewLang Project
Yet another programm language
Loading...
Searching...
No Matches
analysis.h
Go to the documentation of this file.
1#pragma once
2#ifndef INCLUDED_ANALISIS_CPP_
3#define INCLUDED_ANALISIS_CPP_
4
5//#include "pch.h"
6
7#include <sys/time.h>
8
9#include "fmt/core.h"
10#include "fmt/args.h"
11
12#include "nlc-rt.h"
13
14#include "term.h"
15#include "builtin.h"
16//#include <types.h>
17//#include <object.h>
18#include "parser.h"
19#include "module.h"
20
21
22namespace newlang {
23
25 protected:
26
27 AstAnalysis(const AstAnalysis&) = delete;
28 const AstAnalysis& operator=(const AstAnalysis&) = delete;
29 public:
30
33
34 AstAnalysis(RunTime &rt, Diag* diag) : m_rt(rt), m_diag(diag) {
35
36 }
37
38 static std::string MakeInclude(const TermPtr &ast);
39
40 /*
41 * При раскрытии области видимости объектов и проверки корректности их имен,
42 * нужно одновремно регистрировать глобальные и локальные переменные,
43 * так как nameloockup выполняется последовательно и если создавать переменные позже,
44 * то обращение может произойти к неправильным переменным
45 * (либо будет неправильное перекрытие, либо ошибка, т.к. переменная еще не создана).
46 *
47 * А если регистрировать не только глобальные, но и локальные объекты,
48 * тогда в функцию анализатора нужно передавать и объект - владалец локальных переменных.
49 * Точнее он уже есть, это либо глоальныей корень для переменных и функций модуля,
50 * либо глобальные объекты - функции с собственными локальными переменными.
51 * m_variables
52 */
53 bool Analyze(TermPtr term, NameLookupStack *stack_ptr = nullptr);
54 bool Analyze(BlockType &block, NameLookupStack *stack_ptr = nullptr);
55
56 bool RecursiveAnalyzer(TermPtr term, NameLookupStack &stack);
57 bool CreateOp_(TermPtr &term, NameLookupStack &stack);
58 bool CreateVar(TermPtr &var, TermPtr &value, NameLookupStack &stack);
59 bool AssignVar(TermPtr &var, TermPtr &value, NameLookupStack &stack);
60 bool Iterator_(TermPtr &term, NameLookupStack &stack);
61
62 TermPtr CheckField_(TermPtr &term, TermPtr &field, NameLookupStack &stack);
63 bool CheckIndex_(TermPtr &term, TermPtr &index, TermPtr &value, NameLookupStack &stack);
64 bool CheckItems_(TermPtr &term, NameLookupStack &stack);
65
67 bool CheckSetValue_(TermPtr &obj, TermPtr &value, NameLookupStack &stack);
68
70 bool CheckNative_(TermPtr &term);
71
77 bool CheckError(bool result);
78
79 bool CheckName(TermPtr &term);
80 bool CheckOp(TermPtr &term);
81 bool CalcType(TermPtr &term);
82 bool UpcastOpType(TermPtr &op);
83 bool CheckOpType(TermPtr &op, TermPtr &left, const TermPtr right);
84 bool CheckReference(TermPtr &term, const TermPtr &test_ref);
85 bool CheckAssignRef(TermPtr &left, TermPtr &right, NameLookupStack & stack);
86 bool CheckCall(TermPtr &proto, TermPtr &call, NameLookupStack & stack);
87 bool CheckCallArg(TermPtr &call, size_t arg_pos, NameLookupStack & stack);
88 void CheckDims(TermPtr &dims, NameLookupStack & stack, bool allow_none, bool allow_ellipsis);
89 bool CkeckRange_(TermPtr &term, NameLookupStack & stack);
90 bool CheckFollow_(TermPtr &term, NameLookupStack & stack);
91 bool CheckWhile_(TermPtr &term, NameLookupStack & stack);
92 bool CheckDoWhile_(TermPtr &term, NameLookupStack & stack);
93 bool CheckMatching_(TermPtr &term, NameLookupStack & stack);
94 bool CheckWith_(TermPtr &term, NameLookupStack & stack);
95 bool CheckTake_(TermPtr &term, NameLookupStack & stack);
96
97 bool CheckNative_(TermPtr &proto, TermPtr &term);
98
99 bool CheckArgsType_(TermPtr proto, TermPtr value);
100 bool CheckArgs_(TermPtr proto, TermPtr args);
101
102
103 static bool CheckStrPrintf(const std::string_view format, TermPtr args, int start);
104 static bool CheckStrFormat(const std::string_view format, TermPtr args, RunTime * rt);
105 static std::string MakeFormat(const std::string_view format, TermPtr args, RunTime * rt);
106 static fmt::dynamic_format_arg_store<fmt::format_context> MakeFormatArgs(TermPtr args, RunTime * rt);
107 // template <typename T> static std::string ConvertToVFormat_(const std::string_view format, T args);
108
109 /*
110 * $template := "{name} {0}"; # std::format equivalent "{1} {0}"
111 * $result := $template("шаблон", name = "Строка"); # result = "Строка шаблон"
112 */
113
114 template <typename T>
115 static std::string ConvertToVFormat_(const std::string_view format, T & args) {
116 // if (args.m_id != TermID::DICT) {
117 // LOG_RUNTIME("ConvertToFormat requires arguments!");
118 // }
119 std::string result;
120 int pos = 0;
121 while (pos < format.size()) {
122 if (format[pos] == '{' && pos + 1 < format.size() && format[pos + 1] == '{') {
123 // Escaped text in doubling {{
124 result += "{{";
125 pos += 1;
126 } else if (format[pos] == '}' && pos + 1 < format.size() && format[pos + 1] == '}') {
127 // Escaped text in doubling }}
128 result += "}}";
129 pos += 1;
130 } else if (format[pos] == '{') {
131 pos += 1;
132 int name = pos;
133 result += '{';
134 while (pos < format.size()) {
135 if (format[pos] == '{') {
136 LOG_RUNTIME("Unexpected opening bracket '%s' at position %d!", format.begin(), pos);
137 }
138 if (format[pos] == '}') {
139 result += '}';
140 goto done;
141 }
142 if (isalpha(format[pos]) || format[pos] == '_') {
143 while (name < format.size()) {
144 if (isalnum(format[name]) || format[name] == '_') {
145 name++;
146 } else {
147 name -= 1;
148 break;
149 }
150 }
151
152 ASSERT(name > pos);
153 std::string arg_name(&format[pos], name - pos + 1);
154
155 auto found = args.find(arg_name);
156 if (found == args.end()) {
157 LOG_RUNTIME("Argument name '%s' not found!", arg_name.c_str());
158 }
159 result += std::to_string(std::distance(args.begin(), found));
160 pos += (name - pos);
161 } else {
162 result += format[pos];
163 }
164 pos++;
165 }
166 LOG_RUNTIME("Closing bracket in '%s' for position %d not found!", format.begin(), name - 1);
167 } else {
168 result += format[pos];
169 }
170done:
171 pos++;
172 }
173 return result;
174 }
175
176 TermPtr CalcSummaryType(const TermPtr &term, NameLookupStack & stack);
177
178 protected:
179
180 public:
181
182 };
183}
184
185
186#endif //INCLUDED_ANALISIS_CPP_
bool CheckCall(TermPtr &proto, TermPtr &call, NameLookupStack &stack)
Definition analysis.cpp:891
bool UpcastOpType(TermPtr &op)
Definition analysis.cpp:173
bool CheckAssignRef(TermPtr &left, TermPtr &right, NameLookupStack &stack)
Definition analysis.cpp:803
bool CheckMatching_(TermPtr &term, NameLookupStack &stack)
Definition analysis.cpp:323
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)
Definition analysis.cpp:57
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)
Definition analysis.h:115
AstAnalysis(RunTime &rt, Diag *diag)
Definition analysis.h:34
bool CheckReference(TermPtr &term, const TermPtr &test_ref)
Definition analysis.cpp:874
AstAnalysis(const AstAnalysis &)=delete
static std::string MakeInclude(const TermPtr &ast)
TermPtr LookupName(TermPtr &term, NameLookupStack &stack)
TermPtr CheckGetValue_(TermPtr &obj, NameLookupStack &stack)
Definition analysis.cpp:487
bool CheckDoWhile_(TermPtr &term, NameLookupStack &stack)
Definition analysis.cpp:308
bool CreateOp_(TermPtr &term, NameLookupStack &stack)
Definition analysis.cpp:568
bool CheckNative_(TermPtr &term)
bool CheckCallArg(TermPtr &call, size_t arg_pos, NameLookupStack &stack)
TermPtr CalcSummaryType(const TermPtr &term, NameLookupStack &stack)
Definition analysis.cpp:193
bool Analyze(TermPtr term, NameLookupStack *stack_ptr=nullptr)
const AstAnalysis & operator=(const AstAnalysis &)=delete
bool CheckWith_(TermPtr &term, NameLookupStack &stack)
Definition analysis.cpp:328
void CheckDims(TermPtr &dims, NameLookupStack &stack, bool allow_none, bool allow_ellipsis)
bool CheckOp(TermPtr &term)
bool CheckArgsType_(TermPtr proto, TermPtr value)
Definition analysis.cpp:38
bool CheckIndex_(TermPtr &term, TermPtr &index, TermPtr &value, NameLookupStack &stack)
Definition analysis.cpp:500
bool CheckSetValue_(TermPtr &obj, TermPtr &value, NameLookupStack &stack)
Definition analysis.cpp:491
bool CheckError(bool result)
bool CkeckRange_(TermPtr &term, NameLookupStack &stack)
Definition analysis.cpp:345
bool CheckWhile_(TermPtr &term, NameLookupStack &stack)
Definition analysis.cpp:286
bool CheckTake_(TermPtr &term, NameLookupStack &stack)
Definition analysis.cpp:333
bool CheckFollow_(TermPtr &term, NameLookupStack &stack)
Definition analysis.cpp:257
static fmt::dynamic_format_arg_store< fmt::format_context > MakeFormatArgs(TermPtr args, RunTime *rt)
TermPtr CheckField_(TermPtr &term, TermPtr &field, NameLookupStack &stack)
Definition analysis.cpp:495
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)
Definition analysis.cpp:439
static bool CheckStrFormat(const std::string_view format, TermPtr args, RunTime *rt)
bool Iterator_(TermPtr &term, NameLookupStack &stack)
Definition analysis.cpp:429
int result
Definition lexer.l:367
#define LOG_RUNTIME(format,...)
Definition logger.h:26
#define ASSERT(condition)
Definition logger.h:60
Definition nlc.h:59
std::shared_ptr< Term > TermPtr
Definition variable.h:33
std::vector< TermPtr > BlockType
Definition types.h:239