aboutsummaryrefslogtreecommitdiff
path: root/build2/lexer.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'build2/lexer.cxx')
-rw-r--r--build2/lexer.cxx54
1 files changed, 43 insertions, 11 deletions
diff --git a/build2/lexer.cxx b/build2/lexer.cxx
index 65bb5e9..da3d64e 100644
--- a/build2/lexer.cxx
+++ b/build2/lexer.cxx
@@ -126,8 +126,8 @@ namespace build2
uint64_t ln (c.line), cn (c.column);
- // This mode is quite a bit like the value mode when it comes
- // to special characters.
+ // This mode is quite a bit like the value mode when it comes to special
+ // characters, except that we have some of our own.
//
switch (c)
{
@@ -143,6 +143,15 @@ namespace build2
mode_.pop (); // Expire eval mode.
return token (type::rparen, sep, ln, cn);
}
+ case '=':
+ case '!':
+ {
+ if (peek () == '=')
+ {
+ get ();
+ return token (c == '=' ? type::equal : type::not_equal, sep, ln, cn);
+ }
+ }
}
// Otherwise it is a name.
@@ -194,31 +203,34 @@ namespace build2
if (m == lexer_mode::pairs && c == pair_separator_)
break;
- // The following characters are not treated as special in the
- // value/pairs, eval, and quoted modes.
+ // The following characters are only special in the normal and
+ // variable name modes.
//
- if (m != lexer_mode::value &&
- m != lexer_mode::pairs &&
- m != lexer_mode::eval &&
- m != lexer_mode::quoted)
+ if (m == lexer_mode::normal || m == lexer_mode::variable)
{
switch (c)
{
case ':':
- case '+':
case '=':
{
done = true;
break;
}
+ case '+':
+ {
+ get ();
+ done = (peek () == '=');
+ unget (c);
+ break;
+ }
}
if (done)
break;
}
- // While these extra characters are treated as the name end in
- // the variable mode.
+ // These extra characters are treated as the name end in the variable
+ // mode.
//
if (m == lexer_mode::variable)
{
@@ -236,6 +248,26 @@ namespace build2
break;
}
+ // These extra characters are treated as the name end in the eval mode.
+ //
+ if (m == lexer_mode::eval)
+ {
+ switch (c)
+ {
+ case '=':
+ case '!':
+ {
+ get ();
+ done = (peek () == '=');
+ unget (c);
+ break;
+ }
+ }
+
+ if (done)
+ break;
+ }
+
// If we are quoted, these are ordinary characters.
//
if (m != lexer_mode::quoted)