WsParser_VS/libSyntax/ast_gen.h

163 lines
4.1 KiB
C
Raw Normal View History

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:
/**
* @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>
* @return
*/
virtual std::shared_ptr<const SyntaxElement> parent() const = 0;
/**
* @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;
QList<std::shared_ptr<const ElementAccess>> children_store;
public:
ElementAccess(std::shared_ptr<const SyntaxElement> point);
std::shared_ptr<const SyntaxElement> element() const;
QList<std::shared_ptr<const ElementAccess>> children() const;
void appendChild(std::shared_ptr<const ElementAccess> inst);
/**
* @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;
std::shared_ptr<const lib_token::Token> token_store;
public:
TokenAccess(std::shared_ptr<const ast_gen::SyntaxElement> elm_inst, std::shared_ptr<const lib_token::Token> token_inst);
virtual std::shared_ptr<const ast_gen::SyntaxElement> bind() const;
virtual std::shared_ptr<const lib_token::Token> token() const;
};
/**
* @brief <EFBFBD><EFBFBD>Ԫ<EFBFBD>ض<EFBFBD><EFBFBD><EFBFBD>
*/
class LIBSYNTAX_EXPORT GlobalElement : public SyntaxElement {
private:
QList<std::shared_ptr<const SyntaxElement>> children_store;
QString names_store;
QHash<QString, std::shared_ptr<const SyntaxElement>> node_cache;
public:
GlobalElement(const QString& name);
virtual void clearCache();
virtual void appendToCache(std::shared_ptr<const ast_gen::SyntaxElement> named_node);
/**
* @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>
*/
virtual std::shared_ptr<const ast_gen::SyntaxElement> getNamedNodeBy(int type, const QString& signature) const;
// 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;
virtual QList<std::shared_ptr<const TokenAccess>> selfTokens() const override;
};
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
class ExprVisitor {
public:
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD>ڵת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>
* @param expr <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD>ڵ<EFBFBD>
* @param pnode <EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
* @return <EFBFBD>ýڵ<EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD><EFBFBD>Ԫ<EFBFBD>ؽڵ<EFBFBD>
*/
virtual std::shared_ptr<const SyntaxElement> visit(std::shared_ptr<const ast_basic::ExprNode> expr, std::shared_ptr<const SyntaxElement> pnode) const = 0;
};
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
class LIBSYNTAX_EXPORT ExprTreeParser {
private:
std::shared_ptr<const ExprVisitor> visitor_store;
void tidy_branch(std::shared_ptr<ElementAccess> root, std::shared_ptr<const SyntaxElement> node) const;
public:
ExprTreeParser(std::shared_ptr<const ExprVisitor> vistor);
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param name <EFBFBD><EFBFBD><EFBFBD>ɲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param forest <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽɭ<EFBFBD>֣<EFBFBD>ȫ<EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD>
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҷ<EFBFBD>ӽڵ<EFBFBD>
*/
QList<std::shared_ptr<const SyntaxElement>> parse(const QString& name, const QList<std::shared_ptr<const ast_basic::ExprNode>>& forest) const;
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ط<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param nodes
* @return
*/
std::shared_ptr<const ElementAccess> tidy(const QList<std::shared_ptr<const SyntaxElement>>& nodes) const;
};
}