// file : build2/test/script/parser -*- C++ -*- // copyright : Copyright (c) 2014-2016 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file #ifndef BUILD2_TEST_SCRIPT_PARSER #define BUILD2_TEST_SCRIPT_PARSER #include #include #include #include #include #include namespace build2 { namespace test { namespace script { class lexer; class runner; class parser: protected build2::parser { public: // Issue diagnostics and throw failed in case of an error. // void pre_parse (istream&, const path& name, script&); void parse (const path& name, script& s, runner& r) { parse (s, name, s, r); } // Recursive descent parser. // // Each parse function receives the token/type from which it should // start consuming. On return the token/type should contain the first // token that has not been consumed. For *_line() functions this is // the newline. // protected: void parse (scope&, const path& name, script&, runner&); token pre_parse_scope_body (); void parse_scope_body (); description pre_parse_description (token&, token_type&); optional pre_parse_line (token&, token_type&, optional&&, lines* = nullptr); bool parse_variable_line (token&, token_type&); pair> parse_command_line (token&, token_type&, line_type, size_t); command_exit parse_command_exit (token&, token_type&); string parse_here_document (token&, token_type&, const string&, bool); // Customization hooks. // protected: virtual lookup lookup_variable (name&&, string&&, const location&) override; // Number of quoted tokens since last reset. Note that this includes // the peeked token, if any. // protected: size_t quoted () const; void reset_quoted (token& current); size_t replay_quoted_; // Insert id into the id map checking for duplicates. // protected: const string& insert_id (string, location); protected: using base_parser = build2::parser; lexer* lexer_; script* script_; runner* runner_; // Pre-parse state. // using id_map = std::unordered_map; group* group_; id_map* id_map_; // Parse state. // scope* scope_; }; } } } #endif // BUILD2_TEST_SCRIPT_PARSER