是否有用于解析任意长度列表的标准 treesitter 构造?

Is there a standard treesitter construct for parsing an arbitrary-length list?

编程语言中一个非常常见的解析场景是带有分隔符的任意长度的非空元素列表,例如:

[1, 2, 3, 4, 5]
f(a, b, c)

我一直在 treesitter 中解析它如下:

list: $ => seq(
  repeat(seq($.element, ',')),
  $.element
)

这行得通,但它很常见,我想知道 treesitter 是否有内置的结构。是吗?

在一些语法中,(例如Rust, Go),我们为此定义了辅助函数。

function commaSep1(rule) {
  return seq(rule, repeat(seq(',', rule)))
}

function commaSep(rule) {
  return optional(commaSep1(rule))
}

我们可以将这些函数作为 Tree-sitter DSL 的一部分,但是因为它很容易 像这样定义你自己的辅助函数,我认为最好保持 DSL 小。