summaryrefslogtreecommitdiff
path: root/src/parse/tokentree.hpp
blob: 7f8810a7981b1099f13cd9933453326597621d6f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#ifndef TOKENTREE_HPP_INCLUDED
#define TOKENTREE_HPP_INCLUDED

#include "lex.hpp"
#include "../include/serialise.hpp"

class TokenTree:
    public Serialisable
{
    Token   m_tok;
    ::std::vector<TokenTree>    m_subtrees;
public:
    virtual ~TokenTree() {}
    TokenTree() {}
    TokenTree(TokenTree&&) = default;
    TokenTree& operator=(TokenTree&&) = default;
    TokenTree(Token tok):
        m_tok( ::std::move(tok) )
    {
    }
    TokenTree(::std::vector<TokenTree> subtrees):
        m_subtrees( ::std::move(subtrees) )
    {
    }
    
    TokenTree clone() const;

    bool is_token() const {
        return m_tok.type() != TOK_NULL;
    }
    unsigned int size() const {
        return m_subtrees.size();
    }
    const TokenTree& operator[](unsigned int idx) const {
        return m_subtrees[idx];
    }
    const Token& tok() const {
        return m_tok;
    }
    
    friend ::std::ostream& operator<<(::std::ostream& os, const TokenTree& tt) {
        if( tt.m_subtrees.size() == 0 )
            return os << tt.m_tok;
        else {
            os << "TT([";
            bool first = true;
            for(const auto& i : tt.m_subtrees) {
                if(!first)
                    os << ", ";
                os << i;
                first = false;
            }
            os << "])";
            return os;
        }
    }

    SERIALISABLE_PROTOTYPES();
};

class TTStream:
    public TokenStream
{
    ::std::vector< ::std::pair<unsigned int, const TokenTree*> > m_stack;
public:
    TTStream(const TokenTree& input_tt);
    ~TTStream();

    TTStream& operator=(const TTStream& x) { m_stack = x.m_stack; return *this; }
    
    virtual Position getPosition() const override;

protected:
    virtual Token realGetToken() override;
};

class TTStreamO:
    public TokenStream
{
    Position    m_last_pos;
    TokenTree	m_input_tt;
    ::std::vector< ::std::pair<unsigned int, const TokenTree*> > m_stack;
public:
    TTStreamO(TokenTree input_tt);
    TTStreamO(TTStreamO&& x) = default;
    ~TTStreamO();

    TTStreamO& operator=(const TTStreamO& x) { m_stack = x.m_stack; return *this; }
    TTStreamO& operator=(TTStreamO&& x) = default;
    
    virtual Position getPosition() const override;

protected:
    virtual Token realGetToken() override;
};

// unwrapped = Exclude the enclosing brackets (used by macro parse code)
extern TokenTree Parse_TT(TokenStream& lex, bool unwrapped);
extern TokenTree Parse_TT_Pattern(TokenStream& lex);
extern TokenTree Parse_TT_Expr(TokenStream& lex);
extern TokenTree Parse_TT_Type(TokenStream& lex);
extern TokenTree Parse_TT_Stmt(TokenStream& lex);
extern TokenTree Parse_TT_Block(TokenStream& lex);
extern TokenTree Parse_TT_Path(TokenStream& lex, bool mode_expr);
extern TokenTree Parse_TT_Meta(TokenStream& lex);

#endif // TOKENTREE_HPP_INCLUDED