aboutsummaryrefslogtreecommitdiff
path: root/src/grammar.json
diff options
context:
space:
mode:
authorThomas Voss <mail@thomasvoss.com> 2024-09-14 21:52:11 +0200
committerThomas Voss <mail@thomasvoss.com> 2024-09-14 21:52:11 +0200
commit642d5264e0d7b3d3870d13c2cc4a04987ee65ab6 (patch)
tree53268bb7f35994d911e7c95e6f46cb5d7788b6fd /src/grammar.json
parent291cb06fc2d578ac19c01ebda9b71f94733af0e8 (diff)
Completely overhaul the grammar
Diffstat (limited to 'src/grammar.json')
-rw-r--r--src/grammar.json339
1 files changed, 133 insertions, 206 deletions
diff --git a/src/grammar.json b/src/grammar.json
index ad8dfcb..060f61c 100644
--- a/src/grammar.json
+++ b/src/grammar.json
@@ -1,22 +1,26 @@
{
"name": "gsp",
"rules": {
- "source_file": {
+ "document": {
"type": "REPEAT",
"content": {
- "type": "CHOICE",
- "members": [
- {
- "type": "SYMBOL",
- "name": "comment"
- },
- {
- "type": "SYMBOL",
- "name": "node"
- }
- ]
+ "type": "SYMBOL",
+ "name": "_toplevel"
}
},
+ "_toplevel": {
+ "type": "CHOICE",
+ "members": [
+ {
+ "type": "SYMBOL",
+ "name": "comment"
+ },
+ {
+ "type": "SYMBOL",
+ "name": "node"
+ }
+ ]
+ },
"comment": {
"type": "SEQ",
"members": [
@@ -25,23 +29,24 @@
"value": "/"
},
{
- "type": "CHOICE",
- "members": [
- {
- "type": "SYMBOL",
- "name": "node_name"
- },
- {
- "type": "BLANK"
- }
- ]
+ "type": "SYMBOL",
+ "name": "node"
+ }
+ ]
+ },
+ "node": {
+ "type": "SEQ",
+ "members": [
+ {
+ "type": "SYMBOL",
+ "name": "node_name"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
- "name": "attribute_list"
+ "name": "attrs"
},
{
"type": "BLANK"
@@ -49,6 +54,20 @@
]
},
{
+ "type": "SYMBOL",
+ "name": "node_body"
+ }
+ ]
+ },
+ "node_name": {
+ "type": "PATTERN",
+ "value": "\\p{XID_Start}[-\\p{XID_Continue}]*",
+ "flags": "u"
+ },
+ "node_body": {
+ "type": "SEQ",
+ "members": [
+ {
"type": "STRING",
"value": "{"
},
@@ -56,11 +75,41 @@
"type": "CHOICE",
"members": [
{
- "type": "SYMBOL",
- "name": "node_body"
+ "type": "REPEAT",
+ "content": {
+ "type": "SYMBOL",
+ "name": "_toplevel"
+ }
},
{
- "type": "BLANK"
+ "type": "SEQ",
+ "members": [
+ {
+ "type": "CHOICE",
+ "members": [
+ {
+ "type": "STRING",
+ "value": "-"
+ },
+ {
+ "type": "STRING",
+ "value": "="
+ }
+ ]
+ },
+ {
+ "type": "CHOICE",
+ "members": [
+ {
+ "type": "SYMBOL",
+ "name": "text"
+ },
+ {
+ "type": "BLANK"
+ }
+ ]
+ }
+ ]
}
]
},
@@ -70,123 +119,86 @@
}
]
},
- "node": {
+ "attrs": {
+ "type": "REPEAT1",
+ "content": {
+ "type": "CHOICE",
+ "members": [
+ {
+ "type": "SYMBOL",
+ "name": "attr"
+ },
+ {
+ "type": "SYMBOL",
+ "name": "id_attr"
+ },
+ {
+ "type": "SYMBOL",
+ "name": "class_attr"
+ }
+ ]
+ }
+ },
+ "attr": {
"type": "SEQ",
"members": [
{
- "type": "CHOICE",
- "members": [
- {
- "type": "STRING",
- "value": ">"
- },
- {
- "type": "BLANK"
- }
- ]
+ "type": "PATTERN",
+ "value": "\\p{XID_Start}[-\\p{XID_Continue}]*",
+ "flags": "u"
},
{
- "type": "SYMBOL",
- "name": "node_name"
+ "type": "STRING",
+ "value": "="
},
{
- "type": "CHOICE",
- "members": [
- {
- "type": "SYMBOL",
- "name": "attribute_list"
- },
- {
- "type": "BLANK"
- }
- ]
- },
+ "type": "PATTERN",
+ "value": "\"(\\\\[\"\\\\]|[^\"\\\\])+\""
+ }
+ ]
+ },
+ "id_attr": {
+ "type": "SEQ",
+ "members": [
{
"type": "STRING",
- "value": "{"
+ "value": "#"
},
{
- "type": "CHOICE",
- "members": [
- {
- "type": "SYMBOL",
- "name": "node_body"
- },
- {
- "type": "BLANK"
- }
- ]
- },
- {
- "type": "STRING",
- "value": "}"
+ "type": "IMMEDIATE_TOKEN",
+ "content": {
+ "type": "PATTERN",
+ "value": "\\p{XID_Start}[-\\p{XID_Continue}]*",
+ "flags": "u"
+ }
}
]
},
- "node_body": {
- "type": "CHOICE",
+ "class_attr": {
+ "type": "SEQ",
"members": [
{
- "type": "REPEAT1",
- "content": {
- "type": "CHOICE",
- "members": [
- {
- "type": "SYMBOL",
- "name": "comment"
- },
- {
- "type": "SYMBOL",
- "name": "node"
- }
- ]
- }
+ "type": "STRING",
+ "value": "."
},
{
- "type": "SEQ",
- "members": [
- {
- "type": "CHOICE",
- "members": [
- {
- "type": "STRING",
- "value": "-"
- },
- {
- "type": "STRING",
- "value": "="
- }
- ]
- },
- {
- "type": "CHOICE",
- "members": [
- {
- "type": "SYMBOL",
- "name": "text"
- },
- {
- "type": "BLANK"
- }
- ]
- }
- ]
+ "type": "IMMEDIATE_TOKEN",
+ "content": {
+ "type": "PATTERN",
+ "value": "\\p{XID_Start}[-\\p{XID_Continue}]*",
+ "flags": "u"
+ }
}
]
},
- "node_name": {
- "type": "PATTERN",
- "value": "[a-zA-Z:_\\u{000C0}-\\u{000D6}\\u{000D8}-\\u{000F6}\\u{000F8}-\\u{002FF}\\u{00370}-\\u{0037D}\\u{0037F}-\\u{01FFF}\\u{0200C}-\\u{0200D}\\u{02070}-\\u{0218F}\\u{02C00}-\\u{02FEF}\\u{03001}-\\u{0D7FF}\\u{0F900}-\\u{0FDCF}\\u{0FDF0}-\\u{0FFFD}\\u{10000}-\\u{EFFFF}][a-zA-Z0-9:_\\-.ยท\\u{00300}-\\u{0036F}\\u{0203F}-\\u{02040}\\u{000C0}-\\u{000D6}\\u{000D8}-\\u{000F6}\\u{000F8}-\\u{002FF}\\u{00370}-\\u{0037D}\\u{0037F}-\\u{01FFF}\\u{0200C}-\\u{0200D}\\u{02070}-\\u{0218F}\\u{02C00}-\\u{02FEF}\\u{03001}-\\u{0D7FF}\\u{0F900}-\\u{0FDCF}\\u{0FDF0}-\\u{0FFFD}\\u{10000}-\\u{EFFFF}]*",
- "flags": "u"
- },
"text": {
"type": "REPEAT1",
"content": {
"type": "CHOICE",
"members": [
{
- "type": "SYMBOL",
- "name": "literal_text"
+ "type": "PATTERN",
+ "value": "(\\\\[@}\\\\]|[^@}\\\\])+"
},
{
"type": "SEQ",
@@ -196,105 +208,20 @@
"value": "@"
},
{
- "type": "CHOICE",
- "members": [
- {
- "type": "SYMBOL",
- "name": "comment"
- },
- {
- "type": "SYMBOL",
- "name": "node"
- }
- ]
+ "type": "SYMBOL",
+ "name": "_toplevel"
}
]
}
]
}
- },
- "literal_text": {
- "type": "PATTERN",
- "value": "(\\\\[@}\\\\]|[^@}\\\\])+"
- },
- "attribute_list": {
- "type": "REPEAT1",
- "content": {
- "type": "SYMBOL",
- "name": "attribute"
- }
- },
- "attribute": {
- "type": "CHOICE",
- "members": [
- {
- "type": "SYMBOL",
- "name": "class_shorthand"
- },
- {
- "type": "SYMBOL",
- "name": "id_shorthand"
- },
- {
- "type": "SEQ",
- "members": [
- {
- "type": "SYMBOL",
- "name": "attribute_name"
- },
- {
- "type": "CHOICE",
- "members": [
- {
- "type": "SEQ",
- "members": [
- {
- "type": "STRING",
- "value": "="
- },
- {
- "type": "SYMBOL",
- "name": "attribute_value"
- }
- ]
- },
- {
- "type": "BLANK"
- }
- ]
- }
- ]
- }
- ]
- },
- "class_shorthand": {
- "type": "PATTERN",
- "value": "\\.\\P{White_Space}+",
- "flags": "u"
- },
- "id_shorthand": {
- "type": "PATTERN",
- "value": "#\\P{White_Space}+",
- "flags": "u"
- },
- "attribute_name": {
- "type": "PATTERN",
- "value": "[a-zA-Z0-9_-]+"
- },
- "attribute_value": {
- "type": "PATTERN",
- "value": "\"(\\\\.|[^\"\\\\])*\""
- },
- "_S": {
- "type": "PATTERN",
- "value": "\\p{White_Space}+",
- "flags": "u"
}
},
"extras": [
{
- "type": "SYMBOL",
- "name": "_S"
+ "type": "PATTERN",
+ "value": "\\p{Pattern_White_Space}+",
+ "flags": "u"
}
],
"conflicts": [],