summaryrefslogtreecommitdiffstats
path: root/src/parsers.cc
diff options
context:
space:
mode:
authorEvan Martin <martine@danga.com>2010-12-20 00:19:34 (GMT)
committerEvan Martin <martine@danga.com>2010-12-21 00:01:53 (GMT)
commitf2a4bac9127124563cd783a798e64dd15204d598 (patch)
tree83d8283883197d41146a19beded31f5fb179ab2b /src/parsers.cc
parent1297efdd10db66a6174f4fa2e71dd4169b278abd (diff)
downloadNinja-f2a4bac9127124563cd783a798e64dd15204d598.zip
Ninja-f2a4bac9127124563cd783a798e64dd15204d598.tar.gz
Ninja-f2a4bac9127124563cd783a798e64dd15204d598.tar.bz2
immediately evaluate variables in top-level bindings
Diffstat (limited to 'src/parsers.cc')
-rw-r--r--src/parsers.cc17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/parsers.cc b/src/parsers.cc
index 8408195..4f19046 100644
--- a/src/parsers.cc
+++ b/src/parsers.cc
@@ -254,7 +254,7 @@ bool ManifestParser::Parse(const string& input, string* err) {
break;
case Token::IDENT: {
string name, value;
- if (!ParseLet(&name, &value, err))
+ if (!ParseLet(&name, &value, true, err))
return false;
if (value.substr(0, 9) == "ROOT_HACK") {
// XXX remove this hack, or make it more principled.
@@ -302,7 +302,7 @@ bool ManifestParser::ParseRule(string* err) {
while (tokenizer_.PeekToken() != Token::OUTDENT) {
string key, val;
- if (!ParseLet(&key, &val, err))
+ if (!ParseLet(&key, &val, false, err))
return false;
string parse_err;
@@ -331,7 +331,8 @@ bool ManifestParser::ParseRule(string* err) {
return true;
}
-bool ManifestParser::ParseLet(string* name, string* value, string* err) {
+bool ManifestParser::ParseLet(string* name, string* value, bool expand,
+ string* err) {
if (!tokenizer_.ReadIdent(name))
return tokenizer_.Error("expected variable name", err);
if (!tokenizer_.ExpectToken(Token::EQUALS, err))
@@ -342,6 +343,14 @@ bool ManifestParser::ParseLet(string* name, string* value, string* err) {
if (!tokenizer_.ReadToNewline(value, err))
return false;
+ if (expand) {
+ EvalString eval;
+ string eval_err;
+ if (!eval.Parse(*value, &eval_err))
+ return tokenizer_.Error(eval_err, err);
+ *value = eval.Evaluate(env_);
+ }
+
return true;
}
@@ -427,7 +436,7 @@ bool ManifestParser::ParseEdge(string* err) {
env->parent_ = env_;
while (tokenizer_.PeekToken() != Token::OUTDENT) {
string key, val;
- if (!ParseLet(&key, &val, err))
+ if (!ParseLet(&key, &val, false, err))
return false;
env->AddBinding(key, val);
}