114 lines
4.2 KiB
C++
114 lines
4.2 KiB
C++
#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;
|
||
};
|
||
} |