diff options
Diffstat (limited to 'build/parser')
-rw-r--r-- | build/parser | 296 |
1 files changed, 0 insertions, 296 deletions
diff --git a/build/parser b/build/parser deleted file mode 100644 index 2631ca2..0000000 --- a/build/parser +++ /dev/null @@ -1,296 +0,0 @@ -// file : build/parser -*- C++ -*- -// copyright : Copyright (c) 2014-2015 Code Synthesis Ltd -// license : MIT; see accompanying LICENSE file - -#ifndef BUILD_PARSER -#define BUILD_PARSER - -#include <string> -#include <iosfwd> - -#include <build/types> -#include <build/utility> - -#include <build/spec> -#include <build/lexer> -#include <build/token> -#include <build/variable> // list_value -#include <build/diagnostics> - -namespace build -{ - class scope; - class target; - - class parser - { - public: - typedef build::names names_type; - typedef build::variable variable_type; - - // If boot is true, then we are parsing bootstrap.build and modules - // should only be bootstrapped. - // - parser (bool boot = false): fail (&path_), boot_ (boot) {} - - // Issue diagnostics and throw failed in case of an error. - // - void - parse_buildfile (std::istream&, const path&, scope& root, scope& base); - - buildspec - parse_buildspec (std::istream&, const std::string& name); - - token - parse_variable (lexer&, scope&, std::string name, token_type kind); - - names_type - parse_export_stub (std::istream& is, const path& p, scope& r, scope& b) - { - parse_buildfile (is, p, r, b); - return std::move (export_value_); - } - - // Recursive descent parser. - // - protected: - void - clause (token&, token_type&); - - void - print (token&, token_type&); - - void - source (token&, token_type&); - - void - include (token&, token_type&); - - void - import (token&, token_type&); - - void - export_ (token&, token_type&); - - void - using_ (token&, token_type&); - - void - define (token&, token_type&); - - void - if_else (token&, token_type&); - - void - variable (token&, token_type&, std::string name, token_type kind); - - std::string - variable_name (names_type&&, const location&); - - names_type - variable_value (token&, token_type&, const variable_type&); - - names_type - eval (token&, token_type&); - - // If chunk is true, then parse the smallest but complete, name-wise, - // chunk of input. Note that in this case you may still end up with - // multiple names, for example, {foo bar}. - // - names_type - names (token& t, token_type& tt, bool chunk = false) - { - names_type ns; - names (t, tt, ns, chunk, 0, nullptr, nullptr, nullptr); - return ns; - } - - void - names (token&, token_type&, - names_type&, - bool chunk, - std::size_t pair, - const std::string* prj, - const dir_path* dir, - const std::string* type); - - size_t - names_trailer (token&, token_type&, - names_type&, - size_t pair, - const std::string* prj, - const dir_path* dir, - const std::string* type); - - // Skip until newline or eos. - // - void - skip_line (token&, token_type&); - - // Skip until block-closing } or eos, taking into account nested blocks. - // - void - skip_block (token&, token_type&); - - // Return true if the name token can be considered a directive keyword. - // - bool - keyword (token&); - - // Buildspec. - // - buildspec - buildspec_clause (token&, token_type&, token_type end); - - // Utilities. - // - protected: - - // Switch to a new current scope. Note that this function might - // also have to switch to a new root scope if the new current - // scope is in another project. So both must be saved and - // restored. - // - void - switch_scope (const dir_path&); - - void - process_default_target (token&); - - // Enter buildfile as a target. - // - void - enter_buildfile (const path&); - - // Lexer. - // - protected: - token_type - next (token&, token_type&); - - // Be careful with peeking and switching the lexer mode. See keyword() - // for more information. - // - token_type - peek (); - - const token& - peeked () const - { - assert (peeked_); - return peek_; - } - - void - mode (lexer_mode m, char ps = '=') - { - if (replay_ != replay::play) - lexer_->mode (m, ps); - } - - lexer_mode - mode () const - { - assert (replay_ != replay::play); - return lexer_->mode (); - } - - void - expire_mode () - { - if (replay_ != replay::play) - lexer_->expire_mode (); - } - - // Token saving and replaying. Note that is can only be used in certain - // contexts. Specifically, the lexer mode should be the same and the code - // that parses a replay must not interact with the lexer directly (e.g., - // the keyword() test). For now we don't enforce any of this. - // - // Note also that the peeked token is not part of the replay, until it - // is "got". - // - // - void - replay_save () - { - assert (replay_ == replay::stop); - replay_ = replay::save; - } - - void - replay_play () - { - assert ((replay_ == replay::save && !replay_data_.empty ()) || - (replay_ == replay::play && replay_i_ == replay_data_.size ())); - - replay_i_ = 0; - replay_ = replay::play; - } - - void - replay_stop () - { - replay_data_.clear (); - replay_ = replay::stop; - } - - const token& - replay_next () - { - assert (replay_i_ != replay_data_.size ()); - return replay_data_[replay_i_++]; - } - - struct replay_guard - { - replay_guard (parser& p, bool start = true) - : p_ (start ? &p : nullptr) - { - if (p_ != nullptr) - p_->replay_save (); - } - - void - play () - { - if (p_ != nullptr) - p_->replay_play (); - } - - ~replay_guard () - { - if (p_ != nullptr) - p_->replay_stop (); - } - - private: - parser* p_; - }; - - // Diagnostics. - // - protected: - const fail_mark<failed> fail; - - protected: - bool boot_; - - const std::string* path_; // Path processed by diag_relative() and pooled. - lexer* lexer_; - target* target_; // Current target, if any. - scope* scope_; // Current base scope (out_base). - scope* root_; // Current root scope (out_root). - target* default_target_; - names_type export_value_; - - token peek_ = token (token_type::eos, false, 0, 0); - bool peeked_ = false; - - enum class replay {stop, save, play} replay_ = replay::stop; - vector<token> replay_data_; - size_t replay_i_; // Position of the next token during replay. - }; -} - -#endif // BUILD_PARSER |