Есть ли стандартная конструкция 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 небольшого размера.