@@ -121,6 +121,8 @@ let s:NODE_REMAINDER = 72
121121let s: NODE_NOT = 73
122122let s: NODE_MINUS = 74
123123let s: NODE_PLUS = 75
124+ let s: NODE_LSHIFT = 99
125+ let s: NODE_RSHIFT = 100
124126let s: NODE_SUBSCRIPT = 76
125127let s: NODE_SLICE = 77
126128let s: NODE_CALL = 78
@@ -213,6 +215,8 @@ let s:TOKEN_BLOB = 66
213215let s: TOKEN_LITCOPEN = 67
214216let s: TOKEN_DOTDOT = 68
215217let s: TOKEN_HEREDOC = 69
218+ let s: TOKEN_LSHIFT = 70
219+ let s: TOKEN_RSHIFT = 71
216220
217221let s: MAX_FUNC_ARGS = 20
218222
@@ -3525,6 +3529,9 @@ function! s:ExprTokenizer.get2() abort
35253529 elseif r .p (1 ) == # ' #'
35263530 call r .seek_cur (2 )
35273531 return self .token (s: TOKEN_GTCS , ' >#' , pos)
3532+ elseif r .p (1 ) == # ' >'
3533+ call r .seek_cur (2 )
3534+ return self .token (s: TOKEN_RSHIFT , ' >>' , pos)
35283535 else
35293536 call r .seek_cur (1 )
35303537 return self .token (s: TOKEN_GT , ' >' , pos)
@@ -3536,6 +3543,9 @@ function! s:ExprTokenizer.get2() abort
35363543 elseif r .p (1 ) == # ' #'
35373544 call r .seek_cur (2 )
35383545 return self .token (s: TOKEN_LTCS , ' <#' , pos)
3546+ elseif r .p (1 ) == # ' <'
3547+ call r .seek_cur (2 )
3548+ return self .token (s: TOKEN_LSHIFT , ' <<' , pos)
35393549 else
35403550 call r .seek_cur (1 )
35413551 return self .token (s: TOKEN_LT , ' <' , pos)
@@ -4021,32 +4031,59 @@ endfunction
40214031" expr6 . expr6 ..
40224032" expr6 .. expr6 ..
40234033function ! s: ExprParser .parse_expr5 () abort
4024- let left = self .parse_expr6 ()
4034+ let left = self .parse_expr5_5 ()
40254035 while s: TRUE
40264036 let pos = self .reader.tell ()
40274037 let token = self .tokenizer.get ()
40284038 if token.type == # s: TOKEN_PLUS
40294039 let node = s: Node (s: NODE_ADD )
40304040 let node.pos = token.pos
40314041 let node.left = left
4032- let node.right = self .parse_expr6 ()
4042+ let node.right = self .parse_expr5_5 ()
40334043 let left = node
40344044 elseif token.type == # s: TOKEN_MINUS
40354045 let node = s: Node (s: NODE_SUBTRACT )
40364046 let node.pos = token.pos
40374047 let node.left = left
4038- let node.right = self .parse_expr6 ()
4048+ let node.right = self .parse_expr5_5 ()
40394049 let left = node
40404050 elseif token.type == # s: TOKEN_DOTDOT " TODO check scriptversion?
40414051 let node = s: Node (s: NODE_CONCAT )
40424052 let node.pos = token.pos
40434053 let node.left = left
4044- let node.right = self .parse_expr6 ()
4054+ let node.right = self .parse_expr5_5 ()
40454055 let left = node
40464056 elseif token.type == # s: TOKEN_DOT " TODO check scriptversion?
40474057 let node = s: Node (s: NODE_CONCAT )
40484058 let node.pos = token.pos
40494059 let node.left = left
4060+ let node.right = self .parse_expr5_5 ()
4061+ let left = node
4062+ else
4063+ call self .reader.seek_set (pos)
4064+ break
4065+ endif
4066+ endwhile
4067+ return left
4068+ endfunction
4069+
4070+ " expr5_5: expr6 << expr6 ..
4071+ " expr6 >> expr6 ..
4072+ function ! s: ExprParser .parse_expr5_5 () abort
4073+ let left = self .parse_expr6 ()
4074+ while s: TRUE
4075+ let pos = self .reader.tell ()
4076+ let token = self .tokenizer.get ()
4077+ if token.type == # s: TOKEN_LSHIFT
4078+ let node = s: Node (s: NODE_LSHIFT )
4079+ let node.pos = token.pos
4080+ let node.left = left
4081+ let node.right = self .parse_expr6 ()
4082+ let left = node
4083+ elseif token.type == # s: TOKEN_RSHIFT
4084+ let node = s: Node (s: NODE_RSHIFT )
4085+ let node.pos = token.pos
4086+ let node.left = left
40504087 let node.right = self .parse_expr6 ()
40514088 let left = node
40524089 else
@@ -5151,6 +5188,10 @@ function! s:Compiler.compile(node) abort
51515188 return self .compile_divide (a: node )
51525189 elseif a: node .type == # s: NODE_REMAINDER
51535190 return self .compile_remainder (a: node )
5191+ elseif a: node .type == # s: NODE_LSHIFT
5192+ return self .compile_lshift (a: node )
5193+ elseif a: node .type == # s: NODE_RSHIFT
5194+ return self .compile_rshift (a: node )
51545195 elseif a: node .type == # s: NODE_NOT
51555196 return self .compile_not (a: node )
51565197 elseif a: node .type == # s: NODE_PLUS
@@ -5600,6 +5641,14 @@ function! s:Compiler.compile_remainder(node) abort
56005641 return printf (' (%% %s %s)' , self .compile (a: node .left ), self .compile (a: node .right ))
56015642endfunction
56025643
5644+ function ! s: Compiler .compile_lshift (node) abort
5645+ return printf (' (<< %s %s)' , self .compile (a: node .left ), self .compile (a: node .right ))
5646+ endfunction
5647+
5648+ function ! s: Compiler .compile_rshift (node) abort
5649+ return printf (' (>> %s %s)' , self .compile (a: node .left ), self .compile (a: node .right ))
5650+ endfunction
5651+
56035652function ! s: Compiler .compile_not (node) abort
56045653 return printf (' (! %s)' , self .compile (a: node .left ))
56055654endfunction
0 commit comments