diff --git a/autoload/vimlparser.vim b/autoload/vimlparser.vim index 8e0af660..8ccc0670 100644 --- a/autoload/vimlparser.vim +++ b/autoload/vimlparser.vim @@ -530,11 +530,10 @@ function! s:VimLParser.parse_command_modifiers() let modifiers = [] while s:TRUE let pos = self.reader.tell() + let d = '' if s:isdigit(self.reader.peekn(1)) let d = self.reader.read_digit() call self.reader.skip_white() - else - let d = '' endif let k = self.reader.read_alpha() let c = self.reader.peekn(1) @@ -802,6 +801,7 @@ endfunction function! s:VimLParser.find_command() let c = self.reader.peekn(1) + let name = '' if c ==# 'k' call self.reader.getn(1) @@ -989,6 +989,7 @@ endfunction " TODO: function! s:VimLParser.parse_cmd_common() + let end = self.reader.getpos() if self.ea.cmd.flags =~# '\' && !self.ea.usefilter let end = self.separate_nextcmd() elseif self.ea.cmd.name ==# '!' || self.ea.cmd.name ==# 'global' || self.ea.cmd.name ==# 'vglobal' || self.ea.usefilter @@ -1134,6 +1135,7 @@ function! s:VimLParser.parse_cmd_loadkeymap() endfunction function! s:VimLParser.parse_cmd_lua() + let lines = [] call self.reader.skip_white() if self.reader.peekn(2) ==# '<<' call self.reader.getn(2) @@ -1254,6 +1256,7 @@ function! s:VimLParser.parse_cmd_function() else let named = {} while s:TRUE + let varnode = s:Node(s:NODE_IDENTIFIER) let token = tokenizer.get() if token.type == s:TOKEN_IDENTIFIER if !s:isargname(token.value) || token.value ==# 'firstline' || token.value ==# 'lastline' @@ -1262,7 +1265,6 @@ function! s:VimLParser.parse_cmd_function() throw s:Err(printf('E853: Duplicate argument name: %s', token.value), token.pos) endif let named[token.value] = 1 - let varnode = s:Node(s:NODE_IDENTIFIER) let varnode.pos = token.pos let varnode.value = token.value call add(node.rlist, varnode) @@ -1283,7 +1285,6 @@ function! s:VimLParser.parse_cmd_function() throw s:Err(printf('unexpected token: %s', token.value), token.pos) endif elseif token.type == s:TOKEN_DOTDOTDOT - let varnode = s:Node(s:NODE_IDENTIFIER) let varnode.pos = token.pos let varnode.value = token.value call add(node.rlist, varnode) @@ -2672,6 +2673,7 @@ function! s:ExprTokenizer.get2() " @ is treated as @" return self.token(s:TOKEN_REG, r.getn(2), pos) elseif c ==# '&' + let s = '' if (r.p(1) ==# 'g' || r.p(1) ==# 'l') && r.p(2) ==# ':' let s = r.getn(3) . r.read_word() else @@ -3158,6 +3160,7 @@ function! s:ExprParser.parse_expr8() if token.type != s:TOKEN_SQCLOSE throw s:Err(printf('unexpected token: %s', token.value), token.pos) endif + let left = node else let right = self.parse_expr1() if self.tokenizer.peek().type == s:TOKEN_COLON @@ -3174,6 +3177,7 @@ function! s:ExprParser.parse_expr8() if token.type != s:TOKEN_SQCLOSE throw s:Err(printf('unexpected token: %s', token.value), token.pos) endif + let left = node else let node = s:Node(s:NODE_SUBSCRIPT) let node.pos = npos @@ -3183,9 +3187,9 @@ function! s:ExprParser.parse_expr8() if token.type != s:TOKEN_SQCLOSE throw s:Err(printf('unexpected token: %s', token.value), token.pos) endif + let left = node endif endif - let left = node unlet node elseif token.type == s:TOKEN_POPEN let node = s:Node(s:NODE_CALL) @@ -3250,6 +3254,7 @@ endfunction function! s:ExprParser.parse_expr9() let pos = self.reader.tell() let token = self.tokenizer.get() + let node = s:Node(-1) if token.type == s:TOKEN_NUMBER let node = s:Node(s:NODE_NUMBER) let node.pos = token.pos @@ -3476,12 +3481,13 @@ function! s:ExprParser.parse_identifier() let node = s:Node(s:NODE_IDENTIFIER) let node.pos = npos let node.value = curly_parts[0].value + return node else let node = s:Node(s:NODE_CURLYNAME) let node.pos = npos let node.value = curly_parts - endif return node + endif endfunction function! s:ExprParser.parse_curly_parts() @@ -3544,6 +3550,7 @@ function! s:LvalueParser.parse_lv8() let token = self.tokenizer.get() if !s:iswhite(c) && token.type == s:TOKEN_SQOPEN let npos = token.pos + let node = s:Node(-1) if self.tokenizer.peek().type == s:TOKEN_COLON call self.tokenizer.get() let node = s:Node(s:NODE_SLICE) @@ -3611,6 +3618,7 @@ endfunction function! s:LvalueParser.parse_lv9() let pos = self.reader.tell() let token = self.tokenizer.get() + let node = s:Node(-1) if token.type == s:TOKEN_COPEN call self.reader.seek_set(pos) let node = self.parse_identifier() @@ -4134,6 +4142,7 @@ function! s:Compiler.compile_excall(node) endfunction function! s:Compiler.compile_let(node) + let left = '' if a:node.left isnot s:NIL let left = self.compile(a:node.left) else @@ -4201,6 +4210,7 @@ function! s:Compiler.compile_while(node) endfunction function! s:Compiler.compile_for(node) + let left = '' if a:node.left isnot s:NIL let left = self.compile(a:node.left) else diff --git a/js/vimlparser.js b/js/vimlparser.js index 3d80b3c2..98781824 100644 --- a/js/vimlparser.js +++ b/js/vimlparser.js @@ -709,13 +709,11 @@ VimLParser.prototype.parse_command_modifiers = function() { var modifiers = []; while (TRUE) { var pos = this.reader.tell(); + var d = ""; if (isdigit(this.reader.peekn(1))) { var d = this.reader.read_digit(); this.reader.skip_white(); } - else { - var d = ""; - } var k = this.reader.read_alpha(); var c = this.reader.peekn(1); this.reader.skip_white(); @@ -1024,6 +1022,7 @@ VimLParser.prototype.parse_command = function() { VimLParser.prototype.find_command = function() { var c = this.reader.peekn(1); + var name = ""; if (c == "k") { this.reader.getn(1); var name = "k"; @@ -1227,6 +1226,7 @@ VimLParser.prototype.parse_cmd_modifier_range = function() { // TODO: VimLParser.prototype.parse_cmd_common = function() { + var end = this.reader.getpos(); if (viml_eqregh(this.ea.cmd.flags, "\\") && !this.ea.usefilter) { var end = this.separate_nextcmd(); } @@ -1380,6 +1380,7 @@ VimLParser.prototype.parse_cmd_loadkeymap = function() { } VimLParser.prototype.parse_cmd_lua = function() { + var lines = []; this.reader.skip_white(); if (this.reader.peekn(2) == "<<") { this.reader.getn(2); @@ -1496,6 +1497,7 @@ VimLParser.prototype.parse_cmd_function = function() { else { var named = {}; while (TRUE) { + var varnode = Node(NODE_IDENTIFIER); var token = tokenizer.get(); if (token.type == TOKEN_IDENTIFIER) { if (!isargname(token.value) || token.value == "firstline" || token.value == "lastline") { @@ -1505,7 +1507,6 @@ VimLParser.prototype.parse_cmd_function = function() { throw Err(viml_printf("E853: Duplicate argument name: %s", token.value), token.pos); } named[token.value] = 1; - var varnode = Node(NODE_IDENTIFIER); varnode.pos = token.pos; varnode.value = token.value; viml_add(node.rlist, varnode); @@ -1529,7 +1530,6 @@ VimLParser.prototype.parse_cmd_function = function() { } } else if (token.type == TOKEN_DOTDOTDOT) { - var varnode = Node(NODE_IDENTIFIER); varnode.pos = token.pos; varnode.value = token.value; viml_add(node.rlist, varnode); @@ -2433,6 +2433,7 @@ ExprTokenizer.prototype.get2 = function() { return this.token(TOKEN_REG, r.getn(2), pos); } else if (c == "&") { + var s = ""; if ((r.p(1) == "g" || r.p(1) == "l") && r.p(2) == ":") { var s = r.getn(3) + r.read_word(); } @@ -2966,6 +2967,7 @@ ExprParser.prototype.parse_expr8 = function() { if (token.type != TOKEN_SQCLOSE) { throw Err(viml_printf("unexpected token: %s", token.value), token.pos); } + var left = node; } else { var right = this.parse_expr1(); @@ -2983,6 +2985,7 @@ ExprParser.prototype.parse_expr8 = function() { if (token.type != TOKEN_SQCLOSE) { throw Err(viml_printf("unexpected token: %s", token.value), token.pos); } + var left = node; } else { var node = Node(NODE_SUBSCRIPT); @@ -2993,9 +2996,9 @@ ExprParser.prototype.parse_expr8 = function() { if (token.type != TOKEN_SQCLOSE) { throw Err(viml_printf("unexpected token: %s", token.value), token.pos); } + var left = node; } } - var left = node; delete node; } else if (token.type == TOKEN_POPEN) { @@ -3066,6 +3069,7 @@ ExprParser.prototype.parse_expr8 = function() { ExprParser.prototype.parse_expr9 = function() { var pos = this.reader.tell(); var token = this.tokenizer.get(); + var node = Node(-1); if (token.type == TOKEN_NUMBER) { var node = Node(NODE_NUMBER); node.pos = token.pos; @@ -3317,13 +3321,14 @@ ExprParser.prototype.parse_identifier = function() { var node = Node(NODE_IDENTIFIER); node.pos = npos; node.value = curly_parts[0].value; + return node; } else { var node = Node(NODE_CURLYNAME); node.pos = npos; node.value = curly_parts; + return node; } - return node; } ExprParser.prototype.parse_curly_parts = function() { @@ -3391,6 +3396,7 @@ LvalueParser.prototype.parse_lv8 = function() { var token = this.tokenizer.get(); if (!iswhite(c) && token.type == TOKEN_SQOPEN) { var npos = token.pos; + var node = Node(-1); if (this.tokenizer.peek().type == TOKEN_COLON) { this.tokenizer.get(); var node = Node(NODE_SLICE); @@ -3462,6 +3468,7 @@ LvalueParser.prototype.parse_lv8 = function() { LvalueParser.prototype.parse_lv9 = function() { var pos = this.reader.tell(); var token = this.tokenizer.get(); + var node = Node(-1); if (token.type == TOKEN_COPEN) { this.reader.seek_set(pos); var node = this.parse_identifier(); @@ -4075,6 +4082,7 @@ Compiler.prototype.compile_excall = function(node) { } Compiler.prototype.compile_let = function(node) { + var left = ""; if (node.left !== NIL) { var left = this.compile(node.left); } @@ -4147,6 +4155,7 @@ Compiler.prototype.compile_while = function(node) { } Compiler.prototype.compile_for = function(node) { + var left = ""; if (node.left !== NIL) { var left = this.compile(node.left); } diff --git a/py/vimlparser.py b/py/vimlparser.py index b9c29001..191b37f4 100644 --- a/py/vimlparser.py +++ b/py/vimlparser.py @@ -618,11 +618,10 @@ def parse_command_modifiers(self): modifiers = [] while TRUE: pos = self.reader.tell() + d = "" if isdigit(self.reader.peekn(1)): d = self.reader.read_digit() self.reader.skip_white() - else: - d = "" k = self.reader.read_alpha() c = self.reader.peekn(1) self.reader.skip_white() @@ -846,6 +845,7 @@ def parse_command(self): def find_command(self): c = self.reader.peekn(1) + name = "" if c == "k": self.reader.getn(1) name = "k" @@ -994,6 +994,7 @@ def parse_cmd_modifier_range(self): # TODO: def parse_cmd_common(self): + end = self.reader.getpos() if viml_eqregh(self.ea.cmd.flags, "\\") and not self.ea.usefilter: end = self.separate_nextcmd() elif self.ea.cmd.name == "!" or self.ea.cmd.name == "global" or self.ea.cmd.name == "vglobal" or self.ea.usefilter: @@ -1110,6 +1111,7 @@ def parse_cmd_loadkeymap(self): self.add_node(node) def parse_cmd_lua(self): + lines = [] self.reader.skip_white() if self.reader.peekn(2) == "<<": self.reader.getn(2) @@ -1204,6 +1206,7 @@ def parse_cmd_function(self): else: named = AttributeDict({}) while TRUE: + varnode = Node(NODE_IDENTIFIER) token = tokenizer.get() if token.type == TOKEN_IDENTIFIER: if not isargname(token.value) or token.value == "firstline" or token.value == "lastline": @@ -1211,7 +1214,6 @@ def parse_cmd_function(self): elif viml_has_key(named, token.value): raise VimLParserException(Err(viml_printf("E853: Duplicate argument name: %s", token.value), token.pos)) named[token.value] = 1 - varnode = Node(NODE_IDENTIFIER) varnode.pos = token.pos varnode.value = token.value viml_add(node.rlist, varnode) @@ -1229,7 +1231,6 @@ def parse_cmd_function(self): else: raise VimLParserException(Err(viml_printf("unexpected token: %s", token.value), token.pos)) elif token.type == TOKEN_DOTDOTDOT: - varnode = Node(NODE_IDENTIFIER) varnode.pos = token.pos varnode.value = token.value viml_add(node.rlist, varnode) @@ -1942,6 +1943,7 @@ def get2(self): # @ is treated as @" return self.token(TOKEN_REG, r.getn(2), pos) elif c == "&": + s = "" if (r.p(1) == "g" or r.p(1) == "l") and r.p(2) == ":": s = r.getn(3) + r.read_word() else: @@ -2385,6 +2387,7 @@ def parse_expr8(self): token = self.tokenizer.get() if token.type != TOKEN_SQCLOSE: raise VimLParserException(Err(viml_printf("unexpected token: %s", token.value), token.pos)) + left = node else: right = self.parse_expr1() if self.tokenizer.peek().type == TOKEN_COLON: @@ -2399,6 +2402,7 @@ def parse_expr8(self): token = self.tokenizer.get() if token.type != TOKEN_SQCLOSE: raise VimLParserException(Err(viml_printf("unexpected token: %s", token.value), token.pos)) + left = node else: node = Node(NODE_SUBSCRIPT) node.pos = npos @@ -2407,7 +2411,7 @@ def parse_expr8(self): token = self.tokenizer.get() if token.type != TOKEN_SQCLOSE: raise VimLParserException(Err(viml_printf("unexpected token: %s", token.value), token.pos)) - left = node + left = node del node elif token.type == TOKEN_POPEN: node = Node(NODE_CALL) @@ -2463,6 +2467,7 @@ def parse_expr8(self): def parse_expr9(self): pos = self.reader.tell() token = self.tokenizer.get() + node = Node(-1) if token.type == TOKEN_NUMBER: node = Node(NODE_NUMBER) node.pos = token.pos @@ -2660,11 +2665,12 @@ def parse_identifier(self): node = Node(NODE_IDENTIFIER) node.pos = npos node.value = curly_parts[0].value + return node else: node = Node(NODE_CURLYNAME) node.pos = npos node.value = curly_parts - return node + return node def parse_curly_parts(self): curly_parts = [] @@ -2722,6 +2728,7 @@ def parse_lv8(self): token = self.tokenizer.get() if not iswhite(c) and token.type == TOKEN_SQOPEN: npos = token.pos + node = Node(-1) if self.tokenizer.peek().type == TOKEN_COLON: self.tokenizer.get() node = Node(NODE_SLICE) @@ -2778,6 +2785,7 @@ def parse_lv8(self): def parse_lv9(self): pos = self.reader.tell() token = self.tokenizer.get() + node = Node(-1) if token.type == TOKEN_COPEN: self.reader.seek_set(pos) node = self.parse_identifier() @@ -3210,6 +3218,7 @@ def compile_excall(self, node): self.out("(call %s)", self.compile(node.left)) def compile_let(self, node): + left = "" if node.left is not NIL: left = self.compile(node.left) else: @@ -3265,6 +3274,7 @@ def compile_while(self, node): self.decindent() def compile_for(self, node): + left = "" if node.left is not NIL: left = self.compile(node.left) else: