From d3fd3ba6f9796df96ec4eae9124a460fbb05eb59 Mon Sep 17 00:00:00 2001 From: Alexander Neonxp Kiryukhin Date: Mon, 16 Feb 2026 21:37:31 +0300 Subject: init --- internal/ast/tree.go | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 internal/ast/tree.go (limited to 'internal/ast/tree.go') diff --git a/internal/ast/tree.go b/internal/ast/tree.go new file mode 100644 index 0000000..72b7c78 --- /dev/null +++ b/internal/ast/tree.go @@ -0,0 +1,43 @@ +package ast + +import ( + "go.neonxp.ru/conf/internal/parser" + "modernc.org/scanner" +) + +func Parse(p *parser.Parser, data []int32) []*Node { + nodes := make([]*Node, 0, 2) + for len(data) != 0 { + next := int32(1) + var node *Node + switch n := data[0]; { + case n < 0: + next = 2 + data[1] + node = &Node{ + Symbol: parser.Symbol(-data[0]), + Children: Parse(p, data[2:next]), + } + default: + tok := p.Token(n) + node = &Node{ + Token: tok, + Symbol: parser.Symbol(tok.Ch), + Source: tok.Src(), + Col: tok.Position().Column, + Line: tok.Position().Line, + } + } + nodes = append(nodes, node) + data = data[next:] + } + return nodes +} + +type Node struct { + Symbol parser.Symbol + Token scanner.Token + Children []*Node + Source string + Col int + Line int +} -- cgit v1.2.3