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/StringConsumerEngine.cl | 36 ++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/StringConsumer/StringConsumerEngine.cl (limited to 'src/StringConsumer/StringConsumerEngine.cl') 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) + }; +}; -- cgit v1.3.1-23-gd82d