add collections; improve identifier

This commit is contained in:
mhoffm
2021-06-08 00:04:05 +02:00
parent e67d183d71
commit fdb45d9ddd
4 changed files with 2740 additions and 493 deletions

View File

@@ -1,12 +1,15 @@
const
space = ' ',
decimal = /[0-9]/
//TODO figure out how to subtact regex sets
unicodeLetter = /\p{L}/
unicodePunctuation = /\p{Pc}/
unicodeDigit = /[0-9]/
module.exports = grammar({
name: 'hcl',
conflicts: $ => [
[$.body],
[$.object_elem, $.variable_expr],
],
extras: $ => [
@@ -46,7 +49,7 @@ module.exports = grammar({
expr_term: $ => choice(
$.literal_value,
// $.collection_value,
$.collection_value,
// $.template_expr,
$.variable_expr,
// $.function_call,
@@ -68,6 +71,35 @@ module.exports = grammar({
numeric_lit: $ => /[0-9]+(\.[0-9]+([eE][-+]?[0-9]+)?)?/,
collection_value: $ => choice(
$.tuple,
$.object,
),
tuple: $ => seq(
'[',
optional(seq(
$.expression,
repeat(seq(',', $.expression)),
)),
']',
),
object: $ => seq(
'{',
optional(seq(
$.object_elem,
repeat(seq(',', $.object_elem)),
)),
'}',
),
object_elem: $ => seq(
choice($.identifier, $.expression),
choice('=', ':'),
$.expression,
),
variable_expr: $ => $.identifier,
// TODO: template expressions
@@ -81,8 +113,11 @@ module.exports = grammar({
// TODO: string_literals are special template literals
string_lit: $ => seq('"', /\w+/, '"'),
// TODO: unicode identifier
identifier: $ => /\w+/,
// TODO: not to spec, but maybe good enough
identifier: $ => token(seq(
unicodeLetter,
repeat(choice(unicodeLetter, unicodeDigit, unicodePunctuation))
)),
// http://stackoverflow.com/questions/13014947/regex-to-match-a-c-style-multiline-comment/36328890#36328890
comment: $ => token(choice(
@@ -93,6 +128,6 @@ module.exports = grammar({
/[^*]*\*+([^/*][^*]*\*+)*/,
'/'
)
))
)),
}
});

View File

@@ -104,6 +104,10 @@
"type": "SYMBOL",
"name": "literal_value"
},
{
"type": "SYMBOL",
"name": "collection_value"
},
{
"type": "SYMBOL",
"name": "variable_expr"
@@ -156,6 +160,146 @@
"type": "PATTERN",
"value": "[0-9]+(\\.[0-9]+([eE][-+]?[0-9]+)?)?"
},
"collection_value": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "tuple"
},
{
"type": "SYMBOL",
"name": "object"
}
]
},
"tuple": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "["
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "expression"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "expression"
}
]
}
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": "]"
}
]
},
"object": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "{"
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "object_elem"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "object_elem"
}
]
}
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": "}"
}
]
},
"object_elem": {
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "identifier"
},
{
"type": "SYMBOL",
"name": "expression"
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "="
},
{
"type": "STRING",
"value": ":"
}
]
},
{
"type": "SYMBOL",
"name": "expression"
}
]
},
"variable_expr": {
"type": "SYMBOL",
"name": "identifier"
@@ -178,8 +322,36 @@
]
},
"identifier": {
"type": "PATTERN",
"value": "\\w+"
"type": "TOKEN",
"content": {
"type": "SEQ",
"members": [
{
"type": "PATTERN",
"value": "\\p{L}"
},
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "PATTERN",
"value": "\\p{L}"
},
{
"type": "PATTERN",
"value": "[0-9]"
},
{
"type": "PATTERN",
"value": "\\p{Pc}"
}
]
}
}
]
}
},
"comment": {
"type": "TOKEN",
@@ -246,6 +418,10 @@
"conflicts": [
[
"body"
],
[
"object_elem",
"variable_expr"
]
],
"precedences": [],

View File

@@ -60,6 +60,25 @@
]
}
},
{
"type": "collection_value",
"named": true,
"fields": {},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "object",
"named": true
},
{
"type": "tuple",
"named": true
}
]
}
},
{
"type": "config_file",
"named": true,
@@ -83,6 +102,10 @@
"multiple": false,
"required": true,
"types": [
{
"type": "collection_value",
"named": true
},
{
"type": "expression",
"named": true
@@ -113,11 +136,6 @@
]
}
},
{
"type": "identifier",
"named": true,
"fields": {}
},
{
"type": "literal_value",
"named": true,
@@ -137,11 +155,60 @@
]
}
},
{
"type": "object",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": false,
"types": [
{
"type": "object_elem",
"named": true
}
]
}
},
{
"type": "object_elem",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "expression",
"named": true
},
{
"type": "identifier",
"named": true
}
]
}
},
{
"type": "string_lit",
"named": true,
"fields": {}
},
{
"type": "tuple",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": false,
"types": [
{
"type": "expression",
"named": true
}
]
}
},
{
"type": "variable_expr",
"named": true,
@@ -169,10 +236,26 @@
"type": ")",
"named": false
},
{
"type": ",",
"named": false
},
{
"type": ":",
"named": false
},
{
"type": "=",
"named": false
},
{
"type": "[",
"named": false
},
{
"type": "]",
"named": false
},
{
"type": "comment",
"named": true
@@ -181,6 +264,10 @@
"type": "false",
"named": false
},
{
"type": "identifier",
"named": true
},
{
"type": "null",
"named": false

File diff suppressed because it is too large Load Diff