feat: add TYPE/STRUCT and DATA_BLOCK support to tree-sitter grammar

- Add type_definition rule for UDT files (TYPE/STRUCT/END_STRUCT/END_TYPE)
- Add data_block rule for DB files (DATA_BLOCK/BEGIN/END_DATA_BLOCK)
- Add NON_RETAIN and RETAIN modifiers support in data blocks
- Keywords now highlighted correctly in .udt and .db files
This commit is contained in:
2026-02-20 23:42:28 +01:00
parent 553192e7a1
commit 7b25cf6202
4 changed files with 62784 additions and 53370 deletions
+30
View File
@@ -28,10 +28,40 @@ module.exports = grammar({
$.organization_block,
$.function_block,
$.function,
$.type_definition,
$.data_block,
$.statement
)
),
type_definition: $ => seq(
alias('TYPE', $.keyword),
field('name', choice($.string, $.identifier)),
optional(seq(alias('TITLE', $.keyword), '=', choice($.string, $.identifier))),
optional($.attribute_list),
optional(seq(alias('VERSION', $.keyword), ':', $.number)),
alias('STRUCT', $.keyword),
repeat(choice($.var_item, $.block_comment)),
alias('END_STRUCT', $.keyword),
alias('END_TYPE', $.keyword)
),
data_block: $ => seq(
alias('DATA_BLOCK', $.keyword),
field('name', choice($.string, $.identifier)),
optional(seq(alias('TITLE', $.keyword), '=', choice($.string, $.identifier))),
optional($.attribute_list),
optional(seq(alias('VERSION', $.keyword), ':', $.number)),
optional(choice(
alias('NON_RETAIN', $.keyword),
alias('RETAIN', $.keyword)
)),
optional($.var_declaration),
alias('BEGIN', $.keyword),
repeat($.statement),
alias('END_DATA_BLOCK', $.keyword)
),
organization_block: $ => seq(
alias('ORGANIZATION_BLOCK', $.keyword),
field('name', $.string),
+343
View File
@@ -19,6 +19,14 @@
"type": "SYMBOL",
"name": "function"
},
{
"type": "SYMBOL",
"name": "type_definition"
},
{
"type": "SYMBOL",
"name": "data_block"
},
{
"type": "SYMBOL",
"name": "statement"
@@ -26,6 +34,341 @@
]
}
},
"type_definition": {
"type": "SEQ",
"members": [
{
"type": "ALIAS",
"content": {
"type": "STRING",
"value": "TYPE"
},
"named": true,
"value": "keyword"
},
{
"type": "FIELD",
"name": "name",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "string"
},
{
"type": "SYMBOL",
"name": "identifier"
}
]
}
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "ALIAS",
"content": {
"type": "STRING",
"value": "TITLE"
},
"named": true,
"value": "keyword"
},
{
"type": "STRING",
"value": "="
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "string"
},
{
"type": "SYMBOL",
"name": "identifier"
}
]
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "attribute_list"
},
{
"type": "BLANK"
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "ALIAS",
"content": {
"type": "STRING",
"value": "VERSION"
},
"named": true,
"value": "keyword"
},
{
"type": "STRING",
"value": ":"
},
{
"type": "SYMBOL",
"name": "number"
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "ALIAS",
"content": {
"type": "STRING",
"value": "STRUCT"
},
"named": true,
"value": "keyword"
},
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "var_item"
},
{
"type": "SYMBOL",
"name": "block_comment"
}
]
}
},
{
"type": "ALIAS",
"content": {
"type": "STRING",
"value": "END_STRUCT"
},
"named": true,
"value": "keyword"
},
{
"type": "ALIAS",
"content": {
"type": "STRING",
"value": "END_TYPE"
},
"named": true,
"value": "keyword"
}
]
},
"data_block": {
"type": "SEQ",
"members": [
{
"type": "ALIAS",
"content": {
"type": "STRING",
"value": "DATA_BLOCK"
},
"named": true,
"value": "keyword"
},
{
"type": "FIELD",
"name": "name",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "string"
},
{
"type": "SYMBOL",
"name": "identifier"
}
]
}
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "ALIAS",
"content": {
"type": "STRING",
"value": "TITLE"
},
"named": true,
"value": "keyword"
},
{
"type": "STRING",
"value": "="
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "string"
},
{
"type": "SYMBOL",
"name": "identifier"
}
]
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "attribute_list"
},
{
"type": "BLANK"
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "ALIAS",
"content": {
"type": "STRING",
"value": "VERSION"
},
"named": true,
"value": "keyword"
},
{
"type": "STRING",
"value": ":"
},
{
"type": "SYMBOL",
"name": "number"
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "ALIAS",
"content": {
"type": "STRING",
"value": "NON_RETAIN"
},
"named": true,
"value": "keyword"
},
{
"type": "ALIAS",
"content": {
"type": "STRING",
"value": "RETAIN"
},
"named": true,
"value": "keyword"
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "var_declaration"
},
{
"type": "BLANK"
}
]
},
{
"type": "ALIAS",
"content": {
"type": "STRING",
"value": "BEGIN"
},
"named": true,
"value": "keyword"
},
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "statement"
}
},
{
"type": "ALIAS",
"content": {
"type": "STRING",
"value": "END_DATA_BLOCK"
},
"named": true,
"value": "keyword"
}
]
},
"organization_block": {
"type": "SEQ",
"members": [
+116
View File
@@ -193,6 +193,60 @@
]
}
},
{
"type": "data_block",
"named": true,
"fields": {
"name": {
"multiple": false,
"required": true,
"types": [
{
"type": "identifier",
"named": true
},
{
"type": "string",
"named": true
}
]
}
},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "attribute_list",
"named": true
},
{
"type": "identifier",
"named": true
},
{
"type": "keyword",
"named": true
},
{
"type": "number",
"named": true
},
{
"type": "statement",
"named": true
},
{
"type": "string",
"named": true
},
{
"type": "var_declaration",
"named": true
}
]
}
},
{
"type": "else_clause",
"named": true,
@@ -851,6 +905,10 @@
"multiple": true,
"required": false,
"types": [
{
"type": "data_block",
"named": true
},
{
"type": "function",
"named": true
@@ -866,6 +924,10 @@
{
"type": "statement",
"named": true
},
{
"type": "type_definition",
"named": true
}
]
}
@@ -989,6 +1051,60 @@
]
}
},
{
"type": "type_definition",
"named": true,
"fields": {
"name": {
"multiple": false,
"required": true,
"types": [
{
"type": "identifier",
"named": true
},
{
"type": "string",
"named": true
}
]
}
},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "attribute_list",
"named": true
},
{
"type": "block_comment",
"named": true
},
{
"type": "identifier",
"named": true
},
{
"type": "keyword",
"named": true
},
{
"type": "number",
"named": true
},
{
"type": "string",
"named": true
},
{
"type": "var_item",
"named": true
}
]
}
},
{
"type": "unary_expression",
"named": true,
+62295 -53370
View File
File diff suppressed because it is too large Load Diff