2024-03-17 07:58:28 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <memory>
|
|
|
|
|
#include <QList>
|
|
|
|
|
#include <libtoken.h>
|
|
|
|
|
#include "libsyntax.h"
|
|
|
|
|
|
|
|
|
|
namespace ast_basic {
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFB7A8> ================================================================================================
|
|
|
|
|
/**
|
2024-06-18 03:54:36 +00:00
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͻڵ<EFBFBD>/<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD>ڵ<EFBFBD>
|
2024-03-17 07:58:28 +00:00
|
|
|
|
*/
|
2024-07-12 21:52:32 +00:00
|
|
|
|
class IExprInst {
|
2024-03-17 07:58:28 +00:00
|
|
|
|
public:
|
2024-07-12 21:52:32 +00:00
|
|
|
|
virtual ~IExprInst() = default;
|
2024-06-18 03:54:36 +00:00
|
|
|
|
|
2024-03-17 07:58:28 +00:00
|
|
|
|
/**
|
2024-06-18 03:54:36 +00:00
|
|
|
|
* @brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD>Ľ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-03-17 07:58:28 +00:00
|
|
|
|
* @return
|
|
|
|
|
*/
|
2024-07-12 04:53:43 +00:00
|
|
|
|
virtual std::shared_ptr<const lib_syntax::ExprRule> definedRule() const = 0;
|
2024-06-18 03:54:36 +00:00
|
|
|
|
//=====================================================
|
2024-03-17 07:58:28 +00:00
|
|
|
|
/**
|
2024-06-18 03:54:36 +00:00
|
|
|
|
* <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><EFBFBD>.
|
|
|
|
|
*
|
|
|
|
|
* \return <EFBFBD>ļ<EFBFBD>·<EFBFBD><EFBFBD>
|
2024-03-17 07:58:28 +00:00
|
|
|
|
*/
|
2024-06-18 03:54:36 +00:00
|
|
|
|
virtual QString filePath() const = 0;
|
2024-03-17 07:58:28 +00:00
|
|
|
|
/**
|
2024-06-18 03:54:36 +00:00
|
|
|
|
* <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>token<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|
|
|
|
*
|
|
|
|
|
* \return token<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-03-17 07:58:28 +00:00
|
|
|
|
*/
|
2024-06-20 13:36:46 +00:00
|
|
|
|
virtual QList<std::shared_ptr<const lib_token::IToken>> tokens() const = 0;
|
2024-03-17 07:58:28 +00:00
|
|
|
|
/**
|
2024-06-18 03:54:36 +00:00
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>tokenʵ<EFBFBD><EFBFBD>.
|
|
|
|
|
*
|
|
|
|
|
* \param token_inst ʵ<EFBFBD><EFBFBD>
|
2024-03-17 07:58:28 +00:00
|
|
|
|
*/
|
2024-06-20 13:36:46 +00:00
|
|
|
|
virtual void addToken(std::shared_ptr<const lib_token::IToken> token_inst) = 0;
|
2024-06-18 03:54:36 +00:00
|
|
|
|
//=====================================================
|
2024-03-17 07:58:28 +00:00
|
|
|
|
/**
|
2024-06-18 03:54:36 +00:00
|
|
|
|
* @brief <EFBFBD>ӱ<EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-03-17 07:58:28 +00:00
|
|
|
|
* @return
|
|
|
|
|
*/
|
2024-07-12 21:52:32 +00:00
|
|
|
|
virtual QList<std::shared_ptr<const IExprInst>> children() const = 0;
|
2024-03-17 07:58:28 +00:00
|
|
|
|
/**
|
2024-06-18 03:54:36 +00:00
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӱ<EFBFBD><EFBFBD><EFBFBD>ʽ.
|
|
|
|
|
*
|
|
|
|
|
* \param inst <EFBFBD>ӱ<EFBFBD><EFBFBD><EFBFBD>ʽʵ<EFBFBD><EFBFBD>
|
2024-03-17 07:58:28 +00:00
|
|
|
|
*/
|
2024-07-12 21:52:32 +00:00
|
|
|
|
virtual void addChild(std::shared_ptr<const IExprInst> inst) = 0;
|
2024-03-17 07:58:28 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFB7A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ==========================================================================================
|
|
|
|
|
/**
|
2024-06-18 03:54:36 +00:00
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD>ڵ<EFBFBD>
|
2024-03-17 07:58:28 +00:00
|
|
|
|
*/
|
2024-07-12 21:52:32 +00:00
|
|
|
|
class LIBSYNTAX_EXPORT ExpressionElement : public ast_basic::IExprInst, public std::enable_shared_from_this<ExpressionElement> {
|
2024-03-17 07:58:28 +00:00
|
|
|
|
private:
|
2024-07-12 04:53:43 +00:00
|
|
|
|
std::shared_ptr<const lib_syntax::ExprRule> _expr_rule;
|
2024-07-12 21:52:32 +00:00
|
|
|
|
QList<std::shared_ptr<const IExprInst>> children_store;
|
2024-06-20 13:36:46 +00:00
|
|
|
|
QList<std::shared_ptr<const lib_token::IToken>> tokens_bind;
|
2024-03-17 07:58:28 +00:00
|
|
|
|
|
|
|
|
|
public:
|
2024-07-12 04:53:43 +00:00
|
|
|
|
ExpressionElement(std::shared_ptr<const lib_syntax::ExprRule> bind);
|
2024-03-17 07:58:28 +00:00
|
|
|
|
|
2024-06-18 03:54:36 +00:00
|
|
|
|
// ͨ<><CDA8> Expression <20>̳<EFBFBD>
|
2024-07-12 04:53:43 +00:00
|
|
|
|
std::shared_ptr<const lib_syntax::ExprRule> definedRule() const override;
|
2024-06-18 03:54:36 +00:00
|
|
|
|
QString filePath() const override;
|
|
|
|
|
|
2024-06-20 13:36:46 +00:00
|
|
|
|
QList<std::shared_ptr<const lib_token::IToken>> tokens() const override;
|
|
|
|
|
void addToken(std::shared_ptr<const lib_token::IToken> token_inst) override;
|
2024-06-18 03:54:36 +00:00
|
|
|
|
|
2024-07-12 21:52:32 +00:00
|
|
|
|
QList<std::shared_ptr<const IExprInst>> children() const override;
|
|
|
|
|
void addChild(std::shared_ptr<const IExprInst> inst) override;
|
2024-03-17 07:58:28 +00:00
|
|
|
|
};
|
|
|
|
|
|
2024-07-12 21:52:32 +00:00
|
|
|
|
class LIBSYNTAX_EXPORT ExpressionContext : public lib_syntax::IContext, public std::enable_shared_from_this<ExpressionContext> {
|
2024-03-17 07:58:28 +00:00
|
|
|
|
private:
|
2024-07-12 21:52:32 +00:00
|
|
|
|
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;
|
2024-06-20 13:36:46 +00:00
|
|
|
|
QString current_file_path;
|
2024-07-12 09:35:35 +00:00
|
|
|
|
QList<std::tuple<QString, int, QString>> errors_storage;
|
2024-03-17 07:58:28 +00:00
|
|
|
|
|
|
|
|
|
public:
|
2024-06-20 13:36:46 +00:00
|
|
|
|
ExpressionContext();
|
2024-03-17 07:58:28 +00:00
|
|
|
|
|
2024-06-20 13:36:46 +00:00
|
|
|
|
virtual void setCurrentFile(const QString& path);
|
|
|
|
|
virtual QString currentFile() const;
|
2024-03-17 07:58:28 +00:00
|
|
|
|
|
2024-07-12 21:52:32 +00:00
|
|
|
|
// ͨ<><CDA8> IContext <20>̳<EFBFBD>
|
|
|
|
|
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;
|
2024-06-18 03:54:36 +00:00
|
|
|
|
|
2024-07-12 21:52:32 +00:00
|
|
|
|
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>> currentExpressionRuleStack() const;
|
2024-06-18 03:54:36 +00:00
|
|
|
|
|
2024-07-12 21:52:32 +00:00
|
|
|
|
virtual void appendDoc(std::shared_ptr<ast_basic::IExprInst> inst) override;
|
|
|
|
|
virtual QList<std::shared_ptr<const ast_basic::IExprInst>> getDocs() const override;
|
2024-07-12 04:53:43 +00:00
|
|
|
|
|
2024-07-12 09:35:35 +00:00
|
|
|
|
void appendParseErrors(const QString& file_path, int start, const QString& error_msg) override;
|
2024-06-27 04:55:07 +00:00
|
|
|
|
QStringList errors() const override;
|
2024-07-12 09:35:35 +00:00
|
|
|
|
void clearErrors(const QString& file_path, int start) override;
|
2024-03-17 07:58:28 +00:00
|
|
|
|
};
|
|
|
|
|
}
|