diff options
Diffstat (limited to 'src/parse')
-rw-r--r-- | src/parse/lex.cpp | 47 | ||||
-rw-r--r-- | src/parse/tokentree.hpp | 18 |
2 files changed, 65 insertions, 0 deletions
diff --git a/src/parse/lex.cpp b/src/parse/lex.cpp index a3e8c0d0..0e928bf2 100644 --- a/src/parse/lex.cpp +++ b/src/parse/lex.cpp @@ -1205,6 +1205,53 @@ Position TTStream::getPosition() const return Position("TTStream", 0,0); } + +TTStreamO::TTStreamO(TokenTree input_tt): + m_input_tt( mv$(input_tt) ) +{ + m_stack.push_back( ::std::make_pair(0, nullptr) ); +} +TTStreamO::~TTStreamO() +{ +} +Token TTStreamO::realGetToken() +{ + while(m_stack.size() > 0) + { + // If current index is above TT size, go up + unsigned int& idx = m_stack.back().first; + const TokenTree& tree = *( m_stack.back().second ? m_stack.back().second : &m_input_tt ); + + if(idx == 0 && tree.is_token()) { + idx ++; + m_last_pos = tree.tok().get_pos(); + return tree.tok(); + } + + if(idx < tree.size()) + { + const TokenTree& subtree = tree[idx]; + idx ++; + if( subtree.size() == 0 ) { + m_last_pos = subtree.tok().get_pos(); + return subtree.tok(); + } + else { + m_stack.push_back( ::std::make_pair(0, &subtree ) ); + } + } + else { + m_stack.pop_back(); + } + } + return Token(TOK_EOF); +} +Position TTStreamO::getPosition() const +{ + return m_last_pos; +} + + TokenStream::TokenStream(): m_cache_valid(false) { diff --git a/src/parse/tokentree.hpp b/src/parse/tokentree.hpp index 6b54e66e..257bd6ad 100644 --- a/src/parse/tokentree.hpp +++ b/src/parse/tokentree.hpp @@ -60,6 +60,24 @@ protected: virtual Token realGetToken() override;
};
+class TTStreamO:
+ public TokenStream
+{
+ Position m_last_pos;
+ const TokenTree m_input_tt;
+ ::std::vector< ::std::pair<unsigned int, const TokenTree*> > m_stack;
+public:
+ TTStreamO(const TokenTree input_tt);
+ ~TTStreamO();
+
+ TTStreamO& operator=(const TTStreamO& 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);
|