1- using System . Runtime . CompilerServices ;
1+ using System . Collections . Immutable ;
2+ using System . Runtime . CompilerServices ;
23using System . Text ;
34using Starscript . Util ;
45
@@ -72,19 +73,21 @@ public void Next() {
7273 case '!' : CreateToken ( Match ( '=' ) ? Token . BangEqual : Token . Bang ) ; break ;
7374 case '>' :
7475 CreateToken (
75- Match ( '=' )
76- ? Token . GreaterEqual
77- : Match ( '>' )
78- ? Token . RightShift
76+ Match ( '=' )
77+ ? Token . GreaterEqual
78+ : Match ( '>' )
79+ ? Match ( '>' )
80+ ? Token . TripleGreater
81+ : Token . DoubleGreater
7982 : Token . Greater
8083 ) ;
8184 break ;
8285 case '<' :
8386 CreateToken (
84- Match ( '=' )
85- ? Token . LessEqual
86- : Match ( '<' )
87- ? Token . LeftShift
87+ Match ( '=' )
88+ ? Token . LessEqual
89+ : Match ( '<' )
90+ ? Token . DoubleLess
8891 : Token . Less
8992 ) ;
9093 break ;
@@ -94,7 +97,12 @@ public void Next() {
9497 case '*' : CreateToken ( Token . Star ) ; break ;
9598 case '/' : CreateToken ( Token . Slash ) ; break ;
9699 case '%' : CreateToken ( Token . Percentage ) ; break ;
97- case '^' : CreateToken ( Token . UpArrow ) ; break ;
100+ case '^' : CreateToken (
101+ Match ( '^' )
102+ ? Token . DoubleUpArrow
103+ : Token . UpArrow
104+ ) ;
105+ break ;
98106
99107 case '.' : CreateToken ( Token . Dot ) ; break ;
100108 case ',' : CreateToken ( Token . Comma ) ; break ;
@@ -110,6 +118,10 @@ public void Next() {
110118 CreateToken ( Token . Section , Source [ ( Start + 1 ) ..Current ] ) ;
111119 break ;
112120
121+ case '&' : CreateToken ( Token . Ampersand ) ; break ;
122+ case '|' : CreateToken ( Token . VBar ) ; break ;
123+ case '~' : CreateToken ( Token . Tilde ) ; break ;
124+
113125 default : Unexpected ( ) ; break ;
114126 }
115127 }
@@ -182,17 +194,25 @@ private void Number() {
182194 CreateToken ( Token . Number ) ;
183195 }
184196
197+ public static readonly ImmutableArray < string > Keywords = [ NullKeyword , TrueKeyword , FalseKeyword , AndKeyword , OrKeyword ] ;
198+
199+ private const string NullKeyword = "null" ;
200+ private const string TrueKeyword = "true" ;
201+ private const string FalseKeyword = "false" ;
202+ private const string AndKeyword = "and" ;
203+ private const string OrKeyword = "or" ;
204+
185205 private void Identifier ( ) {
186206 while ( ! IsAtEnd && IsAlphanumeric ( Peek ( ) ) ) Advance ( ) ;
187207
188208 CreateToken ( Token . Identifier ) ;
189209
190210 switch ( Lexeme ) {
191- case "null" : Token = Token . Null ; break ;
192- case "true" : Token = Token . True ; break ;
193- case "false" : Token = Token . False ; break ;
194- case "and" : Token = Token . And ; break ;
195- case "or" : Token = Token . Or ; break ;
211+ case NullKeyword : Token = Token . Null ; break ;
212+ case TrueKeyword : Token = Token . True ; break ;
213+ case FalseKeyword : Token = Token . False ; break ;
214+ case AndKeyword : Token = Token . And ; break ;
215+ case OrKeyword : Token = Token . Or ; break ;
196216 }
197217 }
198218
0 commit comments