首页 > 解决方案 > 是否有用于解析任意长度列表的标准treesitter 构造?

问题描述

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

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

我一直在treesitter中解析这个如下:

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

这很有效,但它很常见,我想知道treesitter是否有一个内置的构造。可以?

标签: treesitter

解决方案


在几种语法中(例如RustGo),我们为此定义了辅助函数。

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

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

我们可以将这些函数作为 Tree-sitter DSL 的一部分包含在内,但是由于像这样定义自己的辅助函数非常容易,我认为最好保持 DSL 小。


推荐阅读