Есть ли стандартная конструкция treeitter для анализа списка произвольной длины?

Один из самых распространенных сценариев синтаксического анализа в языках программирования - это непустой список элементов произвольной длины с разделителем, например:

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

Я разбирал это в treeitter следующим образом:

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

Это работает, но достаточно часто, что мне интересно, есть ли для него встроенная конструкция treeitter. Является ли?

1 ответ

Решение

В нескольких грамматиках (например, Rust, Go) мы определяем для этого вспомогательные функции.

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

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

Мы могли бы включить эти функции как часть Tree-sitter DSL, но, поскольку так легко определить ваши собственные вспомогательные функции, как эта, я думаю, что лучше сохранить DSL небольшого размера.

Другие вопросы по тегам