1 // Copyright 2018 Google Inc. All Rights Reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "parser.h"
16 
17 #include "disk_interface.h"
18 #include "metrics.h"
19 
20 using namespace std;
21 
Load(const string& filename, string* err, Lexer* parent)22 bool Parser::Load(const string& filename, string* err, Lexer* parent) {
23     // If |parent| is not NULL, metrics collection has been started by a parent
24     // Parser::Load() in our call stack. Do not start a new one here to avoid
25     // over-counting parsing times.
26     METRIC_RECORD_IF(".ninja parse", parent == NULL);
27     string contents;
28     string read_err;
29     if (file_reader_->ReadFile(filename, &contents, &read_err) !=
30             FileReader::Okay) {
31         *err = "loading '" + filename + "': " + read_err;
32         if (parent)
33             parent->Error(string(*err), err);
34         return false;
35     }
36 
37     return Parse(filename, contents, err);
38 }
39 
ExpectToken(Lexer::Token expected, string* err)40 bool Parser::ExpectToken(Lexer::Token expected, string* err) {
41     Lexer::Token token = lexer_.ReadToken();
42     if (token != expected) {
43         string message = string("expected ") + Lexer::TokenName(expected);
44         message += string(", got ") + Lexer::TokenName(token);
45         message += Lexer::TokenErrorHint(expected);
46         return lexer_.Error(message, err);
47     }
48     return true;
49 }
50