2024-03-17 07:58:28 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <QString>
|
|
|
|
|
#include <QList>
|
|
|
|
|
#include <QHash>
|
|
|
|
|
#include "ast_basic.h"
|
|
|
|
|
#include "libsyntax_global.h"
|
|
|
|
|
|
|
|
|
|
namespace ast_gen
|
|
|
|
|
{
|
|
|
|
|
class TokenAccess;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
class SyntaxElement {
|
|
|
|
|
public:
|
2024-06-18 03:54:36 +00:00
|
|
|
|
virtual ~SyntaxElement() = default;
|
|
|
|
|
/**
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽʵ<EFBFBD><EFBFBD>.
|
|
|
|
|
*
|
|
|
|
|
* \return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽʵ<EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
2024-07-12 21:52:32 +00:00
|
|
|
|
virtual std::shared_ptr<const ast_basic::IExprInst> bindExpression() const = 0;
|
2024-06-18 03:54:36 +00:00
|
|
|
|
|
2024-03-17 07:58:28 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
virtual int typeMark() const = 0;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* <EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>.
|
|
|
|
|
*
|
|
|
|
|
* \return <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
|
|
|
|
|
*/
|
|
|
|
|
virtual bool isAnonymous() const = 0;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD>ļ<EFBFBD>·<EFBFBD><EFBFBD>
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
virtual QString path() const = 0;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Ԫ<EFBFBD><EFBFBD>ǩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ط<EFBFBD><EFBFBD>ؿ<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
virtual QString signature() const = 0;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD>
|
2024-06-18 03:54:36 +00:00
|
|
|
|
* @return δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>parent<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>nullptr
|
2024-03-17 07:58:28 +00:00
|
|
|
|
*/
|
|
|
|
|
virtual std::shared_ptr<const SyntaxElement> parent() const = 0;
|
2024-06-20 13:36:46 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD>ø<EFBFBD>ָ<EFBFBD><EFBFBD>.
|
|
|
|
|
*
|
|
|
|
|
* \param inst
|
|
|
|
|
*/
|
2024-06-18 03:54:36 +00:00
|
|
|
|
virtual void setParent(std::shared_ptr<const SyntaxElement> inst) = 0;
|
2024-03-17 07:58:28 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Token<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
virtual QList<std::shared_ptr<const TokenAccess>> selfTokens() const = 0;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽӿ<EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
class LIBSYNTAX_EXPORT ElementAccess {
|
|
|
|
|
private:
|
|
|
|
|
std::shared_ptr<const SyntaxElement> peers;
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
ElementAccess(std::shared_ptr<const SyntaxElement> point);
|
|
|
|
|
|
|
|
|
|
std::shared_ptr<const SyntaxElement> element() const;
|
|
|
|
|
QList<std::shared_ptr<const ElementAccess>> children() const;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Token<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
virtual QList<std::shared_ptr<const TokenAccess>> tokens() const;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class LIBSYNTAX_EXPORT TokenAccess {
|
|
|
|
|
private:
|
|
|
|
|
std::shared_ptr<const ast_gen::SyntaxElement> element_bind;
|
2024-06-20 13:36:46 +00:00
|
|
|
|
std::shared_ptr<const lib_token::IToken> token_store;
|
2024-03-17 07:58:28 +00:00
|
|
|
|
|
|
|
|
|
public:
|
2024-06-20 13:36:46 +00:00
|
|
|
|
TokenAccess(std::shared_ptr<const ast_gen::SyntaxElement> elm_inst, std::shared_ptr<const lib_token::IToken> token_inst);
|
2024-03-17 07:58:28 +00:00
|
|
|
|
virtual std::shared_ptr<const ast_gen::SyntaxElement> bind() const;
|
2024-06-20 13:36:46 +00:00
|
|
|
|
virtual std::shared_ptr<const lib_token::IToken> token() const;
|
2024-03-17 07:58:28 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD>Ԫ<EFBFBD>ض<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
2024-07-28 06:39:18 +00:00
|
|
|
|
class LIBSYNTAX_EXPORT GlobalElement : public SyntaxElement, public ast_basic::ExprsContext {
|
2024-03-17 07:58:28 +00:00
|
|
|
|
private:
|
|
|
|
|
QString names_store;
|
|
|
|
|
QHash<QString, std::shared_ptr<const SyntaxElement>> node_cache;
|
|
|
|
|
|
2024-07-28 06:41:54 +00:00
|
|
|
|
std::shared_ptr<ast_basic::IExprInst> bind_exprs = std::make_shared<ast_basic::ExprElement>(nullptr);
|
2024-06-18 03:54:36 +00:00
|
|
|
|
|
2024-03-17 07:58:28 +00:00
|
|
|
|
public:
|
2024-06-18 03:54:36 +00:00
|
|
|
|
static GlobalElement* UniquePtr;
|
2024-03-17 07:58:28 +00:00
|
|
|
|
GlobalElement(const QString& name);
|
|
|
|
|
|
|
|
|
|
virtual void clearCache();
|
2024-06-20 13:36:46 +00:00
|
|
|
|
virtual std::shared_ptr<const ast_gen::SyntaxElement> appendToCache(std::shared_ptr<const ast_gen::SyntaxElement> named_node);
|
2024-03-17 07:58:28 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief ͨ<EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ǩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
|
|
|
|
|
* @param signature <EFBFBD><EFBFBD>ȫǩ<EFBFBD><EFBFBD>
|
|
|
|
|
* @return
|
|
|
|
|
* @throws û<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD>׳<EFBFBD><EFBFBD>쳣
|
|
|
|
|
*/
|
2024-06-22 10:53:51 +00:00
|
|
|
|
virtual std::shared_ptr<const ast_gen::SyntaxElement> getNamedNodeBy(int paramType, const QString& signature) const;
|
2024-06-18 03:54:36 +00:00
|
|
|
|
virtual void addChild(std::shared_ptr<ast_gen::SyntaxElement> citem);
|
|
|
|
|
|
2024-03-17 07:58:28 +00:00
|
|
|
|
// ParseElement interface
|
|
|
|
|
public:
|
|
|
|
|
virtual int typeMark() const override;
|
|
|
|
|
virtual bool isAnonymous() const override;
|
|
|
|
|
virtual QString signature() const override;
|
|
|
|
|
virtual QString path() const override;
|
|
|
|
|
virtual std::shared_ptr<const SyntaxElement> parent() const override;
|
2024-06-18 03:54:36 +00:00
|
|
|
|
virtual void setParent(std::shared_ptr<const SyntaxElement> inst) override;
|
2024-03-17 07:58:28 +00:00
|
|
|
|
virtual QList<std::shared_ptr<const TokenAccess>> selfTokens() const override;
|
|
|
|
|
|
2024-06-18 03:54:36 +00:00
|
|
|
|
// ͨ<><CDA8> SyntaxElement <20>̳<EFBFBD>
|
2024-07-12 21:52:32 +00:00
|
|
|
|
virtual std::shared_ptr<const ast_basic::IExprInst> bindExpression() const override;
|
2024-03-17 07:58:28 +00:00
|
|
|
|
};
|
|
|
|
|
}
|