WsParser_VS/libSyntax/ast_basic.h

111 lines
4.1 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <memory>
#include <QList>
#include <libtoken.h>
#include "libsyntax.h"
namespace ast_basic {
// 抽象语法树 ================================================================================================
/**
* @brief 抽象语法树集合节点/表达式节点
*/
class IExprInst {
public:
virtual ~IExprInst() = default;
/**
* @brief 获取表达式的解析规则
* @return
*/
virtual std::shared_ptr<const lib_syntax::ExprRule> definedRule() const = 0;
//=====================================================
/**
* 获取语法节点的源码文件路径.
*
* \return 文件路径
*/
virtual QString filePath() const = 0;
/**
* 获取语法节点关联token序列.
*
* \return token序列
*/
virtual QList<std::shared_ptr<const lib_token::IToken>> tokens() const = 0;
/**
* 解析过程中向表达式内部添加token实例.
*
* \param token_inst 实例
*/
virtual void addToken(std::shared_ptr<const lib_token::IToken> token_inst) = 0;
//=====================================================
/**
* @brief 子表达式集合
* @return
*/
virtual QList<std::shared_ptr<const IExprInst>> children() const = 0;
/**
* @brief 添加子表达式.
*
* \param inst 子表达式实例
*/
virtual void addChild(std::shared_ptr<const IExprInst> inst) = 0;
};
// 基础语法树构成 ==========================================================================================
/**
* @brief 表达式节点
*/
class LIBSYNTAX_EXPORT ExpressionElement : public ast_basic::IExprInst, public std::enable_shared_from_this<ExpressionElement> {
private:
std::shared_ptr<const lib_syntax::ExprRule> _expr_rule;
QList<std::shared_ptr<const IExprInst>> children_store;
QList<std::shared_ptr<const lib_token::IToken>> tokens_bind;
public:
ExpressionElement(std::shared_ptr<const lib_syntax::ExprRule> bind);
// 通过 Expression 继承
std::shared_ptr<const lib_syntax::ExprRule> definedRule() const override;
QString filePath() const override;
QList<std::shared_ptr<const lib_token::IToken>> tokens() const override;
void addToken(std::shared_ptr<const lib_token::IToken> token_inst) override;
QList<std::shared_ptr<const IExprInst>> children() const override;
void addChild(std::shared_ptr<const IExprInst> inst) override;
};
class LIBSYNTAX_EXPORT ExprsContext : public lib_syntax::IContext, public std::enable_shared_from_this<ExprsContext> {
private:
QList<std::shared_ptr<const lib_syntax::IBasicRule>> rule_stack;
QList<std::shared_ptr<IExprInst>> expression_stack;
QList<std::shared_ptr<const ast_basic::IExprInst>> document_store;
QString current_file_path;
QList<std::tuple<QString, int, QString>> errors_storage;
public:
ExprsContext();
// 通过 IContext 继承
virtual void setCurrentFile(const QString& path);
virtual QString currentFile() const;
std::shared_ptr<ast_basic::IExprInst> currentExprInst() const override;
void pushExprInst(std::shared_ptr<ast_basic::IExprInst> current_inst) override;
std::shared_ptr<ast_basic::IExprInst> popExprInst() override;
std::shared_ptr<const lib_syntax::IBasicRule> currentExprRule() const override;
void pushExprRule(std::shared_ptr<const lib_syntax::IBasicRule> inst) override;
std::shared_ptr<const lib_syntax::IBasicRule> popExprRule() override;
virtual QList<std::shared_ptr<const lib_syntax::IBasicRule>> currentExprRuleStack() const;
virtual void appendDocInst(std::shared_ptr<ast_basic::IExprInst> inst) override;
virtual QList<std::shared_ptr<const ast_basic::IExprInst>> getDocInsts() const override;
void appendParseErrors(const QString& file_path, int start, const QString& error_msg) override;
QStringList errors() const override;
void clearErrors(const QString& file_path, int start) override;
};
}