reader/wgsl: Lex underscore tokens

Bug: tint:1213
Change-Id: Ic5f2bfb2da0bf0f9511f029a93c7007266b2984c
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/67063
Commit-Queue: Ben Clayton <bclayton@google.com>
Kokoro: Ben Clayton <bclayton@google.com>
Reviewed-by: David Neto <dneto@google.com>
Reviewed-by: James Price <jrprice@google.com>
diff --git a/src/reader/wgsl/lexer.cc b/src/reader/wgsl/lexer.cc
index 5437286..700c33f 100644
--- a/src/reader/wgsl/lexer.cc
+++ b/src/reader/wgsl/lexer.cc
@@ -840,6 +840,10 @@
     type = Token::Type::kTilde;
     pos_ += 1;
     location_.column += 1;
+  } else if (matches(pos_, "_")) {
+    type = Token::Type::kUnderscore;
+    pos_ += 1;
+    location_.column += 1;
   } else if (matches(pos_, "^")) {
     type = Token::Type::kXor;
     pos_ += 1;
diff --git a/src/reader/wgsl/lexer_test.cc b/src/reader/wgsl/lexer_test.cc
index 24c5298..4c5e9b1 100644
--- a/src/reader/wgsl/lexer_test.cc
+++ b/src/reader/wgsl/lexer_test.cc
@@ -493,6 +493,7 @@
                     TokenData{";", Token::Type::kSemicolon},
                     TokenData{"*", Token::Type::kStar},
                     TokenData{"~", Token::Type::kTilde},
+                    TokenData{"_", Token::Type::kUnderscore},
                     TokenData{"^", Token::Type::kXor}));
 
 using KeywordTest = testing::TestWithParam<TokenData>;
diff --git a/src/reader/wgsl/token.cc b/src/reader/wgsl/token.cc
index 4e4a62c..2a625bb 100644
--- a/src/reader/wgsl/token.cc
+++ b/src/reader/wgsl/token.cc
@@ -106,6 +106,8 @@
       return "*";
     case Token::Type::kTilde:
       return "~";
+    case Token::Type::kUnderscore:
+      return "_";
     case Token::Type::kXor:
       return "^";
 
diff --git a/src/reader/wgsl/token.h b/src/reader/wgsl/token.h
index de2b360..35c8f79 100644
--- a/src/reader/wgsl/token.h
+++ b/src/reader/wgsl/token.h
@@ -114,6 +114,8 @@
     kStar,
     /// A '~'
     kTilde,
+    /// A '_'
+    kUnderscore,
     /// A '^'
     kXor,