AbstrSynTree.h
#pragma once
#include <string>
#include <vector>
#include <sstream>
#include <unordered_map>
#include <functional>
#include "../SemiExpression/ITokenCollection.h"
#include "../ScopeStack/ScopeStack.h"
namespace CodeAnalysis
{
enum Access
{
publ, prot, priv
};
enum DeclType
{
dataDecl, functionDecl, lambdaDecl, usingDecl
};
struct DeclarationNode
{
Lexer::ITokenCollection* pTc = nullptr;
Access access_;
DeclType declType_;
std::string package_;
size_t line_;
};
struct ASTNode
{
using Type = std::string;
using Name = std::string;
using Package = std::string;
using Path = std::string;
ASTNode();
ASTNode(const Type& type, const Name& name);
~ASTNode();
Type type_;
Type parentType_;
Name name_;
Package package_;
Path path_;
size_t startLineCount_;
size_t endLineCount_;
size_t complexity_;
std::vector<ASTNode*> children_;
std::vector<DeclarationNode> decl_;
std::vector<Lexer::ITokenCollection*> statements_;
std::string show(bool details = false);
};
class AbstrSynTree
{
public:
using ClassName = std::string;
using TypeMap = std::unordered_map<ClassName, ASTNode*>;
AbstrSynTree(ScopeStack<ASTNode*>& stack);
~AbstrSynTree();
ASTNode*& root();
void add(ASTNode* pNode);
ASTNode* find(const ClassName& type);
ASTNode* pop();
TypeMap& typeMap();
private:
TypeMap typeMap_;
ScopeStack<ASTNode*>& stack_;
ASTNode* pGlobalNamespace_;
};
template <typename CallObj>
void ASTWalk(ASTNode* pItem, CallObj co)
{
static size_t indentLevel = 0;
co(pItem, indentLevel);
auto iter = pItem->children_.begin();
++indentLevel;
while (iter != pItem->children_.end())
{
ASTWalk(*iter, co);
++iter;
}
--indentLevel;
}
template <typename CallObj>
void ASTWalkNoIndent(ASTNode* pItem, CallObj co)
{
co(pItem);
auto iter = pItem->children_.begin();
while (iter != pItem->children_.end())
{
ASTWalkNoIndent(*iter, co);
++iter;
}
}
inline void complexityWalk(ASTNode* pItem, size_t& count)
{
size_t inCount = ++count;
auto iter = pItem->children_.begin();
while (iter != pItem->children_.end())
{
complexityWalk(*iter, count);
++iter;
}
pItem->complexity_ = count - inCount + 1;
}
inline void complexityEval(ASTNode* pNode)
{
size_t initialCount = 0;
complexityWalk(pNode, initialCount);
}
}
struct foobar {
};