From 2bd0ded80745dc520c279c328855c738306daccc Mon Sep 17 00:00:00 2001 From: Dmitriy Pleshevskiy Date: Sun, 4 Dec 2022 23:45:53 +0300 Subject: [PATCH] add all keywords --- grammar.js | 93 ++++++--- src/grammar.json | 373 +++++++++++++++++++++++++------------ src/node-types.json | 125 +++++++++---- src/parser.c | Bin 70634 -> 101408 bytes test/corpus/attributes.txt | 31 ++- 5 files changed, 452 insertions(+), 170 deletions(-) diff --git a/grammar.js b/grammar.js index d2d3bcf..ab57c27 100644 --- a/grammar.js +++ b/grammar.js @@ -7,26 +7,11 @@ module.exports = grammar({ // TODO: add the actual grammar rules source_file: ($) => repeat($._definition), - _definition: ($) => choice($.attribute, $.connection, $.shape), - - _end: ($) => choice(";", "\n", "\0"), - - attribute: ($) => + _definition: ($) => choice( - seq( - $.identifier, - repeat1(seq($.dot, $.keyword)), - ":", - alias($.label, $.attribute_value), - $._end - ), - seq( - $.keyword, - repeat(seq($.dot, $.keyword)), - ":", - alias($.label, $.attribute_value), - $._end - ) + choice($._root_attribute, $._shape_attribute), + $.connection, + $.shape ), connection: ($) => @@ -47,13 +32,73 @@ module.exports = grammar({ $._end ), - dot: ($) => ".", - label: ($) => choice($.string, $._unquoted_string), identifier: ($) => $._identifier, - keyword: ($) => choice("direction"), + attr_value: ($) => choice($.string, $._unquoted_string), + + _root_attribute: ($) => + seq( + alias($._root_attr_key, $.attr_key), + ":", + alias($.label, $.attr_value), + $._end + ), + + _root_attr_key: ($) => "direction", + + _style_attribute: ($) => + seq( + alias("style", $.attr_key), + $.dot, + alias($._style_attr_key, $.attr_key), + ":", + $.attr_value, + $._end + ), + + _shape_attribute: ($) => + seq( + $.identifier, + $.dot, + choice( + seq(alias($._shape_attr_key, $.attr_key), ":", $.attr_value, $._end), + $._style_attribute + ) + ), + + _shape_attr_key: ($) => + choice( + "shape", + "label", + // sql + "constraint", + // image + "icon", + "width", + "height" + ), + + _style_attr_key: ($) => + choice( + "opacity", + "fill", + "stroke", + "stroke-width", + "stroke-dash", + "border-radius", + "font-color", + "shadow", + "multiple", + "animated", + "3d", + "link" + ), + + _text_attr_key: ($) => "near", + + _connection_attr_key: ($) => choice("source-arrowhead", "target-arrowhead"), _identifier: ($) => prec.right( @@ -91,5 +136,9 @@ module.exports = grammar({ seq('"', repeat(token(/[^'\n]+/)), '"'), seq("`", repeat(token(/[^'\n]+/)), "`") ), + + _end: ($) => choice(";", "\n", "\0"), + + dot: ($) => ".", }, }); diff --git a/src/grammar.json b/src/grammar.json index 8cc9d28..ed3dde2 100644 --- a/src/grammar.json +++ b/src/grammar.json @@ -13,8 +13,17 @@ "type": "CHOICE", "members": [ { - "type": "SYMBOL", - "name": "attribute" + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "_root_attribute" + }, + { + "type": "SYMBOL", + "name": "_shape_attribute" + } + ] }, { "type": "SYMBOL", @@ -26,112 +35,6 @@ } ] }, - "_end": { - "type": "CHOICE", - "members": [ - { - "type": "STRING", - "value": ";" - }, - { - "type": "STRING", - "value": "\n" - }, - { - "type": "STRING", - "value": "\u0000" - } - ] - }, - "attribute": { - "type": "CHOICE", - "members": [ - { - "type": "SEQ", - "members": [ - { - "type": "SYMBOL", - "name": "identifier" - }, - { - "type": "REPEAT1", - "content": { - "type": "SEQ", - "members": [ - { - "type": "SYMBOL", - "name": "dot" - }, - { - "type": "SYMBOL", - "name": "keyword" - } - ] - } - }, - { - "type": "STRING", - "value": ":" - }, - { - "type": "ALIAS", - "content": { - "type": "SYMBOL", - "name": "label" - }, - "named": true, - "value": "attribute_value" - }, - { - "type": "SYMBOL", - "name": "_end" - } - ] - }, - { - "type": "SEQ", - "members": [ - { - "type": "SYMBOL", - "name": "keyword" - }, - { - "type": "REPEAT", - "content": { - "type": "SEQ", - "members": [ - { - "type": "SYMBOL", - "name": "dot" - }, - { - "type": "SYMBOL", - "name": "keyword" - } - ] - } - }, - { - "type": "STRING", - "value": ":" - }, - { - "type": "ALIAS", - "content": { - "type": "SYMBOL", - "name": "label" - }, - "named": true, - "value": "attribute_value" - }, - { - "type": "SYMBOL", - "name": "_end" - } - ] - } - ] - }, "connection": { "type": "SEQ", "members": [ @@ -247,10 +150,6 @@ } ] }, - "dot": { - "type": "STRING", - "value": "." - }, "label": { "type": "CHOICE", "members": [ @@ -268,12 +167,237 @@ "type": "SYMBOL", "name": "_identifier" }, - "keyword": { + "attr_value": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "string" + }, + { + "type": "SYMBOL", + "name": "_unquoted_string" + } + ] + }, + "_root_attribute": { + "type": "SEQ", + "members": [ + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_root_attr_key" + }, + "named": true, + "value": "attr_key" + }, + { + "type": "STRING", + "value": ":" + }, + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "label" + }, + "named": true, + "value": "attr_value" + }, + { + "type": "SYMBOL", + "name": "_end" + } + ] + }, + "_root_attr_key": { + "type": "STRING", + "value": "direction" + }, + "_style_attribute": { + "type": "SEQ", + "members": [ + { + "type": "ALIAS", + "content": { + "type": "STRING", + "value": "style" + }, + "named": true, + "value": "attr_key" + }, + { + "type": "SYMBOL", + "name": "dot" + }, + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_style_attr_key" + }, + "named": true, + "value": "attr_key" + }, + { + "type": "STRING", + "value": ":" + }, + { + "type": "SYMBOL", + "name": "attr_value" + }, + { + "type": "SYMBOL", + "name": "_end" + } + ] + }, + "_shape_attribute": { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "identifier" + }, + { + "type": "SYMBOL", + "name": "dot" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_shape_attr_key" + }, + "named": true, + "value": "attr_key" + }, + { + "type": "STRING", + "value": ":" + }, + { + "type": "SYMBOL", + "name": "attr_value" + }, + { + "type": "SYMBOL", + "name": "_end" + } + ] + }, + { + "type": "SYMBOL", + "name": "_style_attribute" + } + ] + } + ] + }, + "_shape_attr_key": { "type": "CHOICE", "members": [ { "type": "STRING", - "value": "direction" + "value": "shape" + }, + { + "type": "STRING", + "value": "label" + }, + { + "type": "STRING", + "value": "constraint" + }, + { + "type": "STRING", + "value": "icon" + }, + { + "type": "STRING", + "value": "width" + }, + { + "type": "STRING", + "value": "height" + } + ] + }, + "_style_attr_key": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "opacity" + }, + { + "type": "STRING", + "value": "fill" + }, + { + "type": "STRING", + "value": "stroke" + }, + { + "type": "STRING", + "value": "stroke-width" + }, + { + "type": "STRING", + "value": "stroke-dash" + }, + { + "type": "STRING", + "value": "border-radius" + }, + { + "type": "STRING", + "value": "font-color" + }, + { + "type": "STRING", + "value": "shadow" + }, + { + "type": "STRING", + "value": "multiple" + }, + { + "type": "STRING", + "value": "animated" + }, + { + "type": "STRING", + "value": "3d" + }, + { + "type": "STRING", + "value": "link" + } + ] + }, + "_text_attr_key": { + "type": "STRING", + "value": "near" + }, + "_connection_attr_key": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "source-arrowhead" + }, + { + "type": "STRING", + "value": "target-arrowhead" } ] }, @@ -530,6 +654,27 @@ ] } ] + }, + "_end": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": ";" + }, + { + "type": "STRING", + "value": "\n" + }, + { + "type": "STRING", + "value": "\u0000" + } + ] + }, + "dot": { + "type": "STRING", + "value": "." } }, "extras": [ diff --git a/src/node-types.json b/src/node-types.json index 987344d..d55a06c 100644 --- a/src/node-types.json +++ b/src/node-types.json @@ -5,34 +5,12 @@ "fields": {} }, { - "type": "attribute", + "type": "attr_key", "named": true, - "fields": {}, - "children": { - "multiple": true, - "required": true, - "types": [ - { - "type": "attribute_value", - "named": true - }, - { - "type": "dot", - "named": true - }, - { - "type": "identifier", - "named": true - }, - { - "type": "keyword", - "named": true - } - ] - } + "fields": {} }, { - "type": "attribute_value", + "type": "attr_value", "named": true, "fields": {}, "children": { @@ -74,11 +52,6 @@ "named": true, "fields": {} }, - { - "type": "keyword", - "named": true, - "fields": {} - }, { "type": "label", "named": true, @@ -126,13 +99,25 @@ "required": false, "types": [ { - "type": "attribute", + "type": "attr_key", + "named": true + }, + { + "type": "attr_value", "named": true }, { "type": "connection", "named": true }, + { + "type": "dot", + "named": true + }, + { + "type": "identifier", + "named": true + }, { "type": "shape", "named": true @@ -173,6 +158,10 @@ "type": "->", "named": false }, + { + "type": "3d", + "named": false + }, { "type": ":", "named": false @@ -194,11 +183,83 @@ "named": false }, { - "type": "direction", + "type": "animated", + "named": false + }, + { + "type": "border-radius", + "named": false + }, + { + "type": "constraint", "named": false }, { "type": "dot", "named": true + }, + { + "type": "fill", + "named": false + }, + { + "type": "font-color", + "named": false + }, + { + "type": "height", + "named": false + }, + { + "type": "icon", + "named": false + }, + { + "type": "label", + "named": false + }, + { + "type": "link", + "named": false + }, + { + "type": "multiple", + "named": false + }, + { + "type": "opacity", + "named": false + }, + { + "type": "shadow", + "named": false + }, + { + "type": "shape", + "named": false + }, + { + "type": "source-arrowhead", + "named": false + }, + { + "type": "stroke", + "named": false + }, + { + "type": "stroke-dash", + "named": false + }, + { + "type": "stroke-width", + "named": false + }, + { + "type": "target-arrowhead", + "named": false + }, + { + "type": "width", + "named": false } ] \ No newline at end of file diff --git a/src/parser.c b/src/parser.c index 75948518c95b8c4c6209febe54241f928b238abe..ada0c5d1ec2ca726a5f07f8f33349ae150d80605 100644 GIT binary patch literal 101408 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 F{|`<+*4_XB diff --git a/test/corpus/attributes.txt b/test/corpus/attributes.txt index 9a2c11d..94c93ab 100644 --- a/test/corpus/attributes.txt +++ b/test/corpus/attributes.txt @@ -1,5 +1,5 @@ ================== -Keywords +Root attribute ================== direction: value @@ -7,6 +7,33 @@ direction: value --- (source_file - (attribute (keyword) (attribute_value)) + (attr_key) (attr_value) ) +================== +Inline shape attribute +================== + +foo.shape: oval + +--- + +(source_file + (identifier) (dot) (attr_key) (attr_value) +) + +================== +Inline style attribute +================== + +foo.style.opacity: 5 + +--- + +(source_file + (identifier) (dot) (attr_key) (dot) (attr_key) (attr_value) +) + + + +