WsParser_VS/libSyntax/ast_basic.cpp

105 lines
2.8 KiB
C++
Raw Normal View History

2024-03-17 07:58:28 +00:00
#include "ast_basic.h"
2024-06-18 17:09:45 +00:00
#include <QDebug>
2024-03-17 07:58:28 +00:00
using namespace ast_basic;
using namespace lib_token;
using namespace lib_syntax;
2024-06-20 14:13:06 +00:00
ExpressionElement::ExpressionElement(std::shared_ptr<const ExpressionRule> bind) : _expr_rule(bind) {}
2024-03-17 07:58:28 +00:00
2024-06-20 14:13:06 +00:00
std::shared_ptr<const ExpressionRule> ExpressionElement::definedRule() const {
return _expr_rule;
2024-03-17 07:58:28 +00:00
}
2024-06-20 14:13:06 +00:00
QString ExpressionElement::filePath() const {
if (!tokens_bind.size())
throw new SyntaxException(u8"InternalError[0x0002]һ<><D2BB><EFBFBD>յķǷ<C4B7><C7B7><EFBFBD>Ч<EFBFBD>ڵ<EFBFBD>");
return tokens_bind.first()->file();
}
2024-03-17 07:58:28 +00:00
2024-06-20 14:13:06 +00:00
void ExpressionElement::tokensReset(const QList<std::shared_ptr<const IToken>>& list) {
this->tokens_bind = list;
}
2024-03-17 07:58:28 +00:00
2024-06-20 14:13:06 +00:00
void ExpressionElement::addToken(std::shared_ptr<const IToken> token_inst) {
this->tokens_bind.append(token_inst);
2024-03-17 07:58:28 +00:00
}
2024-06-20 14:13:06 +00:00
QList<std::shared_ptr<const Expression>> ExpressionElement::children() const {
return this->children_store;
}
2024-03-17 07:58:28 +00:00
2024-06-20 14:13:06 +00:00
void ExpressionElement::addChild(std::shared_ptr<const Expression> inst) {
this->children_store.append(inst);
}
QList<std::shared_ptr<const IToken>> ExpressionElement::tokens() const {
return this->tokens_bind;
2024-03-17 07:58:28 +00:00
}
2024-06-20 14:13:06 +00:00
ExpressionContext::ExpressionContext() {}
2024-06-20 14:13:06 +00:00
void ExpressionContext::setCurrentFile(const QString& path) { this->current_file_path = path; }
2024-06-20 14:13:06 +00:00
QString ExpressionContext::currentFile() const { return this->current_file_path; }
2024-06-20 14:13:06 +00:00
std::shared_ptr<Expression> ExpressionContext::currentInst() const
{
if (expression_stack.size())
return expression_stack.last();
2024-03-17 07:58:28 +00:00
return nullptr;
}
2024-03-17 07:58:28 +00:00
2024-06-20 14:13:06 +00:00
void ExpressionContext::pushInst(std::shared_ptr<Expression> current_inst)
{
if (!expression_stack.size() || expression_stack.last() != current_inst)
expression_stack.append(current_inst);
2024-03-17 07:58:28 +00:00
}
2024-06-20 14:13:06 +00:00
std::shared_ptr<Expression> ExpressionContext::popInst()
2024-03-17 07:58:28 +00:00
{
auto lastx = expression_stack.takeLast();
return lastx;
}
2024-03-17 07:58:28 +00:00
2024-06-20 14:13:06 +00:00
std::shared_ptr<const BaseRule> ExpressionContext::currentExpressionRule() const {
if (rule_stack.size())
return rule_stack.last();
return nullptr;
2024-03-17 07:58:28 +00:00
}
2024-06-20 14:13:06 +00:00
void ExpressionContext::pushExpressionRule(std::shared_ptr<const BaseRule> inst) {
if (!rule_stack.size() || rule_stack.last() != inst)
rule_stack.append(inst);
2024-03-17 07:58:28 +00:00
}
2024-06-20 14:13:06 +00:00
std::shared_ptr<const BaseRule> ExpressionContext::popExpressionRule()
{
return rule_stack.takeLast();
}
void ExpressionContext::appendParseErrors(int start, const QString& e) {
this->errors_storage.append(std::make_tuple(start, e));
2024-03-17 07:58:28 +00:00
}
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<std::shared_ptr<const BaseRule>> ExpressionContext::currentExpressionRuleStack() const {
return rule_stack;
}