Summary Files Commits Branches @commit @diff @stats
path: root / src / StringConsumer / ConsumerList.cl
diff options
context:
space:
mode:
Commitb43c94ca62a747f2f9fb222cdf887c041dd544bb (patch)
Author
 Syndamia <kamen@syndamia.com>
2025-11-01 16:28:08 +0200
Committer
 Syndamia <kamen@syndamia.com>
2025-11-01 16:28:08 +0200
Files43e0ea846844257cf46055e68cc2661056b05965 /src/StringConsumer/ConsumerList.cl
cool-self-hosted-b43c94ca62a747f2f9fb222cdf887c041dd544bb.tar
cool-self-hosted-b43c94ca62a747f2f9fb222cdf887c041dd544bb.tar.gz
cool-self-hosted-b43c94ca62a747f2f9fb222cdf887c041dd544bb.zip
Parent0830615386f036acc55a72b2548efb65526c761f (diff)
feat!: Add basic lexer components
1 files changed, 52 insertions, 0 deletions
-rw-r--r--src/StringConsumer/ConsumerList.cl52
diff --git a/src/StringConsumer/ConsumerList.cl b/src/StringConsumer/ConsumerList.cl
new file mode 100644
index 0000000..526996c
--- /dev/null
+++ b/src/StringConsumer/ConsumerList.cl
@@ -0,0 +1,52 @@
+class ConsumerList inherits System {
+ item: IStringConsumer;
+ next: ConsumerList;
+
+ init(value: IStringConsumer, tail: Object) : ConsumerList {{
+ assert(not (isvoid value), "init", "value argument cannot be void!");
+ assert(isvoid item, "init", "List has already been initialised!");
+
+ item <- value;
+ if isvoid tail then
+ void
+ else
+ case tail of
+ cl: ConsumerList => next <- cl;
+ o: Object => assert(false, "init", "tail argument can be either a ConsumerList or void!");
+ esac
+ fi;
+
+ self;
+ }};
+
+ push(value: IStringConsumer) : ConsumerList {{
+ assert(not (isvoid value), "push", "value argument cannot be void!");
+
+ if isvoid item
+ then
+ item <- value
+ else if isvoid next
+ then
+ next <- (new ConsumerList).init(value, void)
+ else
+ next.push(value)
+ fi
+ fi;
+ self;
+ }};
+
+ find(s: String) : Object {{
+ assert(not (isvoid item), "find", "list isn't initialised!");
+
+ if 0 < item.consume(s)
+ then
+ item
+ else if isvoid next
+ then
+ void
+ else
+ next.find(s)
+ fi
+ fi;
+ }};
+};