aboutsummaryrefslogtreecommitdiff
path: root/build2/lexer.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2019-05-09 14:12:45 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2019-05-10 08:01:33 +0200
commit2b1272f1c94ab1dbaf806af9c02ef866267ffed7 (patch)
treee7ad99fbb36367a0883eadaade94c41c9894fced /build2/lexer.cxx
parent1b0efce7791d4d61aa57038edb30fb823ed48e21 (diff)
Generalize target/prerequisite var block, initial ad hoc target work
Target/prerequisite-specific variable blocks can now be present even if there are prerequisites. For example, now instead of: exe{foo}: cxx{foo} exe{foo}: cc.loptions += ... Or: exe{foo}: cxx{foo} exe{foo}: { cc.loptions += ... cc.libs += ... } We can write: exe{foo}: cxx{foo} { cc.loptions += ... cc.libs += ... } This also works with dependency chains in which case the block applies to the set of prerequisites (note: not targets) before the last ':'. For example: ./: exe{foo}: libue{foo}: cxx{foo} { bin.whole = false # Applies to the libue{foo} prerequisite. }
Diffstat (limited to 'build2/lexer.cxx')
-rw-r--r--build2/lexer.cxx19
1 files changed, 17 insertions, 2 deletions
diff --git a/build2/lexer.cxx b/build2/lexer.cxx
index 66f50b0..8287640 100644
--- a/build2/lexer.cxx
+++ b/build2/lexer.cxx
@@ -39,8 +39,8 @@ namespace build2
{
case lexer_mode::normal:
{
- s1 = ":=+ $(){}[]#\t\n";
- s2 = " = ";
+ s1 = ":<>=+ $(){}[]#\t\n";
+ s2 = " = ";
break;
}
case lexer_mode::value:
@@ -205,10 +205,25 @@ namespace build2
}
}
+ // The following characters are special in the normal mode.
+ //
+ if (m == lexer_mode::normal)
+ {
+ // NOTE: remember to update mode() if adding new special characters.
+ //
+ switch (c)
+ {
+ case '<': return make_token (type::labrace);
+ case '>': return make_token (type::rabrace);
+ }
+ }
+
// The following characters are special in the buildspec mode.
//
if (m == lexer_mode::buildspec)
{
+ // NOTE: remember to update mode() if adding new special characters.
+ //
switch (c)
{
case ',': return make_token (type::comma);