add invalid attributes
This commit is contained in:
parent
fac4bde489
commit
867ed6662b
10 changed files with 307 additions and 66 deletions
11
Makefile
11
Makefile
|
@ -6,6 +6,12 @@ test: build
|
|||
highlight: build
|
||||
tree-sitter highlight -t test/highlight/*.d2
|
||||
|
||||
playground: build-wasm
|
||||
tree-sitter playground --quiet
|
||||
|
||||
build-wasm: build
|
||||
tree-sitter build-wasm
|
||||
|
||||
build:
|
||||
tree-sitter generate
|
||||
|
||||
|
@ -18,8 +24,3 @@ init:
|
|||
cat <<< $$(jq ".\"parser-directories\" |= . + [\"$$(dirname $(PWD))\"]" $(TS_CONF)) > $(TS_CONF); \
|
||||
fi
|
||||
|
||||
playground: build-wasm
|
||||
tree-sitter playground
|
||||
|
||||
build-wasm:
|
||||
tree-sitter build-wasm
|
||||
|
|
20
grammar.js
20
grammar.js
|
@ -1,4 +1,4 @@
|
|||
const spaces = repeat(" ");
|
||||
const spaces = repeat(choice(" ", "\t"));
|
||||
|
||||
module.exports = grammar({
|
||||
name: "d2",
|
||||
|
@ -42,8 +42,7 @@ module.exports = grammar({
|
|||
choice(
|
||||
seq($.dot, $._shape_attribute),
|
||||
seq(
|
||||
$._colon,
|
||||
optional($.label),
|
||||
optional(seq($._colon, optional($.label))),
|
||||
optional(alias($._shape_block, $.block))
|
||||
)
|
||||
)
|
||||
|
@ -56,7 +55,15 @@ module.exports = grammar({
|
|||
attr_value: ($) => seq(spaces, choice($.string, $._unquoted_string)),
|
||||
|
||||
_root_attribute: ($) =>
|
||||
seq(alias($._root_attr_key, $.attr_key), $._colon, $.attr_value, $._end),
|
||||
choice(
|
||||
seq(
|
||||
alias($._root_attr_key, $.attr_key),
|
||||
$._colon,
|
||||
$.attr_value,
|
||||
$._end
|
||||
),
|
||||
alias(seq($._shape_attribute, $._end), $.invalid)
|
||||
),
|
||||
|
||||
_root_attr_key: ($) => "direction",
|
||||
|
||||
|
@ -64,8 +71,9 @@ module.exports = grammar({
|
|||
seq(
|
||||
spaces,
|
||||
"{",
|
||||
spaces,
|
||||
repeat(choice($._emptyline, seq($._shape_block_definition, $._end))),
|
||||
repeat(
|
||||
choice($._emptyline, seq(spaces, $._shape_block_definition, $._end))
|
||||
),
|
||||
optional(seq($._shape_block_definition, optional($._end))),
|
||||
spaces,
|
||||
"}"
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
; Special (treesitter don't overwrite)
|
||||
;-------------------------------------------------------------------------------
|
||||
|
||||
(ERROR) @error
|
||||
(invalid (_) @error)
|
||||
;-------------------------------------------------------------------------------
|
||||
|
||||
(identifier) @variable
|
||||
|
@ -31,6 +36,8 @@
|
|||
"}"
|
||||
] @punctuation.bracket
|
||||
|
||||
; Special (nvim-treesitter overwrite previous rules)
|
||||
;-------------------------------------------------------------------------------
|
||||
|
||||
(ERROR) @error
|
||||
(invalid (_) @error)
|
||||
|
|
272
src/grammar.json
272
src/grammar.json
|
@ -143,16 +143,29 @@
|
|||
{
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "_colon"
|
||||
},
|
||||
{
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "label"
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "_colon"
|
||||
},
|
||||
{
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "label"
|
||||
},
|
||||
{
|
||||
"type": "BLANK"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "BLANK"
|
||||
|
@ -210,8 +223,17 @@
|
|||
{
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "\t"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -230,28 +252,51 @@
|
|||
]
|
||||
},
|
||||
"_root_attribute": {
|
||||
"type": "SEQ",
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "ALIAS",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "_root_attr_key"
|
||||
},
|
||||
"named": true,
|
||||
"value": "attr_key"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "_colon"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "attr_value"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "_end"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "ALIAS",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "_root_attr_key"
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "_shape_attribute"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "_end"
|
||||
}
|
||||
]
|
||||
},
|
||||
"named": true,
|
||||
"value": "attr_key"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "_colon"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "attr_value"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "_end"
|
||||
"value": "invalid"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
@ -265,21 +310,23 @@
|
|||
{
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "\t"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "{"
|
||||
},
|
||||
{
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
|
@ -292,6 +339,22 @@
|
|||
{
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "\t"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "_shape_block_definition"
|
||||
|
@ -337,8 +400,17 @@
|
|||
{
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "\t"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -451,8 +523,17 @@
|
|||
{
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "\t"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -462,8 +543,17 @@
|
|||
{
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "\t"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -523,8 +613,17 @@
|
|||
{
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "\t"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -539,8 +638,17 @@
|
|||
{
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "\t"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -689,8 +797,17 @@
|
|||
{
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "\t"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -736,8 +853,17 @@
|
|||
{
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "\t"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -775,8 +901,17 @@
|
|||
{
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "\t"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -791,8 +926,17 @@
|
|||
{
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "\t"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -995,8 +1139,17 @@
|
|||
{
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "\t"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -1024,8 +1177,17 @@
|
|||
{
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": " "
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "\t"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
|
@ -99,6 +99,33 @@
|
|||
"named": true,
|
||||
"fields": {}
|
||||
},
|
||||
{
|
||||
"type": "invalid",
|
||||
"named": true,
|
||||
"fields": {},
|
||||
"children": {
|
||||
"multiple": true,
|
||||
"required": false,
|
||||
"types": [
|
||||
{
|
||||
"type": "attr_key",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "attr_value",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "block",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "dot",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "label",
|
||||
"named": true,
|
||||
|
@ -169,6 +196,10 @@
|
|||
"type": "connection",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "invalid",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "shape",
|
||||
"named": true
|
||||
|
@ -185,6 +216,10 @@
|
|||
"type": "\u0000",
|
||||
"named": false
|
||||
},
|
||||
{
|
||||
"type": "\t",
|
||||
"named": false
|
||||
},
|
||||
{
|
||||
"type": "\n",
|
||||
"named": false
|
||||
|
|
BIN
src/parser.c
BIN
src/parser.c
Binary file not shown.
|
@ -9,6 +9,29 @@ direction: value
|
|||
(attr_key) (attr_value)
|
||||
)
|
||||
|
||||
================================================================================
|
||||
Block shape attribute
|
||||
================================================================================
|
||||
foo: {
|
||||
shape: oval
|
||||
|
||||
foo.bar.baz: {
|
||||
shape: oval
|
||||
}
|
||||
}
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(source_file
|
||||
(shape (identifier) (block
|
||||
(attr_key) (attr_value)
|
||||
(shape (identifier) (dot) (identifier) (dot) (identifier) (block
|
||||
(attr_key) (attr_value)
|
||||
))
|
||||
))
|
||||
)
|
||||
|
||||
|
||||
================================================================================
|
||||
Inline shape attribute
|
||||
================================================================================
|
||||
|
|
|
@ -130,3 +130,4 @@ foo: Foo {
|
|||
))
|
||||
))
|
||||
)
|
||||
|
||||
|
|
|
@ -4,6 +4,10 @@ direction: right;
|
|||
# ^ string
|
||||
# ^ punctuation.delimiter
|
||||
|
||||
shape: oval;
|
||||
# <- error
|
||||
# ^ error
|
||||
|
||||
baaaz.style: {
|
||||
# <- variable
|
||||
# ^ keyword
|
||||
|
|
Binary file not shown.
Loading…
Reference in a new issue