diff options
| author | 2026-02-16 21:37:31 +0300 | |
|---|---|---|
| committer | 2026-02-17 20:13:24 +0300 | |
| commit | d3fd3ba6f9796df96ec4eae9124a460fbb05eb59 (patch) | |
| tree | 57803d91f8ae7bd3085b0b393bdf81bcc2ac0dfa /internal/ast/tree.go | |
| download | conf-d3fd3ba6f9796df96ec4eae9124a460fbb05eb59.tar.gz conf-d3fd3ba6f9796df96ec4eae9124a460fbb05eb59.tar.bz2 conf-d3fd3ba6f9796df96ec4eae9124a460fbb05eb59.tar.xz conf-d3fd3ba6f9796df96ec4eae9124a460fbb05eb59.zip | |
init
Diffstat (limited to 'internal/ast/tree.go')
| -rw-r--r-- | internal/ast/tree.go | 43 |
1 files changed, 43 insertions, 0 deletions
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 +} |
