summaryrefslogtreecommitdiff
path: root/JPratt/src/main/java/com/ashardalon/pratt/tokens/StringTokenStream.java
diff options
context:
space:
mode:
authorBenjamin Culkin <scorpress@gmail.com>2024-06-03 17:33:53 -0400
committerBenjamin Culkin <scorpress@gmail.com>2024-06-03 17:33:53 -0400
commit15a2b29e48f134bc93cfd0a3d8512001e9242f3d (patch)
treeb3f5c4c5f0e474479cd47ad0ac0f35770fc44881 /JPratt/src/main/java/com/ashardalon/pratt/tokens/StringTokenStream.java
parent39ba97edf49270715ec61bedb7d4a62ada819ba0 (diff)
Rename package to new domainHEADtrunk
Rename the package to the new domain
Diffstat (limited to 'JPratt/src/main/java/com/ashardalon/pratt/tokens/StringTokenStream.java')
-rw-r--r--JPratt/src/main/java/com/ashardalon/pratt/tokens/StringTokenStream.java84
1 files changed, 84 insertions, 0 deletions
diff --git a/JPratt/src/main/java/com/ashardalon/pratt/tokens/StringTokenStream.java b/JPratt/src/main/java/com/ashardalon/pratt/tokens/StringTokenStream.java
new file mode 100644
index 0000000..fb25016
--- /dev/null
+++ b/JPratt/src/main/java/com/ashardalon/pratt/tokens/StringTokenStream.java
@@ -0,0 +1,84 @@
+package com.ashardalon.pratt.tokens;
+
+import static com.ashardalon.pratt.tokens.StringToken.litToken;
+
+import java.util.Iterator;
+
+import bjc.data.MarkListIterator;
+
+/**
+ * Simple implementation of token stream for strings.
+ *
+ * The terminal token here is represented by a token with type and value
+ * '(end)'.
+ *
+ * @author EVE
+ *
+ */
+public class StringTokenStream extends TokenStream<String, String> {
+ private final MarkListIterator<Token<String, String>> iter;
+
+ private Token<String, String> curr;
+
+ /**
+ * Create a new token stream from a iterator.
+ *
+ * @param itr
+ * The iterator to use.
+ *
+ */
+ public StringTokenStream(final Iterator<Token<String, String>> itr) {
+ iter = new MarkListIterator<>(itr);
+ }
+
+ @Override
+ public Token<String, String> current() {
+ // Prime stream if necessary
+ if (curr == null)
+ return next();
+ return curr;
+ }
+
+ @Override
+ public Token<String, String> next() {
+ if(iter.hasNext()) {
+ curr = iter.next();
+ } else {
+ curr = litToken("(end)");
+ }
+
+ return curr;
+ }
+
+ @Override
+ public boolean hasNext() {
+ return iter.hasNext();
+ }
+
+ @Override
+ public void mark() {
+ iter.mark();
+ }
+
+ @Override
+ public void commit() {
+ iter.commit();
+
+ if (!iter.hasMark()) {
+ // No marks outstanding; we can release the previous state
+ iter.reset();
+ }
+ }
+
+ @Override
+ public void rollback() {
+ iter.rollback();
+
+ curr = iter.current();
+ }
+
+ @Override
+ public boolean hasMark() {
+ return iter.hasMark();
+ }
+}