diff options
| Commit | 26fa0559b0689a4647c38a2275c5880148248718 (patch) | |
|---|---|---|
| Author | 2025-11-01 18:13:33 +0200 | |
| Committer | 2025-11-01 18:13:33 +0200 | |
| Files | c6e3ad8bcb2a873607bc9d619f5cee22185f1765 | |
| cool-self-hosted-26fa0559b0689a4647c38a2275c5880148248718.tar cool-self-hosted-26fa0559b0689a4647c38a2275c5880148248718.tar.gz cool-self-hosted-26fa0559b0689a4647c38a2275c5880148248718.zip | ||
| Parent | beccf376ecbcc3819cc0d102b3635b6e5f39fa9e (diff) | |
feat(src/StringConsumer): Add higher order consumers, integer, binary operation and if keywords consumers HEAD main
Higher order consumers are called that way because they use other (base)
consumers in their logic. In a sense, the other consumers are parameters
to the higher order consumers.
14 files changed, 156 insertions, 5 deletions
| -rw-r--r-- | src/StringConsumer/BaseConsumers/BinaryOperatorConsumer.cl | 18 | ||||
| -rw-r--r-- | src/StringConsumer/BaseConsumers/IntegerConsumer.cl | 21 | ||||
| -rw-r--r-- | src/StringConsumer/BaseConsumers/KeywordsIfConsumer.cl | 15 | ||||
| -rw-r--r-- | src/StringConsumer/BaseConsumers/WhitespaceConsumer.cl (renamed from src/StringConsumer/WhitespaceConsumer.cl) | 0 | ||||
| -rw-r--r-- | src/StringConsumer/HigherOrderConsumers/ExpressionConsumer.cl | 19 | ||||
| -rw-r--r-- | src/StringConsumer/HigherOrderConsumers/IfConsumer.cl | 14 | ||||
| -rw-r--r-- | src/StringConsumer/IHigherOrderConsumer.cl | 11 | ||||
| -rw-r--r-- | src/StringConsumer/IWordConsumer.cl | 13 | ||||
| -rw-r--r-- | src/StringConsumer/IWordsConsumer.cl | 31 | ||||
| -rw-r--r-- | src/StringConsumer/StringConsumerEngine.cl | 2 | ||||
| -rw-r--r-- | src/Token/BinaryOperatorToken.cl | 5 | ||||
| -rw-r--r-- | src/Token/IntegerToken.cl | 5 | ||||
| -rw-r--r-- | src/Token/KeywordToken.cl | 5 | ||||
| -rw-r--r-- | src/main.cl | 2 |
diff --git a/src/StringConsumer/BaseConsumers/BinaryOperatorConsumer.cl b/src/StringConsumer/BaseConsumers/BinaryOperatorConsumer.cl new file mode 100644 index 0000000..8e7288c --- /dev/null +++ b/src/StringConsumer/BaseConsumers/BinaryOperatorConsumer.cl @@ -0,0 +1,18 @@ +class BinaryOperatorConsumer inherits IWordsConsumer { + init() : IStringConsumer {{ + matched_words <- matched_words + .push("+") + .push("-") + .push("*") + .push("/") + .push("<") + .push("<=") + .push("=") + ; + self; + }}; + + token() : IToken { + new BinaryOperatorToken + }; +}; diff --git a/src/StringConsumer/BaseConsumers/IntegerConsumer.cl b/src/StringConsumer/BaseConsumers/IntegerConsumer.cl new file mode 100644 index 0000000..5b4cd82 --- /dev/null +++ b/src/StringConsumer/BaseConsumers/IntegerConsumer.cl @@ -0,0 +1,21 @@ +class IntegerConsumer inherits IWordsConsumer { + init() : IStringConsumer {{ + matched_words <- matched_words + .push("0") + .push("1") + .push("2") + .push("3") + .push("4") + .push("5") + .push("6") + .push("7") + .push("8") + .push("9") + ; + self; + }}; + + token() : IToken { + new IntegerToken + }; +}; diff --git a/src/StringConsumer/BaseConsumers/KeywordsIfConsumer.cl b/src/StringConsumer/BaseConsumers/KeywordsIfConsumer.cl new file mode 100644 index 0000000..9bd76e9 --- /dev/null +++ b/src/StringConsumer/BaseConsumers/KeywordsIfConsumer.cl @@ -0,0 +1,15 @@ +class KeywordsIfConsumer inherits IWordsConsumer { + init() : IStringConsumer {{ + matched_words <- matched_words + .push("if") + .push("then") + .push("else") + .push("fi") + ; + self; + }}; + + token() : IToken { + new KeywordToken + }; +}; diff --git a/src/StringConsumer/WhitespaceConsumer.cl b/src/StringConsumer/BaseConsumers/WhitespaceConsumer.cl index 3a8c4dc..3a8c4dc 100644 --- a/src/StringConsumer/WhitespaceConsumer.cl +++ b/src/StringConsumer/BaseConsumers/WhitespaceConsumer.cl diff --git a/src/StringConsumer/HigherOrderConsumers/ExpressionConsumer.cl b/src/StringConsumer/HigherOrderConsumers/ExpressionConsumer.cl new file mode 100644 index 0000000..592611e --- /dev/null +++ b/src/StringConsumer/HigherOrderConsumers/ExpressionConsumer.cl @@ -0,0 +1,19 @@ +class ExpressionConsumer inherits IHigherOrderConsumer { + integerc: IStringConsumer <- (new IntegerConsumer).init(); + binaryopc: IStringConsumer <- (new BinaryOperatorConsumer).init(); + + consume(s: String) : Int {{ + consumed_length <- 0; + if did(integerc.consume(s)) + then + token <- integerc.token() + else if did(binaryopc.consume(s)) + then + token <- binaryopc.token() + else + void + fi + fi; + consumed_length; + }}; +}; diff --git a/src/StringConsumer/HigherOrderConsumers/IfConsumer.cl b/src/StringConsumer/HigherOrderConsumers/IfConsumer.cl new file mode 100644 index 0000000..431f79b --- /dev/null +++ b/src/StringConsumer/HigherOrderConsumers/IfConsumer.cl @@ -0,0 +1,14 @@ +class IfConsumer inherits IHigherOrderConsumer { + ifc: IStringConsumer <- (new KeywordsIfConsumer).init(); + + consume(s: String) : Int {{ + consumed_length <- 0; + if did(ifc.consume(s)) + then + token <- ifc.token() + else + void + fi; + consumed_length; + }}; +}; diff --git a/src/StringConsumer/IHigherOrderConsumer.cl b/src/StringConsumer/IHigherOrderConsumer.cl new file mode 100644 index 0000000..e7325d2 --- /dev/null +++ b/src/StringConsumer/IHigherOrderConsumer.cl @@ -0,0 +1,11 @@ +class IHigherOrderConsumer inherits IStringConsumer { + token: IToken; + + token() : IToken { + token + }; + + did(length: Int) : Bool { + 0 < (consumed_length <- consumed_length + length) + }; +}; diff --git a/src/StringConsumer/IWordConsumer.cl b/src/StringConsumer/IWordConsumer.cl new file mode 100644 index 0000000..a809cd2 --- /dev/null +++ b/src/StringConsumer/IWordConsumer.cl @@ -0,0 +1,13 @@ +class IWordConsumer inherits IStringConsumer { + word: String; + + consume(s: String) : Int {{ + consumed_length <- 0; + if s.substr(0, word.length()) = word + then + consumed_length <- word.length() + else + consumed_length + fi; + }}; +}; diff --git a/src/StringConsumer/IWordsConsumer.cl b/src/StringConsumer/IWordsConsumer.cl index 4c184bf..a1c22ba 100644 --- a/src/StringConsumer/IWordsConsumer.cl +++ b/src/StringConsumer/IWordsConsumer.cl @@ -37,16 +37,37 @@ class WordList inherits System { any_starts(s: String, start: Int) : Int { if or(word = "", s.length() <= start) - then 0 + then + 0 + else if and(s.length() < start + word.length(), not isvoid next) + then + next.any_starts(s, start) else if s.substr(start, word.length()) = word - then word.length() + then + word.length() else if isvoid next - then 0 - else next.any_starts(s, start) + then + 0 + else + next.any_starts(s, start) + fi fi fi fi }; + + empty() : Bool { + if not (word = "") + then + false + else if isvoid next + then + true + else + next.empty() + fi + fi + }; }; class IWordsConsumer inherits IStringConsumer { @@ -56,6 +77,8 @@ class IWordsConsumer inherits IStringConsumer { let word_length: Int <- 0 in { + assert(not matched_words.empty(), "consume", "object of class hasn't been initialised!"); + consumed_length <- 0; while 0 < (word_length <- matched_words.any_starts(s, consumed_length)) loop diff --git a/src/StringConsumer/StringConsumerEngine.cl b/src/StringConsumer/StringConsumerEngine.cl index 6f07d2e..4f4f65f 100644 --- a/src/StringConsumer/StringConsumerEngine.cl +++ b/src/StringConsumer/StringConsumerEngine.cl @@ -1,6 +1,8 @@ class StringConsumerEngine inherits System { consumers: ConsumerList <- (new ConsumerList) .push((new WhitespaceConsumer).init()) + .push((new ExpressionConsumer).init()) + .push((new IfConsumer).init()) ; str: String; diff --git a/src/Token/BinaryOperatorToken.cl b/src/Token/BinaryOperatorToken.cl new file mode 100644 index 0000000..edf9d31 --- /dev/null +++ b/src/Token/BinaryOperatorToken.cl @@ -0,0 +1,5 @@ +class BinaryOperatorToken inherits IToken { + name() : String { + "BINARY_OP" + }; +}; diff --git a/src/Token/IntegerToken.cl b/src/Token/IntegerToken.cl new file mode 100644 index 0000000..52128c8 --- /dev/null +++ b/src/Token/IntegerToken.cl @@ -0,0 +1,5 @@ +class IntegerToken inherits IToken { + name() : String { + "INTEGER" + }; +}; diff --git a/src/Token/KeywordToken.cl b/src/Token/KeywordToken.cl new file mode 100644 index 0000000..966fcec --- /dev/null +++ b/src/Token/KeywordToken.cl @@ -0,0 +1,5 @@ +class KeywordToken inherits IToken { + name() : String { + "KEYWORD" + }; +}; diff --git a/src/main.cl b/src/main.cl index 3b839a9..4f98f7d 100644 --- a/src/main.cl +++ b/src/main.cl @@ -2,7 +2,7 @@ class Main inherits System { sce: StringConsumerEngine <- new StringConsumerEngine; main() : Object {{ - sce.init(" "); + sce.init(" 92824 + 59 if then else fi"); while not sce.empty() loop assert(sce.try_consume(), "main", "couldn't consume entire input!") |
