1695b41eeSopenharmony_ci// Copyright 2011 Google Inc. All Rights Reserved.
2695b41eeSopenharmony_ci//
3695b41eeSopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License");
4695b41eeSopenharmony_ci// you may not use this file except in compliance with the License.
5695b41eeSopenharmony_ci// You may obtain a copy of the License at
6695b41eeSopenharmony_ci//
7695b41eeSopenharmony_ci//     http://www.apache.org/licenses/LICENSE-2.0
8695b41eeSopenharmony_ci//
9695b41eeSopenharmony_ci// Unless required by applicable law or agreed to in writing, software
10695b41eeSopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS,
11695b41eeSopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12695b41eeSopenharmony_ci// See the License for the specific language governing permissions and
13695b41eeSopenharmony_ci// limitations under the License.
14695b41eeSopenharmony_ci
15695b41eeSopenharmony_ci#ifndef NINJA_MANIFEST_PARSER_H_
16695b41eeSopenharmony_ci#define NINJA_MANIFEST_PARSER_H_
17695b41eeSopenharmony_ci
18695b41eeSopenharmony_ci#include "parser.h"
19695b41eeSopenharmony_ci
20695b41eeSopenharmony_cistruct BindingEnv;
21695b41eeSopenharmony_cistruct EvalString;
22695b41eeSopenharmony_ci
23695b41eeSopenharmony_cienum DupeEdgeAction {
24695b41eeSopenharmony_ci  kDupeEdgeActionWarn,
25695b41eeSopenharmony_ci  kDupeEdgeActionError,
26695b41eeSopenharmony_ci};
27695b41eeSopenharmony_ci
28695b41eeSopenharmony_cienum PhonyCycleAction {
29695b41eeSopenharmony_ci  kPhonyCycleActionWarn,
30695b41eeSopenharmony_ci  kPhonyCycleActionError,
31695b41eeSopenharmony_ci};
32695b41eeSopenharmony_ci
33695b41eeSopenharmony_cistruct ManifestParserOptions {
34695b41eeSopenharmony_ci  ManifestParserOptions()
35695b41eeSopenharmony_ci      : dupe_edge_action_(kDupeEdgeActionWarn),
36695b41eeSopenharmony_ci        phony_cycle_action_(kPhonyCycleActionWarn) {}
37695b41eeSopenharmony_ci  DupeEdgeAction dupe_edge_action_;
38695b41eeSopenharmony_ci  PhonyCycleAction phony_cycle_action_;
39695b41eeSopenharmony_ci};
40695b41eeSopenharmony_ci
41695b41eeSopenharmony_ci/// Parses .ninja files.
42695b41eeSopenharmony_cistruct ManifestParser : public Parser {
43695b41eeSopenharmony_ci  ManifestParser(State* state, FileReader* file_reader,
44695b41eeSopenharmony_ci                 ManifestParserOptions options = ManifestParserOptions());
45695b41eeSopenharmony_ci
46695b41eeSopenharmony_ci  /// Parse a text string of input.  Used by tests.
47695b41eeSopenharmony_ci  bool ParseTest(const std::string& input, std::string* err) {
48695b41eeSopenharmony_ci    quiet_ = true;
49695b41eeSopenharmony_ci    return Parse("input", input, err);
50695b41eeSopenharmony_ci  }
51695b41eeSopenharmony_ci
52695b41eeSopenharmony_ciprivate:
53695b41eeSopenharmony_ci  /// Parse a file, given its contents as a string.
54695b41eeSopenharmony_ci  bool Parse(const std::string& filename, const std::string& input,
55695b41eeSopenharmony_ci             std::string* err);
56695b41eeSopenharmony_ci
57695b41eeSopenharmony_ci  /// Parse various statement types.
58695b41eeSopenharmony_ci  bool ParsePool(std::string* err);
59695b41eeSopenharmony_ci  bool ParseRule(std::string* err);
60695b41eeSopenharmony_ci  bool ParseLet(std::string* key, EvalString* val, std::string* err);
61695b41eeSopenharmony_ci  bool ParseEdge(std::string* err);
62695b41eeSopenharmony_ci  bool ParseDefault(std::string* err);
63695b41eeSopenharmony_ci
64695b41eeSopenharmony_ci  /// Parse either a 'subninja' or 'include' line.
65695b41eeSopenharmony_ci  bool ParseFileInclude(bool new_scope, std::string* err);
66695b41eeSopenharmony_ci
67695b41eeSopenharmony_ci  BindingEnv* env_;
68695b41eeSopenharmony_ci  ManifestParserOptions options_;
69695b41eeSopenharmony_ci  bool quiet_;
70695b41eeSopenharmony_ci};
71695b41eeSopenharmony_ci
72695b41eeSopenharmony_ci#endif  // NINJA_MANIFEST_PARSER_H_
73