diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2016-10-16 13:29:57 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2016-11-04 09:26:21 +0200 |
commit | 4230333bc5b32d30e35264b1104240bb5e2247ff (patch) | |
tree | 0e3873c012dcf83281ecb43c4cfe2780a794a25c /build2/test/script/lexer.cxx | |
parent | d81ad6a0b20613ac77e115ca273cd48eaeeae1c8 (diff) |
Implement testscript $*, $NN, $~ special variables
Diffstat (limited to 'build2/test/script/lexer.cxx')
-rw-r--r-- | build2/test/script/lexer.cxx | 30 |
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); + } } } } |