| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "tools/gn/parser.h" | 5 #include "tools/gn/parser.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "tools/gn/functions.h" | 8 #include "tools/gn/functions.h" |
| 9 #include "tools/gn/operators.h" | 9 #include "tools/gn/operators.h" |
| 10 #include "tools/gn/token.h" | 10 #include "tools/gn/token.h" |
| 11 | 11 |
| 12 // grammar: | 12 // grammar: |
| 13 // | 13 // |
| 14 // file := (statement)* | 14 // file := (statement)* |
| 15 // statement := block | if | assignment | 15 // statement := block | if | assignment |
| 16 // block := '{' statement* '}' | 16 // block := '{' statement* '}' |
| 17 // if := 'if' '(' expr ')' statement [ else ] | 17 // if := 'if' '(' expr ')' statement [ else ] |
| 18 // else := 'else' (if | statement)* | 18 // else := 'else' (if | statement)* |
| 19 // assignment := ident {'=' | '+=' | '-='} expr | 19 // assignment := ident {'=' | '+=' | '-='} expr |
| 20 | 20 |
| 21 namespace { | |
| 22 | |
| 23 // Returns true if the two tokens are on the same line. We assume they're in | |
| 24 // the same file. | |
| 25 bool IsSameLine(const Token& a, const Token& b) { | |
| 26 DCHECK(a.location().file() == b.location().file()); | |
| 27 return a.location().line_number() == b.location().line_number(); | |
| 28 } | |
| 29 | |
| 30 } // namespace | |
| 31 | |
| 32 enum Precedence { | 21 enum Precedence { |
| 33 PRECEDENCE_ASSIGNMENT = 1, | 22 PRECEDENCE_ASSIGNMENT = 1, |
| 34 PRECEDENCE_OR = 2, | 23 PRECEDENCE_OR = 2, |
| 35 PRECEDENCE_AND = 3, | 24 PRECEDENCE_AND = 3, |
| 36 PRECEDENCE_EQUALITY = 4, | 25 PRECEDENCE_EQUALITY = 4, |
| 37 PRECEDENCE_RELATION = 5, | 26 PRECEDENCE_RELATION = 5, |
| 38 PRECEDENCE_SUM = 6, | 27 PRECEDENCE_SUM = 6, |
| 39 PRECEDENCE_PREFIX = 7, | 28 PRECEDENCE_PREFIX = 7, |
| 40 PRECEDENCE_CALL = 8, | 29 PRECEDENCE_CALL = 8, |
| 41 }; | 30 }; |
| (...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 430 if (IsAssignment(condition->condition())) | 419 if (IsAssignment(condition->condition())) |
| 431 *err_ = Err(condition->condition(), "Assignment not allowed in 'if'."); | 420 *err_ = Err(condition->condition(), "Assignment not allowed in 'if'."); |
| 432 Consume(Token::RIGHT_PAREN, "Expected ')' after condition of 'if'."); | 421 Consume(Token::RIGHT_PAREN, "Expected ')' after condition of 'if'."); |
| 433 condition->set_if_true(ParseBlock().Pass()); | 422 condition->set_if_true(ParseBlock().Pass()); |
| 434 if (Match(Token::ELSE)) | 423 if (Match(Token::ELSE)) |
| 435 condition->set_if_false(ParseStatement().Pass()); | 424 condition->set_if_false(ParseStatement().Pass()); |
| 436 if (has_error()) | 425 if (has_error()) |
| 437 return scoped_ptr<ParseNode>(); | 426 return scoped_ptr<ParseNode>(); |
| 438 return condition.PassAs<ParseNode>(); | 427 return condition.PassAs<ParseNode>(); |
| 439 } | 428 } |
| OLD | NEW |