diff options
-rw-r--r-- | src/expand/cfg.cpp | 4 | ||||
-rw-r--r-- | src/ident.cpp | 4 | ||||
-rw-r--r-- | src/macro_rules/eval.cpp | 4 | ||||
-rw-r--r-- | src/parse/expr.cpp | 13 | ||||
-rw-r--r-- | src/parse/lex.cpp | 2 | ||||
-rw-r--r-- | src/parse/lex.hpp | 2 | ||||
-rw-r--r-- | src/parse/tokenstream.cpp | 15 | ||||
-rw-r--r-- | src/parse/tokenstream.hpp | 6 | ||||
-rw-r--r-- | src/parse/tokentree.cpp | 21 | ||||
-rw-r--r-- | src/parse/tokentree.hpp | 22 | ||||
-rw-r--r-- | src/parse/ttstream.cpp | 17 | ||||
-rw-r--r-- | src/parse/ttstream.hpp | 5 | ||||
-rw-r--r-- | src/resolve/absolute.cpp | 2 |
13 files changed, 74 insertions, 43 deletions
diff --git a/src/expand/cfg.cpp b/src/expand/cfg.cpp index 00e3921c..e59da886 100644 --- a/src/expand/cfg.cpp +++ b/src/expand/cfg.cpp @@ -99,10 +99,10 @@ class CCfgExpander: DEBUG("cfg!() - " << attrs); if( check_cfg(sp, attrs) ) { - return box$( TTStreamO(TokenTree(TOK_RWORD_TRUE )) ); + return box$( TTStreamO(TokenTree({},TOK_RWORD_TRUE )) ); } else { - return box$( TTStreamO(TokenTree(TOK_RWORD_FALSE)) ); + return box$( TTStreamO(TokenTree({},TOK_RWORD_FALSE)) ); } } }; diff --git a/src/ident.cpp b/src/ident.cpp index a5a6bdbb..8543d6fa 100644 --- a/src/ident.cpp +++ b/src/ident.cpp @@ -16,11 +16,11 @@ bool Ident::Hygiene::is_visible(const Hygiene& src) const { // HACK: Disable hygiene for now return true; - //return x.scope_index == src.scope_index; + //return this->scope_index == src.scope_index; } ::std::ostream& operator<<(::std::ostream& os, const Ident& x) { - os << x.name; + os << x.name << x.hygiene; return os; } diff --git a/src/macro_rules/eval.cpp b/src/macro_rules/eval.cpp index f7a5aab1..3a55f500 100644 --- a/src/macro_rules/eval.cpp +++ b/src/macro_rules/eval.cpp @@ -581,7 +581,7 @@ public: } Position getPosition() const override; - Ident::Hygiene getHygiene() const override; + Ident::Hygiene realGetHygiene() const override; Token realGetToken() override; }; @@ -1047,7 +1047,7 @@ Position MacroExpander::getPosition() const // TODO: Return a far better span - invocaion location? return Position(m_macro_filename, 0, m_state.top_pos()); } -Ident::Hygiene MacroExpander::getHygiene() const +Ident::Hygiene MacroExpander::realGetHygiene() const { if( m_ttstream ) { diff --git a/src/parse/expr.cpp b/src/parse/expr.cpp index 832e6a4a..f2ec1857 100644 --- a/src/parse/expr.cpp +++ b/src/parse/expr.cpp @@ -1239,7 +1239,8 @@ ExprNodeP Parse_ExprMacro(TokenStream& lex, Token tok) // Token Tree Parsing
TokenTree Parse_TT(TokenStream& lex, bool unwrapped)
{
- TRACE_FUNCTION;
+ TokenTree rv;
+ TRACE_FUNCTION_FR("", rv);
Token tok = lex.getToken();
eTokenType closer = TOK_PAREN_CLOSE;
@@ -1270,12 +1271,13 @@ TokenTree Parse_TT(TokenStream& lex, bool unwrapped) case TOK_BRACE_CLOSE:
throw ParseError::Unexpected(lex, tok);
default:
- return TokenTree( mv$(tok) );
+ rv = TokenTree(lex.getHygiene(), mv$(tok) );
+ return rv;
}
::std::vector<TokenTree> items;
if( !unwrapped )
- items.push_back( mv$(tok) );
+ items.push_back( TokenTree(lex.getHygiene(), mv$(tok)) );
while(GET_TOK(tok, lex) != closer && tok.type() != TOK_EOF)
{
if( tok.type() == TOK_NULL )
@@ -1284,6 +1286,7 @@ TokenTree Parse_TT(TokenStream& lex, bool unwrapped) items.push_back(Parse_TT(lex, false));
}
if( !unwrapped )
- items.push_back( mv$(tok) );
- return TokenTree(lex.getHygiene(), mv$(items));
+ items.push_back( TokenTree(lex.getHygiene(), mv$(tok)) );
+ rv = TokenTree(lex.getHygiene(), mv$(items));
+ return rv;
}
diff --git a/src/parse/lex.cpp b/src/parse/lex.cpp index d6cfcddb..39842545 100644 --- a/src/parse/lex.cpp +++ b/src/parse/lex.cpp @@ -235,7 +235,7 @@ Position Lexer::getPosition() const { return Position(m_path, m_line, m_line_ofs); } -Ident::Hygiene Lexer::getHygiene() const +Ident::Hygiene Lexer::realGetHygiene() const { return m_hygiene; } diff --git a/src/parse/lex.hpp b/src/parse/lex.hpp index 3d41c3fc..572846da 100644 --- a/src/parse/lex.hpp +++ b/src/parse/lex.hpp @@ -46,7 +46,7 @@ public: Lexer(const ::std::string& filename); Position getPosition() const override; - Ident::Hygiene getHygiene() const override; + Ident::Hygiene realGetHygiene() const override; Token realGetToken() override; private: diff --git a/src/parse/tokenstream.cpp b/src/parse/tokenstream.cpp index 5d9919f6..0182e548 100644 --- a/src/parse/tokenstream.cpp +++ b/src/parse/tokenstream.cpp @@ -38,7 +38,8 @@ Token TokenStream::getToken() } else if( m_lookahead.size() ) { - Token ret = mv$( m_lookahead.front() ); + Token ret = mv$( m_lookahead.front().first ); + m_hygiene = m_lookahead.front().second; m_lookahead.erase(m_lookahead.begin()); if( DEBUG_PRINT_TOKENS ) { ::std::cout << "getToken[" << typeid(*this).name() << "] - " << ret.get_pos() << "-" << ret << ::std::endl; @@ -48,6 +49,7 @@ Token TokenStream::getToken() else { Token ret = this->innerGetToken(); + m_hygiene = this->realGetHygiene(); if( DEBUG_PRINT_TOKENS ) { ::std::cout << "getToken[" << typeid(*this).name() << "] - " << ret.get_pos() << "-" << ret << ::std::endl; } @@ -85,11 +87,18 @@ eTokenType TokenStream::lookahead(unsigned int i) while( i >= m_lookahead.size() ) { DEBUG("lookahead - read #" << m_lookahead.size()); - m_lookahead.push_back( this->innerGetToken() ); + auto tok = this->innerGetToken(); + auto hygiene = this->realGetHygiene(); + m_lookahead.push_back( ::std::make_pair(mv$(tok), mv$(hygiene)) ); } DEBUG("lookahead(" << i << ") = " << m_lookahead[i]); - return m_lookahead[i].type(); + return m_lookahead[i].first.type(); +} + +Ident::Hygiene TokenStream::getHygiene() const +{ + return m_hygiene; } ProtoSpan TokenStream::start_span() const diff --git a/src/parse/tokenstream.hpp b/src/parse/tokenstream.hpp index c6e2de37..ae737d0d 100644 --- a/src/parse/tokenstream.hpp +++ b/src/parse/tokenstream.hpp @@ -50,7 +50,8 @@ class TokenStream bool m_cache_valid; Token m_cache; - ::std::vector<Token> m_lookahead; + Ident::Hygiene m_hygiene; + ::std::vector< ::std::pair<Token, Ident::Hygiene> > m_lookahead; ParseState m_parse_state; public: TokenStream(); @@ -60,7 +61,7 @@ public: eTokenType lookahead(unsigned int count); virtual Position getPosition() const = 0; - virtual Ident::Hygiene getHygiene() const = 0; + Ident::Hygiene getHygiene() const; ParseState& parse_state() { return m_parse_state; } @@ -71,6 +72,7 @@ public: protected: virtual Token realGetToken() = 0; + virtual Ident::Hygiene realGetHygiene() const = 0; private: Token innerGetToken(); }; diff --git a/src/parse/tokentree.cpp b/src/parse/tokentree.cpp index 8fad6386..25e8ad44 100644 --- a/src/parse/tokentree.cpp +++ b/src/parse/tokentree.cpp @@ -11,7 +11,7 @@ TokenTree TokenTree::clone() const { if( m_subtrees.size() == 0 ) { - return TokenTree(m_tok.clone()); + return TokenTree(m_hygiene, m_tok.clone()); } else { ::std::vector< TokenTree> ents; @@ -21,3 +21,22 @@ TokenTree TokenTree::clone() const return TokenTree( m_hygiene, mv$(ents) ); } } + +::std::ostream& operator<<(::std::ostream& os, const TokenTree& tt) +{ + os << tt.m_hygiene; + 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; + } +} diff --git a/src/parse/tokentree.hpp b/src/parse/tokentree.hpp index 50ca72a5..27b85b45 100644 --- a/src/parse/tokentree.hpp +++ b/src/parse/tokentree.hpp @@ -26,6 +26,11 @@ public: m_tok( ::std::move(tok) )
{
}
+ TokenTree(Ident::Hygiene hygiene, Token tok):
+ m_hygiene( ::std::move(hygiene) ),
+ m_tok( ::std::move(tok) )
+ {
+ }
TokenTree(Ident::Hygiene hygiene, ::std::vector<TokenTree> subtrees):
m_hygiene( ::std::move(hygiene) ),
m_subtrees( ::std::move(subtrees) )
@@ -46,22 +51,7 @@ public: Token& tok() { return m_tok; }
const Ident::Hygiene& hygiene() const { return m_hygiene; }
- 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;
- }
- }
+ friend ::std::ostream& operator<<(::std::ostream& os, const TokenTree& tt);
};
#endif // TOKENTREE_HPP_INCLUDED
diff --git a/src/parse/ttstream.cpp b/src/parse/ttstream.cpp index d969f514..cf2dfb63 100644 --- a/src/parse/ttstream.cpp +++ b/src/parse/ttstream.cpp @@ -22,10 +22,12 @@ Token TTStream::realGetToken() { // If current index is above TT size, go up unsigned int& idx = m_stack.back().first; + assert( m_stack.back().second ); const TokenTree& tree = *m_stack.back().second; if(idx == 0 && tree.is_token()) { idx ++; + m_hygiene_ptr = &tree.hygiene(); return tree.tok(); } @@ -34,7 +36,7 @@ Token TTStream::realGetToken() const TokenTree& subtree = tree[idx]; idx ++; if( subtree.size() == 0 ) { - m_hygiene_ptr = &m_stack.back().second->hygiene(); + m_hygiene_ptr = &subtree.hygiene(); return subtree.tok().clone(); } else { @@ -52,7 +54,7 @@ Position TTStream::getPosition() const { return Position("TTStream", 0,0); } -Ident::Hygiene TTStream::getHygiene() const +Ident::Hygiene TTStream::realGetHygiene() const { assert( m_hygiene_ptr ); return *m_hygiene_ptr; @@ -73,11 +75,12 @@ Token TTStreamO::realGetToken() { // If current index is above TT size, go up unsigned int& idx = m_stack.back().first; - TokenTree& tree = *( m_stack.back().second ? m_stack.back().second : &m_input_tt ); + 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(); + m_hygiene_ptr = &tree.hygiene(); return mv$(tree.tok()); } @@ -87,6 +90,7 @@ Token TTStreamO::realGetToken() idx ++; if( subtree.size() == 0 ) { m_last_pos = subtree.tok().get_pos(); + m_hygiene_ptr = &subtree.hygiene(); return mv$( subtree.tok() ); } else { @@ -103,7 +107,10 @@ Position TTStreamO::getPosition() const { return m_last_pos; } -Ident::Hygiene TTStreamO::getHygiene() const +Ident::Hygiene TTStreamO::realGetHygiene() const { - return (m_stack.back().second ? m_stack.back().second->hygiene() : m_input_tt.hygiene()); + // Empty. + if(!m_hygiene_ptr) + return Ident::Hygiene(); + return *m_hygiene_ptr; } diff --git a/src/parse/ttstream.hpp b/src/parse/ttstream.hpp index 7b7fec4a..575178ac 100644 --- a/src/parse/ttstream.hpp +++ b/src/parse/ttstream.hpp @@ -23,9 +23,9 @@ public: TTStream& operator=(const TTStream& x) { m_stack = x.m_stack; return *this; } Position getPosition() const override; - Ident::Hygiene getHygiene() const override; protected: + Ident::Hygiene realGetHygiene() const override; Token realGetToken() override; }; @@ -36,6 +36,7 @@ class TTStreamO: Position m_last_pos; TokenTree m_input_tt; ::std::vector< ::std::pair<unsigned int, TokenTree*> > m_stack; + const Ident::Hygiene* m_hygiene_ptr = nullptr; public: TTStreamO(TokenTree input_tt); TTStreamO(TTStreamO&& x) = default; @@ -45,8 +46,8 @@ public: TTStreamO& operator=(TTStreamO&& x) = default; Position getPosition() const override; - Ident::Hygiene getHygiene() const override; protected: + Ident::Hygiene realGetHygiene() const override; Token realGetToken() override; }; diff --git a/src/resolve/absolute.cpp b/src/resolve/absolute.cpp index 38f7b27b..120f1b3a 100644 --- a/src/resolve/absolute.cpp +++ b/src/resolve/absolute.cpp @@ -353,7 +353,7 @@ struct Context return false; } AST::Path lookup_opt(const ::std::string& name, const Ident::Hygiene& src_context, LookupMode mode) const { - + DEBUG("name=" << name <<", src_context=" << src_context); for(auto it = m_name_context.rbegin(); it != m_name_context.rend(); ++ it) { TU_MATCH(Ent, (*it), (e), |