@@ -54,7 +54,7 @@ pub enum Token {
5454 Neq ,
5555 /// Less Than operator `<`
5656 Lt ,
57- /// Greater han operator `>`
57+ /// Greater Than operator `>`
5858 Gt ,
5959 /// Less Than Or Equals operator `<=`
6060 LtEq ,
@@ -102,6 +102,24 @@ pub enum Token {
102102 RBrace ,
103103 /// Right Arrow `=>`
104104 RArrow ,
105+ /// Sharp `#` used for PostgreSQL Bitwise XOR operator
106+ Sharp ,
107+ /// Tilde `~` used for PostgreSQL Bitwise NOT operator
108+ Tilde ,
109+ /// `<<`, a bitwise shift left operator in PostgreSQL
110+ ShiftLeft ,
111+ /// `>>`, a bitwise shift right operator in PostgreSQL
112+ ShiftRight ,
113+ /// Exclamation Mark `!` used for PostgreSQL factorial operator
114+ ExclamationMark ,
115+ /// Double Exclamation Mark `!!` used for PostgreSQL prefix factorial operator
116+ DoubleExclamationMark ,
117+ /// AtSign `@` used for PostgreSQL abs operator
118+ AtSign ,
119+ /// `|/`, a square root math operator in PostgreSQL
120+ PGSquareRoot ,
121+ /// `||/` , a cube root math operator in PostgreSQL
122+ PGCubeRoot ,
105123}
106124
107125impl fmt:: Display for Token {
@@ -143,6 +161,15 @@ impl fmt::Display for Token {
143161 Token :: LBrace => f. write_str ( "{" ) ,
144162 Token :: RBrace => f. write_str ( "}" ) ,
145163 Token :: RArrow => f. write_str ( "=>" ) ,
164+ Token :: Sharp => f. write_str ( "#" ) ,
165+ Token :: ExclamationMark => f. write_str ( "!" ) ,
166+ Token :: DoubleExclamationMark => f. write_str ( "!!" ) ,
167+ Token :: Tilde => f. write_str ( "~" ) ,
168+ Token :: AtSign => f. write_str ( "@" ) ,
169+ Token :: ShiftLeft => f. write_str ( "<<" ) ,
170+ Token :: ShiftRight => f. write_str ( ">>" ) ,
171+ Token :: PGSquareRoot => f. write_str ( "|/" ) ,
172+ Token :: PGCubeRoot => f. write_str ( "||/" ) ,
146173 }
147174 }
148175}
@@ -406,7 +433,14 @@ impl<'a> Tokenizer<'a> {
406433 '|' => {
407434 chars. next ( ) ; // consume the '|'
408435 match chars. peek ( ) {
409- Some ( '|' ) => self . consume_and_return ( chars, Token :: StringConcat ) ,
436+ Some ( '/' ) => self . consume_and_return ( chars, Token :: PGSquareRoot ) ,
437+ Some ( '|' ) => {
438+ chars. next ( ) ; // consume the second '|'
439+ match chars. peek ( ) {
440+ Some ( '/' ) => self . consume_and_return ( chars, Token :: PGCubeRoot ) ,
441+ _ => Ok ( Some ( Token :: StringConcat ) ) ,
442+ }
443+ }
410444 // Bitshift '|' operator
411445 _ => Ok ( Some ( Token :: Pipe ) ) ,
412446 }
@@ -423,21 +457,24 @@ impl<'a> Tokenizer<'a> {
423457 chars. next ( ) ; // consume
424458 match chars. peek ( ) {
425459 Some ( '=' ) => self . consume_and_return ( chars, Token :: Neq ) ,
426- _ => self . tokenizer_error ( "Expected to see '=' after '!' character" ) ,
460+ Some ( '!' ) => self . consume_and_return ( chars, Token :: DoubleExclamationMark ) ,
461+ _ => Ok ( Some ( Token :: ExclamationMark ) ) ,
427462 }
428463 }
429464 '<' => {
430465 chars. next ( ) ; // consume
431466 match chars. peek ( ) {
432467 Some ( '=' ) => self . consume_and_return ( chars, Token :: LtEq ) ,
433468 Some ( '>' ) => self . consume_and_return ( chars, Token :: Neq ) ,
469+ Some ( '<' ) => self . consume_and_return ( chars, Token :: ShiftLeft ) ,
434470 _ => Ok ( Some ( Token :: Lt ) ) ,
435471 }
436472 }
437473 '>' => {
438474 chars. next ( ) ; // consume
439475 match chars. peek ( ) {
440476 Some ( '=' ) => self . consume_and_return ( chars, Token :: GtEq ) ,
477+ Some ( '>' ) => self . consume_and_return ( chars, Token :: ShiftRight ) ,
441478 _ => Ok ( Some ( Token :: Gt ) ) ,
442479 }
443480 }
@@ -464,6 +501,9 @@ impl<'a> Tokenizer<'a> {
464501 comment,
465502 } ) ) )
466503 }
504+ '~' => self . consume_and_return ( chars, Token :: Tilde ) ,
505+ '#' => self . consume_and_return ( chars, Token :: Sharp ) ,
506+ '@' => self . consume_and_return ( chars, Token :: AtSign ) ,
467507 other => self . consume_and_return ( chars, Token :: Char ( other) ) ,
468508 } ,
469509 None => Ok ( None ) ,
0 commit comments