aboutsummaryrefslogtreecommitdiff
path: root/stack.go
diff options
context:
space:
mode:
authorFelix Hanley <felix@userspace.com.au>2018-11-20 11:51:08 +0000
committerFelix Hanley <felix@userspace.com.au>2018-11-20 11:51:08 +0000
commitb36cae1e6b724ad75c98a6b69a6235686d910633 (patch)
treea717a47e36a9cd8aec9fad7b9b04a205e7f9065b /stack.go
downloadlexer-b36cae1e6b724ad75c98a6b69a6235686d910633.tar.gz
lexer-b36cae1e6b724ad75c98a6b69a6235686d910633.tar.bz2
Split lexer from parent project
Diffstat (limited to 'stack.go')
-rw-r--r--stack.go38
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
+}