123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- package ini
- import (
- "bytes"
- "fmt"
- )
- // ParseStack is a stack that contains a container, the stack portion,
- // and the list which is the list of ASTs that have been successfully
- // parsed.
- type ParseStack struct {
- top int
- container []AST
- list []AST
- index int
- }
- func newParseStack(sizeContainer, sizeList int) ParseStack {
- return ParseStack{
- container: make([]AST, sizeContainer),
- list: make([]AST, sizeList),
- }
- }
- // Pop will return and truncate the last container element.
- func (s *ParseStack) Pop() AST {
- s.top--
- return s.container[s.top]
- }
- // Push will add the new AST to the container
- func (s *ParseStack) Push(ast AST) {
- s.container[s.top] = ast
- s.top++
- }
- // MarkComplete will append the AST to the list of completed statements
- func (s *ParseStack) MarkComplete(ast AST) {
- s.list[s.index] = ast
- s.index++
- }
- // List will return the completed statements
- func (s ParseStack) List() []AST {
- return s.list[:s.index]
- }
- // Len will return the length of the container
- func (s *ParseStack) Len() int {
- return s.top
- }
- func (s ParseStack) String() string {
- buf := bytes.Buffer{}
- for i, node := range s.list {
- buf.WriteString(fmt.Sprintf("%d: %v\n", i+1, node))
- }
- return buf.String()
- }
|