Как получить значения из узлов в tree-sitter?
Если у меня простая грамматика на дереве:
rules: {
expr: $ => choice(
/[0-9]+/,
prec.right(seq($.expr, /[+-]/, $.expr)),
)
}
И вход:
3+4
Я получаю следующий CST:
(start [0, 0] - [0, 3]
(expr [0, 0] - [0, 3]
(expr [0, 0] - [0, 1])
(expr [0, 2] - [0, 3])))
Итак, мой вопрос: как мне получить значения, то есть то, что было проанализировано, из этих узлов / листов. Я как-то должен оценить дерево. Я, конечно, уверен, что есть способ, потому что я также могу выделить синтаксис с помощью tree-sitter, для каких мне нужны значения (я думаю). Но я прочитал документацию и не нашел ни одной заметки, как это сделать.
1 ответ
В синтаксическом дереве Tree-sitter не хранятся копии входящего текста. Итак, чтобы получить текст определенного токена, вам придется использовать диапазоны, которые Tree-sitter дает вам для вычисления фрагментов исходного исходного кода.
В привязке python это выглядит так:
source_code_bytes = b'3 + 4'
tree = parser.parse(source_code_bytes)
node1 = tree.root_node.children[0].children[0]
node1_text = source_code_bytes[node1.start_byte:node1.end_byte].decode('utf8')
assert node1_text == '3'
В некоторых языковых привязках, таких как привязка wasm, есть.text
помощник, чтобы сделать это проще.
Существует открытая проблема с добавлением такой вспомогательной функции в привязку python.