diff options
| author | Felix Hanley <felix@userspace.com.au> | 2018-11-20 11:51:08 +0000 |
|---|---|---|
| committer | Felix Hanley <felix@userspace.com.au> | 2018-11-20 11:51:08 +0000 |
| commit | b36cae1e6b724ad75c98a6b69a6235686d910633 (patch) | |
| tree | a717a47e36a9cd8aec9fad7b9b04a205e7f9065b /stack.go | |
| download | lexer-b36cae1e6b724ad75c98a6b69a6235686d910633.tar.gz lexer-b36cae1e6b724ad75c98a6b69a6235686d910633.tar.bz2 | |
Split lexer from parent project
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 +} |
