Mana
SymbolFactory.h
Go to the documentation of this file.
1 
8 #pragma once
9 #include "../runner/common/Setup.h"
10 #include "StringPool.h"
11 #include "Symbol.h"
12 #include "TypeDescriptorFactory.h"
13 #include <functional>
14 #include <iosfwd>
15 #include <memory>
16 #include <stack>
17 #include <unordered_map>
18 #include <vector>
19 
20 namespace mana
21 {
22  class CodeBuffer;
23  class CodeGenerator;
24  class DataBuffer;
25  class StringPool;
26  class Symbol;
27  class SyntaxNode;
28  class TypeDescriptorFactory;
29 
30  /*
31  シンボルを生成します
32  */
33  class SymbolFactory final : Noncopyable
34  {
35  public:
36  // deprecated
37  static bool IsValid(const std::shared_ptr<Symbol>& symbolEntry);
38 
39 
41  const std::shared_ptr<CodeBuffer>& codeBuffer,
42  const std::shared_ptr<DataBuffer>& dataBuffer,
43  const std::shared_ptr<StringPool>& stringPool,
44  const std::shared_ptr<TypeDescriptorFactory>& typeDescriptorFactory
45  );
46  ~SymbolFactory() = default;
47 
48  // create symbol
49  std::shared_ptr<Symbol> CreateConstInt(const std::string_view name, const int32_t value);
50  std::shared_ptr<Symbol> CreateConstBool(const std::string_view name, const bool value);
51  std::shared_ptr<Symbol> CreateConstFloat(const std::string_view name, const float value);
52  std::shared_ptr<Symbol> CreateConstString(const std::string_view name, const std::string_view text);
53  std::shared_ptr<Symbol> CreateVariable(const std::string_view name, const std::shared_ptr<TypeDescriptor>& type, const bool staticVariable, const bool isBlockOpened, const bool isFunctionOpened);
54  std::shared_ptr<Symbol> CreateLabel(const std::string_view name);
55  std::shared_ptr<Symbol> CreateFunction(const std::string_view name, const bool isActorOrStructOpened);
56  std::shared_ptr<Symbol> CreateType(const std::string_view name, const std::shared_ptr<TypeDescriptor>& type);
57  void Destroy(const std::string_view name);
58 
59  bool Each(const std::function<bool(const std::shared_ptr<Symbol>&)>& function) const
60  {
61  for (auto& symbol : mSymbolEntries)
62  {
63  if (!function(symbol))
64  return false;
65  }
66  return true;
67  }
68 
69  // Find
70  std::shared_ptr<Symbol> Lookup(const std::string_view name) const;
71  //std::shared_ptr<Symbol> LookupOrCreateDummy(const std::string_view name);
72 
73  void Define(const std::string_view name, const std::shared_ptr<Symbol>& symbolEntry);
74  void Define(const std::shared_ptr<Symbol>& symbolEntry);
75  void Undefine(const std::string_view name);
76  void Undefine(const std::shared_ptr<Symbol>& symbolEntry);
77 
78  // Block management
79  void OpenBlock(const int32_t address);
80  int32_t CloseBlock();
81  size_t GetBlockDepth() const;
82  void EachBlock(const std::function<void(const std::shared_ptr<Symbol>&)>& function);
83 
84 
85  // TODO:相応しい名前か検討して下さい
86  void ExtendModule(const std::shared_ptr<Symbol>& symbol);
87 
88  void RegisterToBlock(const std::shared_ptr<Symbol>& symbolEntry);
89  void RegisterToBlock(const std::shared_ptr<TypeDescriptor>& typeDescriptor);
90 
91  std::shared_ptr<Symbol> GetLastSymbolEntryInBlock() const;
92  std::shared_ptr<TypeDescriptor> GetLastTypeDescriptorInBlock() const;
93 
94 
95 
97  int32_t OpenBlock(const bool resetMaxFrameMemoryAddress);
98  bool IsOpenBlock() const;
99 
101  // function
102  void OpenFunction(const std::shared_ptr<SyntaxNode>& node, const bool is_action);
103  void OpenFunction2(const std::shared_ptr<const Symbol>& function) const;
104  void CloseFunction(const std::shared_ptr<SyntaxNode>& node, const bool is_action);
105  bool IsFunctionOpened() const { return mIsFunctionOpened; }
106 
107  void BeginNativeFunction();
108  void CloseNativeFunction(const std::shared_ptr<Symbol>& function, const std::shared_ptr<TypeDescriptor>& type);
109 
111  // struct
113  void CommitRegistrationStructure(const std::string_view name);
114  void OpenStructure(const std::string_view name);
115  void CloseStructure();
116 
118  // actor
119  void BeginRegistrationActor(const std::shared_ptr<Symbol>& symbolEntry);
120  void CommitRegistrationActor(const std::string_view name, const std::shared_ptr<TypeDescriptor>& type, const bool phantom);
121  bool IsActorOrStructerOpened() const;
122 
123  void OpenActor(const std::string_view name);
124  void CloseActor();
125  size_t GetNumberOfActors() const;
126 
128  // module
129  void BeginRegistrationModule(const std::shared_ptr<Symbol>& symbolEntry);
130  void CommitRegistrationModule(const std::string_view name);
131 
132  void OpenModule(const std::shared_ptr<Symbol>& symbolEntry);
133  void CloseModule(const std::string_view name);
134  bool IsModuleOpened() const { return mModuleBlockOpened; }
135 
136  void ExtendModule(const std::string_view name);
137 
138 
140  // TODO 適切な関数名を検討して下さい
141  std::shared_ptr<TypeDescriptor> GetCurrentBlockTypeDescriptor() const
142  {
143  return mBlockTypeDescriptor.top();
144  }
145 
147 
148  void AddRequest(const std::shared_ptr<CodeGenerator>& codeGenerator, const IntermediateLanguage opcode, const std::shared_ptr<SyntaxNode>& level, const std::shared_ptr<SyntaxNode>& actor, const std::string_view action) const;
149  void AddJoin(const std::shared_ptr<CodeGenerator>& codeGenerator, const std::shared_ptr<SyntaxNode>& level, const std::shared_ptr<SyntaxNode>& actor) const;
150 
151  void AllocateMemory(const std::shared_ptr<Symbol>& symbolEntry, std::shared_ptr<TypeDescriptor> type, Symbol::MemoryTypeId);
152 
153 
154  //const std::shared_ptr<Symbol>& symbol_get_head_symbol();
155 
156  int32_t GetStaticMemoryAddress() const;
157  void SetStaticMemoryAddress(const int32_t size);
158 
159  int32_t GetGlobalMemoryAddress() const;
160  void SetGlobalMemoryAddress(const int32_t size);
161 
162  void CheckUndefine() const;
163 
165  bool GenerateActorInformation(OutputStream& stream) const;
166 
167 
168 
169 
170  void symbol_open_actor_register_member(const std::shared_ptr<Symbol>& symbol);
171  static void symbol_open_actor_register_member(const std::shared_ptr<TypeDescriptor>& typeDescriptor);
172 
173 
174 
175 
177  {
178  return mReturnAddressList;
179  }
180 
181  void SetReturnAddressList(const address_t returnAddressList)
182  {
183  mReturnAddressList = returnAddressList;
184  }
185 
187  // Dump
188  void Dump(std::ofstream& output) const;
189  void DumpFunctionNameFromAddress(std::ofstream& output, const int32_t address) const;
190  void WritePublicTypeDecl(std::ofstream& output) const;
191 
193  // debug
194  void PrintFooter(const std::string_view, const std::shared_ptr<TypeDescriptor>& type);
195  void PrintEntry(const std::shared_ptr<Symbol>& symbolEntry, const std::shared_ptr<TypeDescriptor>& type);
196  void PrintDummyGlobalVariable(size_t size);
197 
198  private:
199  std::shared_ptr<Symbol> CreateSymbol(const std::string_view name, const Symbol::ClassTypeId class_type);
200  std::shared_ptr<Symbol> CreateSymbolWithAddress(const std::string_view name, const Symbol::ClassTypeId class_type, const int32_t address);
201  std::shared_ptr<Symbol> CreateSymbolWithLevel(const std::string_view name, Symbol::ClassTypeId class_type, const size_t blockLevel);
202 
203 
204  bool GenerateActorEntity(OutputStream& stream, const std::shared_ptr<const Symbol>& symbol, const std::shared_ptr<const TypeDescriptor>& type) const;
205 
206  static int32_t AlignSize(const int32_t X, const int32_t Y)
207  {
208  return (X + Y - 1) / Y * Y;
209  }
210 
211 
212  private:
213  std::shared_ptr<CodeBuffer> mCodeBuffer;
214  std::shared_ptr<DataBuffer> mDataBuffer;
215  std::shared_ptr<StringPool> mStringPool;
216  std::shared_ptr<TypeDescriptorFactory> mTypeDescriptorFactory;
217 
218  std::unordered_map<std::string_view, std::shared_ptr<Symbol>> mHashChainTable;
219  std::vector<std::shared_ptr<Symbol>> mSymbolEntries;
220 
221  struct BlockEntry final
222  {
223  BlockEntry() = default;
224  void Set(const std::shared_ptr<Symbol>& symbolEntry)
225  {
226  mSymbolEntry = symbolEntry;
227  }
228  void Set(const std::shared_ptr<TypeDescriptor>& typeDescriptor)
229  {
230  mTypeDescriptor = typeDescriptor;
231  }
232 
233  std::shared_ptr<Symbol> mSymbolEntry;
234  std::shared_ptr<TypeDescriptor> mTypeDescriptor;
235  };
236 
237  struct BlockTable final
238  {
239  BlockEntry mHead;
240  int32_t mAllocp;
241 
242  explicit BlockTable(const int32_t allocp)
243  : mAllocp(allocp)
244  {}
245  };
246  std::stack<std::unique_ptr<BlockTable>> mBlockTable;
247 
248  std::stack<std::shared_ptr<TypeDescriptor>> mBlockTypeDescriptor;
249 
250 
251  ssize_t mActorOrStructureLevel = 0;
252  size_t mFunctionBlockLevel = 0;
253  bool mIsFunctionOpened = false;
254  bool mModuleBlockOpened = false;
255 
256 
257  int32_t mStaticMemoryAddress = 0;
258  int32_t mGlobalMemoryAddress = 0;
259  int32_t mActorMemoryAddress = 0;
260  int32_t mLocalMemoryAddress = 0;
261  int32_t mMaxLocalMemoryAddress = 0;
262 
263  int32_t mFrameSizeList = 0;
264  address_t mReturnAddressList = InvalidAddress;
265  };
266 }
Definition: OutputStream.h:15
Definition: SymbolFactory.h:34
int32_t GetGlobalMemoryAddress() const
Definition: SymbolFactory.cpp:1503
void DumpFunctionNameFromAddress(std::ofstream &output, const int32_t address) const
Definition: SymbolFactory.cpp:530
void AllocateMemory(const std::shared_ptr< Symbol > &symbolEntry, std::shared_ptr< TypeDescriptor > type, Symbol::MemoryTypeId)
Definition: SymbolFactory.cpp:1431
void OpenFunction(const std::shared_ptr< SyntaxNode > &node, const bool is_action)
Definition: SymbolFactory.cpp:680
void PrintFooter(const std::string_view, const std::shared_ptr< TypeDescriptor > &type)
void PrintEntry(const std::shared_ptr< Symbol > &symbolEntry, const std::shared_ptr< TypeDescriptor > &type)
void BeginNativeFunction()
Definition: SymbolFactory.cpp:868
void AddRequest(const std::shared_ptr< CodeGenerator > &codeGenerator, const IntermediateLanguage opcode, const std::shared_ptr< SyntaxNode > &level, const std::shared_ptr< SyntaxNode > &actor, const std::string_view action) const
Definition: SymbolFactory.cpp:1336
std::shared_ptr< TypeDescriptor > GetLastTypeDescriptorInBlock() const
Definition: SymbolFactory.cpp:511
std::shared_ptr< TypeDescriptor > GetCurrentBlockTypeDescriptor() const
Definition: SymbolFactory.h:141
void BeginRegistrationActor(const std::shared_ptr< Symbol > &symbolEntry)
Definition: SymbolFactory.cpp:1022
void Destroy(const std::string_view name)
Definition: SymbolFactory.cpp:349
void OpenFunction2(const std::shared_ptr< const Symbol > &function) const
Definition: SymbolFactory.cpp:756
void CheckUndefine() const
Definition: SymbolFactory.cpp:1561
void EachBlock(const std::function< void(const std::shared_ptr< Symbol > &)> &function)
Definition: SymbolFactory.cpp:462
void SetGlobalMemoryAddress(const int32_t size)
Definition: SymbolFactory.cpp:1508
void CommitRegistrationActor(const std::string_view name, const std::shared_ptr< TypeDescriptor > &type, const bool phantom)
Definition: SymbolFactory.cpp:1060
std::shared_ptr< Symbol > CreateLabel(const std::string_view name)
Definition: SymbolFactory.cpp:280
void CloseNativeFunction(const std::shared_ptr< Symbol > &function, const std::shared_ptr< TypeDescriptor > &type)
Definition: SymbolFactory.cpp:886
void CloseModule(const std::string_view name)
Definition: SymbolFactory.cpp:1295
void Define(const std::string_view name, const std::shared_ptr< Symbol > &symbolEntry)
Definition: SymbolFactory.cpp:399
address_t GetReturnAddressList() const
Definition: SymbolFactory.h:176
void RegisterToBlock(const std::shared_ptr< Symbol > &symbolEntry)
Definition: SymbolFactory.cpp:493
void CommitRegistrationModule(const std::string_view name)
Definition: SymbolFactory.cpp:1238
void WritePublicTypeDecl(std::ofstream &output) const
Definition: SymbolFactory.cpp:584
void OpenBlock(const int32_t address)
Definition: SymbolFactory.cpp:419
void SetStaticMemoryAddress(const int32_t size)
Definition: SymbolFactory.cpp:1497
void BeginRegistrationStructure()
Definition: SymbolFactory.cpp:908
bool GenerateActorInformation(OutputStream &stream) const
Definition: SymbolFactory.cpp:1575
size_t GetNumberOfActors() const
Definition: SymbolFactory.cpp:1514
void PrintDummyGlobalVariable(size_t size)
void OpenStructure(const std::string_view name)
Definition: SymbolFactory.cpp:957
void AddJoin(const std::shared_ptr< CodeGenerator > &codeGenerator, const std::shared_ptr< SyntaxNode > &level, const std::shared_ptr< SyntaxNode > &actor) const
Definition: SymbolFactory.cpp:1393
bool IsOpenBlock() const
Definition: SymbolFactory.cpp:674
int32_t CloseBlock()
Definition: SymbolFactory.cpp:424
void CloseStructure()
Definition: SymbolFactory.cpp:997
bool IsActorOrStructerOpened() const
Definition: SymbolFactory.cpp:1123
void Dump(std::ofstream &output) const
Definition: SymbolFactory.cpp:521
void ExtendModule(const std::shared_ptr< Symbol > &symbol)
Definition: SymbolFactory.cpp:477
void CommitRegistrationStructure(const std::string_view name)
Definition: SymbolFactory.cpp:916
int32_t GetStaticMemoryAddress() const
Definition: SymbolFactory.cpp:1492
std::shared_ptr< Symbol > CreateConstBool(const std::string_view name, const bool value)
Definition: SymbolFactory.cpp:179
void OpenModule(const std::shared_ptr< Symbol > &symbolEntry)
Definition: SymbolFactory.cpp:1265
void CloseActor()
Definition: SymbolFactory.cpp:1170
std::shared_ptr< Symbol > Lookup(const std::string_view name) const
Definition: SymbolFactory.cpp:378
void OpenActor(const std::string_view name)
Definition: SymbolFactory.cpp:1128
SymbolFactory(const std::shared_ptr< CodeBuffer > &codeBuffer, const std::shared_ptr< DataBuffer > &dataBuffer, const std::shared_ptr< StringPool > &stringPool, const std::shared_ptr< TypeDescriptorFactory > &typeDescriptorFactory)
Definition: SymbolFactory.cpp:110
void Undefine(const std::string_view name)
Definition: SymbolFactory.cpp:409
size_t GetBlockDepth() const
Definition: SymbolFactory.cpp:457
void symbol_open_actor_register_member(const std::shared_ptr< Symbol > &symbol)
Definition: SymbolFactory.cpp:1008
void BeginRegistrationModule(const std::shared_ptr< Symbol > &symbolEntry)
Definition: SymbolFactory.cpp:1199
~SymbolFactory()=default
bool IsModuleOpened() const
Definition: SymbolFactory.h:134
bool Each(const std::function< bool(const std::shared_ptr< Symbol > &)> &function) const
Definition: SymbolFactory.h:59
void SetReturnAddressList(const address_t returnAddressList)
Definition: SymbolFactory.h:181
std::shared_ptr< Symbol > CreateConstInt(const std::string_view name, const int32_t value)
Definition: SymbolFactory.cpp:156
bool IsFunctionOpened() const
Definition: SymbolFactory.h:105
std::shared_ptr< Symbol > CreateConstString(const std::string_view name, const std::string_view text)
Definition: SymbolFactory.cpp:225
std::shared_ptr< Symbol > CreateType(const std::string_view name, const std::shared_ptr< TypeDescriptor > &type)
Definition: SymbolFactory.cpp:312
std::shared_ptr< Symbol > CreateVariable(const std::string_view name, const std::shared_ptr< TypeDescriptor > &type, const bool staticVariable, const bool isBlockOpened, const bool isFunctionOpened)
Definition: SymbolFactory.cpp:249
std::shared_ptr< Symbol > CreateFunction(const std::string_view name, const bool isActorOrStructOpened)
Definition: SymbolFactory.cpp:293
static bool IsValid(const std::shared_ptr< Symbol > &symbolEntry)
Definition: SymbolFactory.cpp:358
std::shared_ptr< Symbol > GetLastSymbolEntryInBlock() const
Definition: SymbolFactory.cpp:504
std::shared_ptr< Symbol > CreateConstFloat(const std::string_view name, const float value)
Definition: SymbolFactory.cpp:202
void CloseFunction(const std::shared_ptr< SyntaxNode > &node, const bool is_action)
Definition: SymbolFactory.cpp:804
ClassTypeId
Definition: Symbol.h:25
MemoryTypeId
Definition: Symbol.h:62
Definition: CodeBuffer.cpp:12
std::uint32_t address_t
Definition: Type.h:30
IntermediateLanguage
Definition: FileFormat.h:79
Definition: Noncopyable.h:18