diff options
Diffstat (limited to 'build2/test/script/lexer.hxx')
-rw-r--r-- | build2/test/script/lexer.hxx | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/build2/test/script/lexer.hxx b/build2/test/script/lexer.hxx new file mode 100644 index 0000000..a262764 --- /dev/null +++ b/build2/test/script/lexer.hxx @@ -0,0 +1,90 @@ +// file : build2/test/script/lexer.hxx -*- C++ -*- +// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#ifndef BUILD2_TEST_SCRIPT_LEXER_HXX +#define BUILD2_TEST_SCRIPT_LEXER_HXX + +#include <build2/types.hxx> +#include <build2/utility.hxx> + +#include <build2/lexer.hxx> + +#include <build2/test/script/token.hxx> + +namespace build2 +{ + namespace test + { + namespace script + { + struct lexer_mode: build2::lexer_mode + { + using base_type = build2::lexer_mode; + + enum + { + command_line = base_type::value_next, + first_token, // Expires at the end of the token. + second_token, // Expires at the end of the token. + variable_line, // Expires at the end of the line. + command_expansion, + here_line_single, + here_line_double, + description_line // Expires at the end of the line. + }; + + lexer_mode () = default; + lexer_mode (value_type v): base_type (v) {} + lexer_mode (base_type v): base_type (v) {} + }; + + class lexer: public build2::lexer + { + public: + using base_lexer = build2::lexer; + using base_mode = build2::lexer_mode; + + lexer (istream& is, + const path& name, + lexer_mode m, + const char* escapes = nullptr) + : base_lexer (is, name, nullptr, false) + { + mode (m, '\0', escapes); + } + + virtual void + mode (base_mode, + char = '\0', + optional<const char*> = nullopt) override; + + // Number of quoted (double or single) tokens since last reset. + // + size_t + quoted () const {return quoted_;} + + void + reset_quoted (size_t q) {quoted_ = q;} + + virtual token + next () override; + + protected: + token + next_line (); + + token + next_description (); + + virtual token + word (state, bool) override; + + protected: + size_t quoted_; + }; + } + } +} + +#endif // BUILD2_TEST_SCRIPT_LEXER_HXX |