Allow grammar lists with trailing commas or empty

This commit is contained in:
2026-04-30 20:47:18 -06:00
parent fc99fda2c8
commit c874672515
4 changed files with 5768 additions and 2805 deletions

View File

@@ -24,10 +24,17 @@
/// <reference types="tree-sitter-cli/dsl" />
// @ts-check
const list = el => seq(el, repeat(seq(",", el)))
const listComma = el => seq(el, choice(",", repeat1(seq(",", el))))
const parenList = (el) => seq("(", list(el), ")");
const parenListComma = (el) => seq("(", listComma(el), ")");
/// A comma-separated list.
const list = el => optional(seq(el, repeat(seq(",", el)), optional(",")))
/// A paren-surrounded, comma-separated list.
const parenList = el => seq("(", list(el), ")");
/// A list that requires a comma for unit length.
const listComma = el => optional(choice(seq(el, ","), seq(el, repeat1(seq(",", el)), optional(","))))
/// A paren-surrounded list that requires a comma for unit length.
const parenListComma = el => seq("(", listComma(el), ")")
/// Shorthand to write a binary expression with left precedence of the given priority.
const expr_prec = (expr, precedence, op) => prec.left(precedence,
@@ -95,18 +102,16 @@ export default grammar({
optional(field("negate", "-")),
field("relation", $.symbol),
field("head", $.expr),
optional(seq(":-", field("body", $.rule_body))),
"."
choice(".", seq(":-", field("body", $.rule_body))),
),
assumption: $ => seq(
optional(seq("soft", "(", field("soft", $.integer), ")")),
":-",
field("body", $.rule_body),
"."
),
rule_body: $ => list(field("clause", $.expr)),
rule_body: $ => seq(list(field("clause", $.expr)), "."),
expr: $ => choice(
// variables
@@ -141,7 +146,7 @@ export default grammar({
optional(seq(list(field("witness", $.variable)), ":")),
choice(
field("apply", $.apply),
seq("{", field("body", $.rule_body ), "}"),
seq("{", list(field("clause", $.expr) ), "}"),
),
),

View File

@@ -149,44 +149,77 @@
"value": "("
},
{
"type": "SEQ",
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "tuple",
"content": {
"type": "SYMBOL",
"name": "type"
}
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": ","
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "tuple",
"content": {
"type": "SYMBOL",
"name": "type"
}
},
{
"type": "STRING",
"value": ","
}
]
},
{
"type": "REPEAT1",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "FIELD",
"name": "tuple",
"content": {
"type": "SYMBOL",
"name": "type"
}
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "tuple",
"content": {
"type": "SYMBOL",
"name": "type"
}
]
}
},
{
"type": "REPEAT1",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "FIELD",
"name": "tuple",
"content": {
"type": "SYMBOL",
"name": "type"
}
}
]
}
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "BLANK"
}
]
}
]
}
]
},
{
"type": "BLANK"
}
]
},
@@ -256,35 +289,55 @@
"value": "("
},
{
"type": "SEQ",
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "item",
"content": {
"type": "SYMBOL",
"name": "symbol"
}
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "item",
"content": {
"type": "SYMBOL",
"name": "symbol"
}
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "FIELD",
"name": "item",
"content": {
"type": "SYMBOL",
"name": "symbol"
}
}
]
}
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "BLANK"
}
]
}
]
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "FIELD",
"name": "item",
"content": {
"type": "SYMBOL",
"name": "symbol"
}
}
]
}
"type": "BLANK"
}
]
},
@@ -409,6 +462,10 @@
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "."
},
{
"type": "SEQ",
"members": [
@@ -425,15 +482,8 @@
}
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": "."
}
]
},
@@ -484,10 +534,6 @@
"type": "SYMBOL",
"name": "rule_body"
}
},
{
"type": "STRING",
"value": "."
}
]
},
@@ -495,32 +541,61 @@
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "clause",
"content": {
"type": "SYMBOL",
"name": "expr"
}
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "clause",
"content": {
"type": "SYMBOL",
"name": "expr"
}
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "FIELD",
"name": "clause",
"content": {
"type": "SYMBOL",
"name": "expr"
}
}
]
}
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "BLANK"
}
]
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "FIELD",
"name": "clause",
"content": {
"type": "SYMBOL",
"name": "expr"
}
}
]
}
"type": "STRING",
"value": "."
}
]
},
@@ -671,44 +746,77 @@
"value": "("
},
{
"type": "SEQ",
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "el",
"content": {
"type": "SYMBOL",
"name": "expr"
}
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": ","
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "el",
"content": {
"type": "SYMBOL",
"name": "expr"
}
},
{
"type": "STRING",
"value": ","
}
]
},
{
"type": "REPEAT1",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "FIELD",
"name": "el",
"content": {
"type": "SYMBOL",
"name": "expr"
}
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "el",
"content": {
"type": "SYMBOL",
"name": "expr"
}
]
}
},
{
"type": "REPEAT1",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "FIELD",
"name": "el",
"content": {
"type": "SYMBOL",
"name": "expr"
}
}
]
}
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "BLANK"
}
]
}
]
}
]
},
{
"type": "BLANK"
}
]
},
@@ -736,35 +844,55 @@
"type": "SEQ",
"members": [
{
"type": "SEQ",
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "witness",
"content": {
"type": "SYMBOL",
"name": "variable"
}
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "witness",
"content": {
"type": "SYMBOL",
"name": "variable"
}
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "FIELD",
"name": "witness",
"content": {
"type": "SYMBOL",
"name": "variable"
}
}
]
}
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "BLANK"
}
]
}
]
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "FIELD",
"name": "witness",
"content": {
"type": "SYMBOL",
"name": "variable"
}
}
]
}
"type": "BLANK"
}
]
},
@@ -798,12 +926,57 @@
"value": "{"
},
{
"type": "FIELD",
"name": "body",
"content": {
"type": "SYMBOL",
"name": "rule_body"
}
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "clause",
"content": {
"type": "SYMBOL",
"name": "expr"
}
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "FIELD",
"name": "clause",
"content": {
"type": "SYMBOL",
"name": "expr"
}
}
]
}
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "BLANK"
}
]
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",

View File

@@ -13,12 +13,12 @@
}
]
},
"body": {
"multiple": false,
"clause": {
"multiple": true,
"required": false,
"types": [
{
"type": "rule_body",
"type": "expr",
"named": true
}
]
@@ -373,7 +373,7 @@
"fields": {
"item": {
"multiple": true,
"required": true,
"required": false,
"types": [
{
"type": "symbol",
@@ -506,7 +506,7 @@
"fields": {
"clause": {
"multiple": true,
"required": true,
"required": false,
"types": [
{
"type": "expr",
@@ -522,7 +522,7 @@
"fields": {
"el": {
"multiple": true,
"required": true,
"required": false,
"types": [
{
"type": "expr",

File diff suppressed because it is too large Load Diff