79 lines
2.9 KiB
C++
79 lines
2.9 KiB
C++
#include "ast_gen.h"
|
||
|
||
using namespace ast_gen;
|
||
|
||
GlobalElement* GlobalElement::UniquePtr = nullptr;
|
||
|
||
GlobalElement::GlobalElement(const QString& name) :names_store(name) {
|
||
UniquePtr = this;
|
||
}
|
||
|
||
void GlobalElement::clearCache() { node_cache.clear(); }
|
||
|
||
void GlobalElement::appendToCache(std::shared_ptr<const SyntaxElement> named_node) {
|
||
auto mixed_key = QString(u8"%1<%2>").arg(named_node->signature()).arg(named_node->typeMark());
|
||
if (node_cache.contains(mixed_key))
|
||
throw new lib_syntax::SyntaxException(
|
||
QString(u8"Parse[0x0004]系统中包含同类型重名命名节点:%1<type:%2>").arg(named_node->signature()).arg(named_node->typeMark()));
|
||
node_cache[mixed_key] = named_node;
|
||
}
|
||
|
||
std::shared_ptr<const SyntaxElement> GlobalElement::getNamedNodeBy(int type, const QString& signature) const {
|
||
auto mixed_key = QString(u8"%1<%2>").arg(signature).arg(type);
|
||
if (!node_cache.contains(mixed_key))
|
||
throw new lib_syntax::SyntaxException(QString(u8"Parse[0x0005]系统中不包含指定签名的节点:%1<type:%2>").arg(signature).arg(type));
|
||
return node_cache[mixed_key];
|
||
}
|
||
|
||
int GlobalElement::typeMark() const { return 0; }
|
||
|
||
bool ast_gen::GlobalElement::isAnonymous() const { return true; }
|
||
|
||
QString GlobalElement::signature() const { return u8"::global"; }
|
||
|
||
QString GlobalElement::path() const { return u8""; }
|
||
|
||
std::shared_ptr<const SyntaxElement> GlobalElement::parent() const { return nullptr; }
|
||
|
||
void ast_gen::GlobalElement::setParent(std::shared_ptr<const SyntaxElement> inst) {}
|
||
|
||
QList<std::shared_ptr<const TokenAccess>> GlobalElement::selfTokens() const { return QList<std::shared_ptr<const TokenAccess>>(); }
|
||
|
||
std::shared_ptr<const ast_basic::Expression> ast_gen::GlobalElement::bindExpression() const
|
||
{
|
||
return bind_exprs;
|
||
}
|
||
|
||
void GlobalElement::addChild(std::shared_ptr<ast_gen::SyntaxElement> citem) {
|
||
auto convx = std::dynamic_pointer_cast<ast_basic::Expression>(citem);
|
||
bind_exprs->addChild(convx);
|
||
}
|
||
|
||
ElementAccess::ElementAccess(std::shared_ptr<const SyntaxElement> point) { peers = point; }
|
||
|
||
std::shared_ptr<const SyntaxElement> ElementAccess::element() const { return peers; }
|
||
|
||
QList<std::shared_ptr<const ElementAccess>> ElementAccess::children() const {
|
||
auto expression_inst = element()->bindExpression();
|
||
auto children = expression_inst->children();
|
||
|
||
QList<std::shared_ptr<const ElementAccess>> retvalues;
|
||
for (auto item : children) {
|
||
auto elem_inst = std::dynamic_pointer_cast<const SyntaxElement>(item);
|
||
retvalues.append(std::make_shared<ElementAccess>(elem_inst));
|
||
}
|
||
return retvalues;
|
||
}
|
||
|
||
QList<std::shared_ptr<const TokenAccess>> ElementAccess::tokens() const {
|
||
return element()->selfTokens();
|
||
}
|
||
|
||
TokenAccess::TokenAccess(std::shared_ptr<const SyntaxElement> elm_inst, std::shared_ptr<const lib_token::Token> token_inst)
|
||
: element_bind(elm_inst), token_store(token_inst) {}
|
||
|
||
std::shared_ptr<const SyntaxElement> TokenAccess::bind() const { return element_bind; }
|
||
|
||
std::shared_ptr<const lib_token::Token> TokenAccess::token() const { return token_store; }
|
||
|