WsParser_VS/libSyntax/ast_basic.h

114 lines
4.2 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 Expression {
public:
virtual ~Expression() = default;
/**
* @brief 获取表达式的解析规则
* @return
*/
virtual std::shared_ptr<const lib_syntax::ExpressionRule> 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 list
*/
virtual void tokensReset(const QList<std::shared_ptr<const lib_token::IToken>> &list) = 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 Expression>> children() const = 0;
/**
* @brief 添加子表达式.
*
* \param inst 子表达式实例
*/
virtual void addChild(std::shared_ptr<const Expression> inst) = 0;
};
// 基础语法树构成 ==========================================================================================
/**
* @brief 表达式节点
*/
class LIBSYNTAX_EXPORT ExpressionElement : public ast_basic::Expression, public std::enable_shared_from_this<ExpressionElement> {
private:
std::shared_ptr<const lib_syntax::ExpressionRule> _expr_rule;
QList<std::shared_ptr<const Expression>> children_store;
QList<std::shared_ptr<const lib_token::IToken>> tokens_bind;
public:
ExpressionElement(std::shared_ptr<const lib_syntax::ExpressionRule> bind);
// 通过 Expression 继承
std::shared_ptr<const lib_syntax::ExpressionRule> definedRule() const override;
QString filePath() const override;
QList<std::shared_ptr<const lib_token::IToken>> tokens() const override;
void tokensReset(const QList<std::shared_ptr<const lib_token::IToken>>& list) override;
void addToken(std::shared_ptr<const lib_token::IToken> token_inst) override;
QList<std::shared_ptr<const Expression>> children() const override;
void addChild(std::shared_ptr<const Expression> inst) override;
};
class LIBSYNTAX_EXPORT ExpressionContext : public lib_syntax::ParseContext, public std::enable_shared_from_this<ExpressionContext> {
private:
QList<std::shared_ptr<const lib_syntax::BaseRule>> rule_stack;
QList<std::shared_ptr<Expression>> expression_stack;
QString current_file_path;
QList<std::tuple<int, QString>> errors_storage;
public:
ExpressionContext();
virtual void setCurrentFile(const QString& path);
virtual QString currentFile() const;
// 通过 ParseContext 继承
std::shared_ptr<ast_basic::Expression> currentInst() const override;
void pushInst(std::shared_ptr<ast_basic::Expression> current_inst) override;
std::shared_ptr<ast_basic::Expression> popInst() override;
std::shared_ptr<const lib_syntax::BaseRule> currentExpressionRule() const override;
void pushExpressionRule(std::shared_ptr<const lib_syntax::BaseRule> inst) override;
std::shared_ptr<const lib_syntax::BaseRule> popExpressionRule() override;
virtual QList<std::shared_ptr<const lib_syntax::BaseRule>> currentExpressionRuleStack() const;
void appendParseErrors(int start, const QString& error_msg) override;
QStringList errors() const override;
void clearErrors(int start) override;
};
}