diff options
Diffstat (limited to 'stack.go')
| -rw-r--r-- | stack.go | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/stack.go b/stack.go new file mode 100644 index 0000000..2ecc44d --- /dev/null +++ b/stack.go @@ -0,0 +1,38 @@ +package lexer + +type stackNode struct { + r rune + next *stackNode +} + +type stack struct { + start *stackNode +} + +func newStack() stack { + return stack{} +} + +func (s *stack) push(r rune) { + node := &stackNode{r: r} + if s.start == nil { + s.start = node + } else { + node.next = s.start + s.start = node + } +} + +func (s *stack) pop() rune { + if s.start == nil { + return EOFRune + } + + n := s.start + s.start = n.next + return n.r +} + +func (s *stack) clear() { + s.start = nil +} |
