From 3767a81252bb215f05e33974602742dc244f18db Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Mon, 23 Dec 2019 11:49:51 +0100 Subject: [PATCH 1/2] parse_dict_literal_key: use getpos for pos Fixes https://github.com/vim-jp/vim-vimlparser/issues/155. --- autoload/vimlparser.vim | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/autoload/vimlparser.vim b/autoload/vimlparser.vim index 41242116..f6414458 100644 --- a/autoload/vimlparser.vim +++ b/autoload/vimlparser.vim @@ -3481,15 +3481,16 @@ function! s:ExprTokenizer.get_dstring() abort return s endfunction -function! s:ExprTokenizer.get_dict_literal_key() abort +function! s:ExprTokenizer.parse_dict_literal_key() abort call self.reader.skip_white() - let r = self.reader - let c = r.peek() + let c = self.reader.peek() if !s:isalnum(c) && c !=# '_' && c !=# '-' throw s:Err(printf('unexpected character: %s', c), self.reader.getpos()) endif + let node = s:Node(s:NODE_STRING) let s = c call self.reader.seek_cur(1) + let node.pos = self.reader.getpos() while s:TRUE let c = self.reader.p(0) if c ==# '' || c ==# '' @@ -3501,7 +3502,8 @@ function! s:ExprTokenizer.get_dict_literal_key() abort call self.reader.seek_cur(1) let s .= c endwhile - return s + let node.value = "'" . s . "'" + return node endfunction let s:ExprParser = {} @@ -4145,7 +4147,7 @@ function! s:ExprParser.parse_expr9() abort return node endif while 1 - let key = is_litdict ? self.parse_dict_literal_key() : self.parse_expr1() + let key = is_litdict ? self.tokenizer.parse_dict_literal_key() : self.parse_expr1() let token = self.tokenizer.get() if token.type ==# s:TOKEN_CCLOSE if !empty(node.value) @@ -4210,13 +4212,6 @@ function! s:ExprParser.parse_expr9() abort return node endfunction -function! s:ExprParser.parse_dict_literal_key() abort - let node = s:Node(s:NODE_STRING) - let node.pos = self.reader.tell() - let node.value = "'" . self.tokenizer.get_dict_literal_key() . "'" - return node -endfunction - " SUBSCRIPT or CONCAT " dict "." [0-9A-Za-z_]+ => (subscript dict key) " str "." expr6 => (concat str expr6) From 3a40dd9af0e898e7499e13d2c0a6445ac5ead8df Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Mon, 23 Dec 2019 11:52:43 +0100 Subject: [PATCH 2/2] compile --- js/vimlparser.js | 19 +++++++------------ py/vimlparser.py | 18 +++++++----------- 2 files changed, 14 insertions(+), 23 deletions(-) diff --git a/js/vimlparser.js b/js/vimlparser.js index 2f0e29d8..deefc214 100644 --- a/js/vimlparser.js +++ b/js/vimlparser.js @@ -2807,15 +2807,16 @@ ExprTokenizer.prototype.get_dstring = function() { return s; } -ExprTokenizer.prototype.get_dict_literal_key = function() { +ExprTokenizer.prototype.parse_dict_literal_key = function() { this.reader.skip_white(); - var r = this.reader; - var c = r.peek(); + var c = this.reader.peek(); if (!isalnum(c) && c != "_" && c != "-") { throw Err(viml_printf("unexpected character: %s", c), this.reader.getpos()); } + var node = Node(NODE_STRING); var s = c; this.reader.seek_cur(1); + node.pos = this.reader.getpos(); while (TRUE) { var c = this.reader.p(0); if (c == "" || c == "") { @@ -2827,7 +2828,8 @@ ExprTokenizer.prototype.get_dict_literal_key = function() { this.reader.seek_cur(1); s += c; } - return s; + node.value = "'" + s + "'"; + return node; } function ExprParser() { this.__init__.apply(this, arguments); } @@ -3533,7 +3535,7 @@ ExprParser.prototype.parse_expr9 = function() { return node; } while (1) { - var key = is_litdict ? this.parse_dict_literal_key() : this.parse_expr1(); + var key = is_litdict ? this.tokenizer.parse_dict_literal_key() : this.parse_expr1(); var token = this.tokenizer.get(); if (token.type == TOKEN_CCLOSE) { if (!viml_empty(node.value)) { @@ -3609,13 +3611,6 @@ ExprParser.prototype.parse_expr9 = function() { return node; } -ExprParser.prototype.parse_dict_literal_key = function() { - var node = Node(NODE_STRING); - node.pos = this.reader.tell(); - node.value = "'" + this.tokenizer.get_dict_literal_key() + "'"; - return node; -} - // SUBSCRIPT or CONCAT // dict "." [0-9A-Za-z_]+ => (subscript dict key) // str "." expr6 => (concat str expr6) diff --git a/py/vimlparser.py b/py/vimlparser.py index 56d665ee..fa63c8b4 100644 --- a/py/vimlparser.py +++ b/py/vimlparser.py @@ -2270,14 +2270,15 @@ def get_dstring(self): s += c return s - def get_dict_literal_key(self): + def parse_dict_literal_key(self): self.reader.skip_white() - r = self.reader - c = r.peek() + c = self.reader.peek() if not isalnum(c) and c != "_" and c != "-": raise VimLParserException(Err(viml_printf("unexpected character: %s", c), self.reader.getpos())) + node = Node(NODE_STRING) s = c self.reader.seek_cur(1) + node.pos = self.reader.getpos() while TRUE: c = self.reader.p(0) if c == "" or c == "": @@ -2286,7 +2287,8 @@ def get_dict_literal_key(self): break self.reader.seek_cur(1) s += c - return s + node.value = "'" + s + "'" + return node class ExprParser: @@ -2874,7 +2876,7 @@ def parse_expr9(self): self.tokenizer.get() return node while 1: - key = self.parse_dict_literal_key() if is_litdict else self.parse_expr1() + key = self.tokenizer.parse_dict_literal_key() if is_litdict else self.parse_expr1() token = self.tokenizer.get() if token.type == TOKEN_CCLOSE: if not viml_empty(node.value): @@ -2930,12 +2932,6 @@ def parse_expr9(self): raise VimLParserException(Err(viml_printf("unexpected token: %s", token.value), token.pos)) return node - def parse_dict_literal_key(self): - node = Node(NODE_STRING) - node.pos = self.reader.tell() - node.value = "'" + self.tokenizer.get_dict_literal_key() + "'" - return node - # SUBSCRIPT or CONCAT # dict "." [0-9A-Za-z_]+ => (subscript dict key) # str "." expr6 => (concat str expr6)