WsParser_VS/libSyntax/ast_basic.h

111 lines
3.4 KiB
C
Raw Normal View History

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> ================================================================================================
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>/Ҷ<EFBFBD>ڵ<EFBFBD>/<EFBFBD>ʷ<EFBFBD><EFBFBD>ڵ<EFBFBD>
*/
class TokenNode {
public:
/**
* @brief <EFBFBD><EFBFBD>ȡ<EFBFBD>ļ<EFBFBD>·<EFBFBD><EFBFBD>
* @return
*/
virtual QString filePath() const = 0;
/**
* @brief <EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҷ<EFBFBD>ӽڵ<EFBFBD>
* @return
*/
virtual bool isLeaf() const = 0;
/**
* @brief <EFBFBD><EFBFBD>ȡ<EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Token<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return
*/
virtual QList<std::shared_ptr<const lib_token::Token>> tokens() const = 0;
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>ýڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽڵ<EFBFBD>
* @param tokens
* @return
*/
virtual std::shared_ptr<const TokenNode> filledWith(const QList<std::shared_ptr<const TokenNode>>& child_nodes) const = 0;
};
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͻڵ<EFBFBD>/<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD>ڵ<EFBFBD>
*/
class ExprNode : public TokenNode {
public:
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return
*/
virtual std::shared_ptr<const lib_syntax::ExprRule> defined() const = 0;
/**
* @brief ֱ<EFBFBD><EFBFBD><EFBFBD>ӱ<EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return
*/
virtual QList<std::shared_ptr<const ExprNode>> exprNodes() const = 0;
/**
* @brief <EFBFBD><EFBFBD>ȡTokenNode<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ؼ<EFBFBD><EFBFBD><EFBFBD>
* @param index <EFBFBD><EFBFBD>ʼԪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<EFBFBD><EFBFBD>ʼ
* @param length <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return
*/
virtual QList<std::shared_ptr<const TokenNode>> childTokensMid(int index, int length = 1) const = 0;
};
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFB7A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ==========================================================================================
/**
* @brief <EFBFBD>ʷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
*/
class LIBSYNTAX_EXPORT TokenNodeImpl : public ast_basic::TokenNode {
private:
std::shared_ptr<const lib_token::Token> word_store;
public:
TokenNodeImpl(std::shared_ptr<const lib_token::Token> word);
// TokenNode interface
public:
virtual QString filePath() const override;
virtual bool isLeaf() const override;
virtual QList<std::shared_ptr<const lib_token::Token>> tokens() const override;
virtual std::shared_ptr<const TokenNode> filledWith(const QList<std::shared_ptr<const TokenNode> >& tokens) const override;
};
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD>ڵ<EFBFBD>
*/
class LIBSYNTAX_EXPORT ExprNodeImpl : public ast_basic::ExprNode {
private:
std::shared_ptr<const lib_syntax::ExprRule> _expr_rule;
QList<std::shared_ptr<const TokenNode>> children_store;
public:
ExprNodeImpl(std::shared_ptr<const lib_syntax::ExprRule> bind);
// TokenNode interface
public:
virtual QString filePath() const override;
virtual bool isLeaf() const override;
virtual QList<std::shared_ptr<const lib_token::Token>> tokens() const override;
virtual std::shared_ptr<const TokenNode> filledWith(const QList<std::shared_ptr<const TokenNode> >& child_nodes) const override;
// ExprNode interface
public:
virtual std::shared_ptr<const lib_syntax::ExprRule> defined() const override;
virtual QList<std::shared_ptr<const ExprNode>> exprNodes() const override;
virtual QList<std::shared_ptr<const TokenNode> > childTokensMid(int index, int length) const override;
};
}