Summary Files Commits Branches @commit @diff @stats
path: root / src / StringConsumer / StringConsumerEngine.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/StringConsumerEngine.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, 36 insertions, 0 deletions
-rw-r--r--src/StringConsumer/StringConsumerEngine.cl36
diff --git a/src/StringConsumer/StringConsumerEngine.cl b/src/StringConsumer/StringConsumerEngine.cl
new file mode 100644
index 0000000..dc7e202
--- /dev/null
+++ b/src/StringConsumer/StringConsumerEngine.cl
@@ -0,0 +1,36 @@
+class StringConsumerEngine inherits System {
+ consumers: ConsumerList <- (new ConsumerList)
+ .push(new WhitespaceConsumer)
+ ;
+
+ str: String;
+
+ init(code: String) : Object {{
+ assert(not (code = ""), "init", "input code cannot be empty!");
+ assert(str = "", "init", "already initialised!");
+
+ str <- code;
+ }};
+
+ try_consume() : Bool {
+ let
+ consumer: Object <- consumers.find(str)
+ in
+ if isvoid consumer
+ then
+ false
+ else
+ case consumers.find(str) of
+ c: IStringConsumer => {
+ str <- str.substr(c.consumed_length(), str.length() - c.consumed_length());
+ true;
+ };
+ o: Object => false;
+ esac
+ fi
+ };
+
+ out() : Object {
+ out_string(str)
+ };
+};