111 lines
3.4 KiB
C
111 lines
3.4 KiB
C
|
#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;
|
|||
|
};
|
|||
|
}
|