From b43c94ca62a747f2f9fb222cdf887c041dd544bb Mon Sep 17 00:00:00 2001 From: Syndamia Date: Sat, 1 Nov 2025 16:28:08 +0200 Subject: feat!: Add basic lexer components --- src/StringConsumer/ConsumerList.cl | 52 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/StringConsumer/ConsumerList.cl (limited to 'src/StringConsumer/ConsumerList.cl') 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; + }}; +}; -- cgit v1.3.1-23-gd82d