aboutsummaryrefslogtreecommitdiff
path: root/stack.go
diff options
context:
space:
mode:
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
+}