#include "ast_basic.h" #include using namespace ast_basic; using namespace lib_token; using namespace lib_syntax; ExpressionElement::ExpressionElement(std::shared_ptr bind) : _expr_rule(bind) {} std::shared_ptr ExpressionElement::definedRule() const { return _expr_rule; } QString ExpressionElement::filePath() const { if (!tokens_bind.size()) throw new SyntaxException(u8"InternalError[0x0002]一个空的非法无效节点"); return tokens_bind.first()->file(); } void ExpressionElement::addToken(std::shared_ptr token_inst) { this->tokens_bind.append(token_inst); } QList> ExpressionElement::children() const { return this->children_store; } void ExpressionElement::addChild(std::shared_ptr inst) { this->children_store.append(inst); } QList> ExpressionElement::tokens() const { return this->tokens_bind; } ExpressionContext::ExpressionContext() {} void ExpressionContext::setCurrentFile(const QString& path) { this->current_file_path = path; } QString ExpressionContext::currentFile() const { return this->current_file_path; } std::shared_ptr ExpressionContext::currentExprInst() const { if (expression_stack.size()) return expression_stack.last(); return nullptr; } void ExpressionContext::pushExprInst(std::shared_ptr current_inst) { if (!expression_stack.size() || expression_stack.last() != current_inst) expression_stack.append(current_inst); } std::shared_ptr ExpressionContext::popExprInst() { auto lastx = expression_stack.takeLast(); return lastx; } std::shared_ptr ExpressionContext::currentExprRule() const { if (rule_stack.size()) return rule_stack.last(); return nullptr; } void ExpressionContext::pushExprRule(std::shared_ptr inst) { if (!rule_stack.size() || rule_stack.last() != inst) rule_stack.append(inst); } std::shared_ptr ExpressionContext::popExprRule() { return rule_stack.takeLast(); } void ExpressionContext::appendParseErrors(const QString& file_path, int start, const QString& e) { this->errors_storage.append(std::make_tuple(file_path, start, e)); } QStringList ExpressionContext::errors() const { QStringList values; for (auto& tp : this->errors_storage) values.append(QString(u8"文件:%1\n\t%2").arg(std::get<0>(tp)).arg(std::get<2>(tp))); return values; } void ExpressionContext::clearErrors(const QString &file_path, int start) { for (int idx = 0; idx < this->errors_storage.size(); ++idx) { auto &tp = errors_storage[idx]; if(std::get<0>(tp) == file_path && std::get<1>(tp) >= start) errors_storage.removeAt(idx--); } } QList> ExpressionContext::currentExprRuleStack() const { return rule_stack; } void ExpressionContext::appendDocInst(std::shared_ptr inst) { this->document_store.append(inst); } QList> ExpressionContext::getDocInsts() const { return this->document_store; }