Как получить значения из узлов в 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.

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