diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2016-10-12 14:53:32 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2016-11-04 08:29:23 +0200 |
commit | 18ce15f3aee71debe3f35356c6a739943815da8a (patch) | |
tree | 828dea05101c11c5b0b6974b25447226db37debf /build2/test/script/lexer | |
parent | f423dbc95239cc88021d5d332ad19eeecc6e11e8 (diff) |
Initial work on testscript lexer/parser
Diffstat (limited to 'build2/test/script/lexer')
-rw-r--r-- | build2/test/script/lexer | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/build2/test/script/lexer b/build2/test/script/lexer new file mode 100644 index 0000000..de4c84e --- /dev/null +++ b/build2/test/script/lexer @@ -0,0 +1,74 @@ +// file : build2/test/script/lexer -*- C++ -*- +// copyright : Copyright (c) 2014-2016 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#ifndef BUILD2_TEST_SCRIPT_LEXER +#define BUILD2_TEST_SCRIPT_LEXER + +#include <build2/types> +#include <build2/utility> + +#include <build2/lexer> + +#include <build2/test/script/token> + +namespace build2 +{ + namespace test + { + namespace script + { + struct lexer_mode: build2::lexer_mode + { + using base_type = build2::lexer_mode; + + enum + { + script_line = base_type::value_next, + variable_line, + test_line, + command_line + }; + + using base_type::base_type; + }; + + 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) + : base_lexer (is, name, nullptr, nullptr, false) {mode (m);} + + virtual void + mode (base_mode, char = '\0') override; + + // Return true if we entered the quoted (double or single) mode since + // last reset. + // + bool + quoted () const {return quoted_;} + + void + reset_quoted (bool q) {quoted_ = q;} + + protected: + virtual token + next_impl () override; + + token + next_line (); + + token + name_line (bool separated); + + protected: + bool quoted_ = false; + }; + } + } +} + +#endif // BUILD2_TEST_SCRIPT_LEXER |