#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::tokensReset(const QList>& list) { this->tokens_bind = list; } 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::currentInst() const { if (expression_stack.size()) return expression_stack.last(); return nullptr; } void ExpressionContext::pushInst(std::shared_ptr current_inst) { if (!expression_stack.size() || expression_stack.last() != current_inst) expression_stack.append(current_inst); } std::shared_ptr ExpressionContext::popInst() { auto lastx = expression_stack.takeLast(); return lastx; } std::shared_ptr ExpressionContext::currentExpressionRule() const { if (rule_stack.size()) return rule_stack.last(); return nullptr; } void ExpressionContext::pushExpressionRule(std::shared_ptr inst) { if (!rule_stack.size() || rule_stack.last() != inst) rule_stack.append(inst); } std::shared_ptr ExpressionContext::popExpressionRule() { return rule_stack.takeLast(); } void ExpressionContext::appendParseErrors(int start, const QString& e) { this->errors_storage.append(std::make_tuple(start, e)); } QStringList ExpressionContext::errors() const { QStringList values; for (auto& tp : this->errors_storage) values.append(std::get<1>(tp)); return values; } void ExpressionContext::clearErrors(int start) { for (int idx = 0; idx < this->errors_storage.size(); ++idx) { auto &tp = errors_storage[idx]; if(std::get<0>(tp) >= start) errors_storage.removeAt(idx--); } } QList> ExpressionContext::currentExpressionRuleStack() const { return rule_stack; }