code.dwrz.net

Go monorepo.
Log | Files | Refs

parse_stack.go (1234B)


      1 package ini
      2 
      3 import (
      4 	"bytes"
      5 	"fmt"
      6 )
      7 
      8 // ParseStack is a stack that contains a container, the stack portion,
      9 // and the list which is the list of ASTs that have been successfully
     10 // parsed.
     11 type ParseStack struct {
     12 	top       int
     13 	container []AST
     14 	list      []AST
     15 	index     int
     16 }
     17 
     18 func newParseStack(sizeContainer, sizeList int) ParseStack {
     19 	return ParseStack{
     20 		container: make([]AST, sizeContainer),
     21 		list:      make([]AST, sizeList),
     22 	}
     23 }
     24 
     25 // Pop will return and truncate the last container element.
     26 func (s *ParseStack) Pop() AST {
     27 	s.top--
     28 	return s.container[s.top]
     29 }
     30 
     31 // Push will add the new AST to the container
     32 func (s *ParseStack) Push(ast AST) {
     33 	s.container[s.top] = ast
     34 	s.top++
     35 }
     36 
     37 // MarkComplete will append the AST to the list of completed statements
     38 func (s *ParseStack) MarkComplete(ast AST) {
     39 	s.list[s.index] = ast
     40 	s.index++
     41 }
     42 
     43 // List will return the completed statements
     44 func (s ParseStack) List() []AST {
     45 	return s.list[:s.index]
     46 }
     47 
     48 // Len will return the length of the container
     49 func (s *ParseStack) Len() int {
     50 	return s.top
     51 }
     52 
     53 func (s ParseStack) String() string {
     54 	buf := bytes.Buffer{}
     55 	for i, node := range s.list {
     56 		buf.WriteString(fmt.Sprintf("%d: %v\n", i+1, node))
     57 	}
     58 
     59 	return buf.String()
     60 }