From 8d2e541ab1aa24140eb680fb046e49a4a3f0bbd2 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 12 Oct 2016 14:51:27 +0200 Subject: Various design/implementation cleanups --- build2/token | 76 ++++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 54 insertions(+), 22 deletions(-) (limited to 'build2/token') diff --git a/build2/token b/build2/token index c896ba1..04a7ebd 100644 --- a/build2/token +++ b/build2/token @@ -8,31 +8,46 @@ #include #include +#include + namespace build2 { - enum class token_type + // Extendable/inheritable enum-like class. + // + struct token_type { - eos, - name, - newline, - pair_separator, - colon, - lcbrace, // { - rcbrace, // } - lsbrace, // [ - rsbrace, // ] - assign, // = - prepend, // =+ - append, // += - equal, // == - not_equal, // != - less, // < - greater, // > - less_equal, // <= - greater_equal, // >= - dollar, - lparen, - rparen + enum + { + eos, + name, + newline, + pair_separator, + colon, + lcbrace, // { + rcbrace, // } + lsbrace, // [ + rsbrace, // ] + assign, // = + prepend, // =+ + append, // += + equal, // == + not_equal, // != + less, // < + greater, // > + less_equal, // <= + greater_equal, // >= + dollar, // $ + lparen, // ( + rparen, // ) + + value_next + }; + + using value_type = uint16_t; + + token_type (value_type v = eos): v_ (v) {} + operator value_type () const {return v_;} + value_type v_; }; class token @@ -64,6 +79,23 @@ namespace build2 // ostream& operator<< (ostream&, const token&); + + // Diagnostics plumbing. We assume that any diag stream for which we can use + // token as location has its aux data pointing to pointer to path. + // + inline location + get_location (const token& t, const path& p) + { + return location (&p, t.line, t.column); + } + + inline location + get_location (const token& t, const void* data) + { + assert (data != nullptr); // E.g., must be &parser::path_. + const path* p (*static_cast (data)); + return get_location (t, *p); + } } #endif // BUILD2_TOKEN -- cgit v1.1