| // Copyright 2020 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef FOOMATIC_SHELL_PARSER_H_ |
| #define FOOMATIC_SHELL_PARSER_H_ |
| |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include "foomatic_shell/grammar.h" |
| |
| namespace foomatic_shell { |
| |
| // This class is responsible for converting a sequence of tokens into a Script |
| // structure (see grammar.h for details). |
| class Parser { |
| public: |
| // Constructor. |tokens| is a reference to the input sequence of tokens. |
| // |tokens| must be constant and valid during the lifetime of the object. |
| explicit Parser(const std::vector<Token>& tokens); |
| |
| ~Parser(); |
| Parser(const Parser&) = delete; |
| Parser(Parser&&) = delete; |
| |
| // Parses the sequence of tokens given in the constructor and saves the |
| // resultant tree in |out|. |out| must point to the empty Script structure. |
| // Returns false in case of an error. The parsing stops on the first error. |
| bool ParseWholeInput(Script* out); |
| |
| // Returns the begin iterator from the current token. It is used to report |
| // a position of an error when the method ParseWholeInput(...) fails. |
| std::string::const_iterator GetPosition() const; |
| |
| // Returns an error message if the call ParseWholeInput(...) failed. |
| // Returns an empty string if the call succeeded. |
| const std::string& GetMessage() const { return message_; } |
| |
| private: |
| bool ParseScript(Script* out); |
| bool ParseScriptImpl(Script* out); |
| bool ParsePipeline(Pipeline* out); |
| bool ParsePipeSegment(PipeSegment* out); |
| bool ParseCommand(Command* out); |
| void ParseString(StringAtom* out); |
| class InputTokens; |
| std::unique_ptr<InputTokens> tokens_; |
| std::string message_; |
| // This counter tracks a level of recursive calls to ParseScript(...). |
| int script_recursion_level_ = 0; |
| }; |
| |
| } // namespace foomatic_shell |
| |
| #endif // FOOMATIC_SHELL_PARSER_H_ |