【问题标题】:Is there a standard treesitter construct for parsing an arbitrary-length list?是否有用于解析任意长度列表的标准treesitter 构造?
【发布时间】:2020-10-21 00:08:09
【问题描述】:

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

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

我一直在treesitter中解析如下:

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

这可行,但它很常见,以至于我想知道 treesitter 是否有内置构造。是吗?

【问题讨论】:

    标签: treesitter


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-02-20
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多