| 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() |
| } |