From 24cdec0cb3660dab2ad556d10456aeaf0064a866 Mon Sep 17 00:00:00 2001 From: Dmitriy Pleshevskiy Date: Sat, 10 Dec 2022 05:23:27 +0300 Subject: [PATCH] improve strings and scanner for text block --- grammar.js | 42 ++++++++++++++-- queries/highlights.scm | 10 ++-- scripts/pre-push | 13 +++++ src/grammar.json | 97 ++++++++++++++++++++++++++++++++----- src/node-types.json | 24 ++++++++- src/parser.c | Bin 138611 -> 142277 bytes src/scanner.c | 18 +++---- test/corpus/attributes.txt | 6 +-- test/corpus/container.txt | 4 +- test/corpus/shape.txt | 6 ++- test/highlight/shape.d2 | 15 ++++-- tree-sitter-d2.wasm | Bin 41927 -> 30203 bytes 12 files changed, 194 insertions(+), 41 deletions(-) create mode 100644 scripts/pre-push diff --git a/grammar.js b/grammar.js index a93f834..8588958 100644 --- a/grammar.js +++ b/grammar.js @@ -137,7 +137,7 @@ module.exports = grammar({ _text_block_definition: ($) => seq( optional($.language), - $._eol, + /\s/, optional(alias($._text_block_raw, $.raw_text)) ), @@ -285,8 +285,44 @@ module.exports = grammar({ string: ($) => choice( - seq("'", repeat(token.immediate(/[^'\n]+/)), "'"), - seq('"', repeat(token.immediate(/[^"\n]+/)), '"') + seq( + "'", + repeat( + choice( + alias($._unescaped_single_string_fragment, $.string_fragment), + $.escape_sequence + ) + ), + "'" + ), + seq( + '"', + repeat( + choice( + alias($._unescaped_double_string_fragment, $.string_fragment), + $.escape_sequence + ) + ), + '"' + ) + ), + + _unescaped_single_string_fragment: ($) => token.immediate(/[^'\\\n]+/), + + _unescaped_double_string_fragment: ($) => token.immediate(/[^"\\\n]+/), + + escape_sequence: ($) => + token.immediate( + seq( + "\\", + choice( + /[^xu0-7]/, + /[0-7]{1,3}/, + /x[0-9a-fA-F]{2}/, + /u[0-9a-fA-F]{4}/, + /u{[0-9a-fA-F]+}/ + ) + ) ), boolean: ($) => choice("true", "false"), diff --git a/queries/highlights.scm b/queries/highlights.scm index b84bd1c..504fa9c 100644 --- a/queries/highlights.scm +++ b/queries/highlights.scm @@ -8,10 +8,11 @@ ; Literals ;------------------------------------------------------------------------------- -(language) @type.qualifier -(container_key (string) @string) -(shape_key (string) @string) -(label) @string.special +(string) @string +(container_key (string (string_fragment) @string)) +(shape_key (string (string_fragment) @string)) +(escape_sequence) @string.escape +(label) @text.title (attr_value) @string (integer) @number (float) @float @@ -20,6 +21,7 @@ ; Comments ;------------------------------------------------------------------------------- +(language) @comment (line_comment) @comment.line ; Punctiation diff --git a/scripts/pre-push b/scripts/pre-push new file mode 100644 index 0000000..368012b --- /dev/null +++ b/scripts/pre-push @@ -0,0 +1,13 @@ +#! /usr/bin/env bash + +# Can be used as a pre-push hook +# Just symlink this file to .git/hooks/pre-push + +set -xe + +if [ ! -z $(git diff --cached --name-only | grep -e "^grammar.js$") ] +then + make build + make build-wasm +fi + diff --git a/src/grammar.json b/src/grammar.json index 51a09fd..cf506aa 100644 --- a/src/grammar.json +++ b/src/grammar.json @@ -592,8 +592,8 @@ ] }, { - "type": "SYMBOL", - "name": "_eol" + "type": "PATTERN", + "value": "\\s" }, { "type": "CHOICE", @@ -1244,11 +1244,22 @@ { "type": "REPEAT", "content": { - "type": "IMMEDIATE_TOKEN", - "content": { - "type": "PATTERN", - "value": "[^'\\n]+" - } + "type": "CHOICE", + "members": [ + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_unescaped_single_string_fragment" + }, + "named": true, + "value": "string_fragment" + }, + { + "type": "SYMBOL", + "name": "escape_sequence" + } + ] } }, { @@ -1267,11 +1278,22 @@ { "type": "REPEAT", "content": { - "type": "IMMEDIATE_TOKEN", - "content": { - "type": "PATTERN", - "value": "[^\"\\n]+" - } + "type": "CHOICE", + "members": [ + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_unescaped_double_string_fragment" + }, + "named": true, + "value": "string_fragment" + }, + { + "type": "SYMBOL", + "name": "escape_sequence" + } + ] } }, { @@ -1282,6 +1304,57 @@ } ] }, + "_unescaped_single_string_fragment": { + "type": "IMMEDIATE_TOKEN", + "content": { + "type": "PATTERN", + "value": "[^'\\\\\\n]+" + } + }, + "_unescaped_double_string_fragment": { + "type": "IMMEDIATE_TOKEN", + "content": { + "type": "PATTERN", + "value": "[^\"\\\\\\n]+" + } + }, + "escape_sequence": { + "type": "IMMEDIATE_TOKEN", + "content": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "\\" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "PATTERN", + "value": "[^xu0-7]" + }, + { + "type": "PATTERN", + "value": "[0-7]{1,3}" + }, + { + "type": "PATTERN", + "value": "x[0-9a-fA-F]{2}" + }, + { + "type": "PATTERN", + "value": "u[0-9a-fA-F]{4}" + }, + { + "type": "PATTERN", + "value": "u{[0-9a-fA-F]+}" + } + ] + } + ] + } + }, "boolean": { "type": "CHOICE", "members": [ diff --git a/src/node-types.json b/src/node-types.json index 61493c8..cfd17d8 100644 --- a/src/node-types.json +++ b/src/node-types.json @@ -289,7 +289,21 @@ { "type": "string", "named": true, - "fields": {} + "fields": {}, + "children": { + "multiple": true, + "required": false, + "types": [ + { + "type": "escape_sequence", + "named": true + }, + { + "type": "string_fragment", + "named": true + } + ] + } }, { "type": "text_block", @@ -366,6 +380,10 @@ "type": "dot", "named": true }, + { + "type": "escape_sequence", + "named": true + }, { "type": "false", "named": false @@ -434,6 +452,10 @@ "type": "source-arrowhead", "named": false }, + { + "type": "string_fragment", + "named": true + }, { "type": "stroke", "named": false diff --git a/src/parser.c b/src/parser.c index cde28cf5e584d5ec9a77b145ce9d7321436c9bec..4115a50f0e2e4c614ab4ce4258722de5befad740 100644 GIT binary patch delta 14627 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 QEt?-DMSJd#m6C%05BCh*`2YX_ delta 12914 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 diff --git a/src/scanner.c b/src/scanner.c index b9ab9b2..b3962b2 100644 --- a/src/scanner.c +++ b/src/scanner.c @@ -31,20 +31,18 @@ static bool scan_raw_text(TSLexer *lexer) { return has_content; } - if (lexer->lookahead == '\n') { + while (iswspace(lexer->lookahead)) { advance(lexer); lexer->mark_end(lexer); + } - while (iswspace(lexer->lookahead)) { - advance(lexer); - lexer->mark_end(lexer); - } + if (lexer->lookahead == '`') { + advance(lexer); + } - if (lexer->lookahead == '`') { - advance(lexer); - } - - if (lexer->lookahead == '|') { + if (lexer->lookahead == '|') { + advance(lexer); + if (lexer->lookahead == '\n') { return has_content; } } diff --git a/test/corpus/attributes.txt b/test/corpus/attributes.txt index e6f46f5..a8e62e7 100644 --- a/test/corpus/attributes.txt +++ b/test/corpus/attributes.txt @@ -26,7 +26,7 @@ near: abc (attribute (attr_key) (attr_value)) (attribute (attr_key (reserved)) (attr_value)) - (attribute (attr_key (reserved)) (attr_value (string))) + (attribute (attr_key (reserved)) (attr_value (string (string_fragment)))) (attribute (attr_key (reserved)) (attr_value)) (attribute (attr_key (reserved)) (attr_value)) (attribute (attr_key (reserved)) (attr_value (float))) @@ -134,7 +134,7 @@ foo: { (container_key) (block (attribute (attr_key) (attr_value)) - (attribute (attr_key) (attr_value (string))) + (attribute (attr_key) (attr_value (string (string_fragment)))) (attribute (attr_key) (attr_value)) (attribute (attr_key) (attr_value)) (attribute (attr_key) (attr_value (integer))) @@ -381,7 +381,7 @@ foo -> bar: { (attr_key) (block (attribute (attr_key) (attr_value)) - (attribute (attr_key) (attr_value (string))) + (attribute (attr_key) (attr_value (string (string_fragment)))) (attribute (attr_key) (attr_value)) (attribute (attr_key) (attr_value)) (attribute (attr_key) (attr_value (integer))) diff --git a/test/corpus/container.txt b/test/corpus/container.txt index 704d2b5..f0696e4 100644 --- a/test/corpus/container.txt +++ b/test/corpus/container.txt @@ -29,8 +29,8 @@ Use quoted string as keys (source_file (container - (container_key (string)) (dot) - (shape (shape_key (string))) + (container_key (string (string_fragment))) (dot) + (shape (shape_key (string (string_fragment)))) ) ) diff --git a/test/corpus/shape.txt b/test/corpus/shape.txt index f1f6bb1..29c2d87 100644 --- a/test/corpus/shape.txt +++ b/test/corpus/shape.txt @@ -54,7 +54,7 @@ Use quoted string as a shape key -------------------------------------------------------------------------------- (source_file - (shape (shape_key (string))) + (shape (shape_key (string (string_fragment)))) ) ================================================================================ @@ -108,7 +108,9 @@ Use quoted string as shape key and label -------------------------------------------------------------------------------- (source_file - (shape (shape_key (string)) (label (string))) + (shape + (shape_key (string (string_fragment))) + (label (string (string_fragment)))) ) ================================================================================ diff --git a/test/highlight/shape.d2 b/test/highlight/shape.d2 index c0b279f..2e44801 100644 --- a/test/highlight/shape.d2 +++ b/test/highlight/shape.d2 @@ -2,21 +2,28 @@ foo.'baz'.biz # <- constant # ^ punctuation.delimiter # ^ string +# ^ string # ^ punctuation.delimiter # ^ variable -'biz': 'Baz' +'b\nz' +# ^ string.escape +# ^ string.escape + +'biz': 'Baz\nBiz' # <- string -# ^ string.special +# ^ string +# ^ string +# ^ string.escape foo: Foo Bar # <- variable # ^ punctuation.delimiter -# ^ string.special +# ^ text.title foo: Foo Bar { # <- constant - # ^ string.special + # ^ text.title # ^ punctuation.bracket bar.baz diff --git a/tree-sitter-d2.wasm b/tree-sitter-d2.wasm index cd7e07b07b0edc91e0a8fdde919a84a7d3473c58..3160194b1adaf4ec4376cfe04bf4949ea48b241a 100755 GIT binary patch literal 30203 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 YSA@9;!x8!-v__bK@B%^vVG(%!AN`iw0ssI2 literal 41927 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

qg}>hjCWSvT)=qM};Ohc4hfEc4sYc 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