blob: 3a7f1171b4d15ec413513f61005bc81c1b2e0c27 [file] [log] [blame]
// 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_