// 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 #include #include #include 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 = 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