blob: 344183407bf2296590efc5e2acdb0a45adef5612 (
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
|
#ifndef TOKENTREE_HPP_INCLUDED
#define TOKENTREE_HPP_INCLUDED
#include "lex.hpp"
class TokenTree
{
Token m_tok;
::std::vector<TokenTree> m_subtrees;
public:
TokenTree() {}
TokenTree(Token tok):
m_tok(tok)
{
}
TokenTree(::std::vector<TokenTree> subtrees):
m_subtrees(subtrees)
{
}
bool is_token() const {
return m_tok.type() != TOK_NULL;
}
const 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 << "TokenTree(" << tt.m_tok << ")";
else
return os << "TokenTree([" << tt.m_subtrees << "])";
}
};
class TTStream:
public TokenStream
{
const TokenTree& m_input_tt;
::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;
};
// 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);
#endif // TOKENTREE_HPP_INCLUDED
|