aboutsummaryrefslogtreecommitdiff
path: root/build2/test/script/lexer.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2016-10-16 13:29:57 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2016-11-04 09:26:21 +0200
commit4230333bc5b32d30e35264b1104240bb5e2247ff (patch)
tree0e3873c012dcf83281ecb43c4cfe2780a794a25c /build2/test/script/lexer.cxx
parentd81ad6a0b20613ac77e115ca273cd48eaeeae1c8 (diff)
Implement testscript $*, $NN, $~ special variables
Diffstat (limited to 'build2/test/script/lexer.cxx')
-rw-r--r--build2/test/script/lexer.cxx30
1 files changed, 30 insertions, 0 deletions
diff --git a/build2/test/script/lexer.cxx b/build2/test/script/lexer.cxx
index 324e577..4d57fe4 100644
--- a/build2/test/script/lexer.cxx
+++ b/build2/test/script/lexer.cxx
@@ -263,6 +263,36 @@ namespace build2
unget (c);
return name (sep);
}
+
+ token lexer::
+ name (bool sep)
+ {
+ // Customized implementation that handles special variable names ($*,
+ // $~, $NNN).
+ //
+ if (state_.top ().mode != lexer_mode::variable)
+ return base_lexer::name (sep);
+
+ xchar c (peek ());
+
+ if (c != '*' && c != '~' && !digit (c))
+ return base_lexer::name (sep);
+
+ uint64_t ln (c.line), cn (c.column);
+ string lexeme;
+
+ get ();
+ lexeme += c;
+
+ if (digit (c))
+ {
+ for (; digit (c = peek ()); get ())
+ lexeme += c;
+ }
+
+ state_.pop (); // Expire the variable mode.
+ return token (move (lexeme), sep, false, ln, cn);
+ }
}
}
}