diff options
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 +} |
