summaryrefslogtreecommitdiff
path: root/winot/winot-core/src/main/java/com
diff options
context:
space:
mode:
authorBen Culkin <scorpress@gmail.com>2023-11-08 19:16:08 -0500
committerBen Culkin <scorpress@gmail.com>2023-11-08 19:16:08 -0500
commit37da63640924937b90ea8c1a6a0c6e7318788ed5 (patch)
tree48fdab14e7034055bd6bf77498497d7778d16df0 /winot/winot-core/src/main/java/com
Initial commit
Diffstat (limited to 'winot/winot-core/src/main/java/com')
-rw-r--r--winot/winot-core/src/main/java/com/ashardalon/winot/core/TokenType.java32
-rw-r--r--winot/winot-core/src/main/java/com/ashardalon/winot/core/WinotApp.java57
-rw-r--r--winot/winot-core/src/main/java/com/ashardalon/winot/core/WinotContext.java5
-rw-r--r--winot/winot-core/src/main/java/com/ashardalon/winot/core/WinotMainMode.java67
-rw-r--r--winot/winot-core/src/main/java/com/ashardalon/winot/core/package-info.java6
5 files changed, 167 insertions, 0 deletions
diff --git a/winot/winot-core/src/main/java/com/ashardalon/winot/core/TokenType.java b/winot/winot-core/src/main/java/com/ashardalon/winot/core/TokenType.java
new file mode 100644
index 0000000..5387328
--- /dev/null
+++ b/winot/winot-core/src/main/java/com/ashardalon/winot/core/TokenType.java
@@ -0,0 +1,32 @@
+package com.ashardalon.winot.core;
+
+/**
+ * Represents the types of tokens
+ * @author bjcul
+ *
+ */
+public enum TokenType {
+ // Utility tokens. Don't represent actual language symbols
+ /**
+ * Terminal token. Represents end-of-input
+ */
+ TERMINAL,
+ /**
+ * Raw token. Hasn't been fully processed yet
+ */
+ RAW,
+ // Represent operators
+ /**
+ * 'def' special-object initiator
+ */
+ DEF,
+ // Represent literals of various types
+ /**
+ * Double-quoted string.
+ */
+ DQ_STR,
+ /**
+ * A literal token
+ */
+ LITERAL
+}
diff --git a/winot/winot-core/src/main/java/com/ashardalon/winot/core/WinotApp.java b/winot/winot-core/src/main/java/com/ashardalon/winot/core/WinotApp.java
new file mode 100644
index 0000000..019ce49
--- /dev/null
+++ b/winot/winot-core/src/main/java/com/ashardalon/winot/core/WinotApp.java
@@ -0,0 +1,57 @@
+package com.ashardalon.winot.core;
+
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+
+import bjc.data.*;
+import bjc.pratt.*;
+import bjc.pratt.commands.InitialCommand;
+import bjc.pratt.commands.impls.InitialCommands;
+import bjc.pratt.tokens.*;
+import bjc.utils.cli.StreamTerminal;
+import bjc.utils.parserutils.*;
+import bjc.utils.parserutils.splitter.*;
+
+/**
+ * Main class for Winot
+ *
+ * @author bjcul
+ */
+public class WinotApp {
+ /**
+ * Main method for Winot
+ *
+ * @param args Currently unused CLI args
+ */
+ public static void main(String[] args) {
+ ConfigurableTokenSplitter baseSplitter = new ConfigurableTokenSplitter(true);
+ baseSplitter.addMultiDelimiters(" ");
+ baseSplitter.compile();
+
+ ExcludingTokenSplitter exclSplitter = new ExcludingTokenSplitter(baseSplitter);
+
+ FilteredTokenSplitter filtSplitter = new FilteredTokenSplitter(exclSplitter, (tok) -> !tok.equals(""));
+
+ WinotContext state = new WinotContext();
+
+ PrattParser<TokenType, String, WinotContext> parser = new PrattParser<>();
+
+ parser.addInitialCommand(TokenType.LITERAL, InitialCommands.leaf());
+ parser.addInitialCommand(TokenType.DQ_STR, InitialCommands.leaf());
+ parser.addInitialCommand(TokenType.RAW, InitialCommands.fail());
+
+ // using 'var' because otherwise the type is some 40+ characters involving repeating the command type twice
+ // Also, have to specify args to 'branch' since the compiler can't guess them otherwise
+ var defBuilder = InitialCommands.<TokenType, String, WinotContext>branch();
+ InitialCommand<TokenType, String, WinotContext> defCommand = defBuilder.add(TokenType.DEF, null).build();
+ parser.addInitialCommand(TokenType.DEF, defCommand);
+
+ StreamTerminal terminal = new StreamTerminal(new InputStreamReader(System.in),
+ new OutputStreamWriter(System.out), "/", null);
+ IntHolder comNo = new IntHolder();
+ terminal.setMode(new WinotMainMode(terminal, comNo, parser, state, filtSplitter));
+
+ terminal.addOutput("0 > ");
+ terminal.run();
+ }
+}
diff --git a/winot/winot-core/src/main/java/com/ashardalon/winot/core/WinotContext.java b/winot/winot-core/src/main/java/com/ashardalon/winot/core/WinotContext.java
new file mode 100644
index 0000000..87cacdf
--- /dev/null
+++ b/winot/winot-core/src/main/java/com/ashardalon/winot/core/WinotContext.java
@@ -0,0 +1,5 @@
+package com.ashardalon.winot.core;
+
+public class WinotContext {
+
+}
diff --git a/winot/winot-core/src/main/java/com/ashardalon/winot/core/WinotMainMode.java b/winot/winot-core/src/main/java/com/ashardalon/winot/core/WinotMainMode.java
new file mode 100644
index 0000000..ce8b9ef
--- /dev/null
+++ b/winot/winot-core/src/main/java/com/ashardalon/winot/core/WinotMainMode.java
@@ -0,0 +1,67 @@
+package com.ashardalon.winot.core;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+import bjc.data.*;
+import bjc.pratt.PrattParser;
+import bjc.pratt.commands.CommandResult;
+import bjc.pratt.tokens.*;
+import bjc.utils.cli.StreamTerminal;
+import bjc.utils.parserutils.ParserException;
+import bjc.utils.parserutils.TokenUtils;
+import bjc.utils.parserutils.splitter.FilteredTokenSplitter;
+
+final class WinotMainMode implements Consumer<String> {
+ private final StreamTerminal terminal;
+ private final IntHolder comNo;
+ private final PrattParser<TokenType, String, WinotContext> parser;
+ private final WinotContext state;
+ private final FilteredTokenSplitter filtSplitter;
+
+ WinotMainMode(StreamTerminal terminal, IntHolder comNo, PrattParser<TokenType, String, WinotContext> parser,
+ WinotContext state, FilteredTokenSplitter filtSplitter) {
+ this.terminal = terminal;
+ this.comNo = comNo;
+ this.parser = parser;
+ this.state = state;
+ this.filtSplitter = filtSplitter;
+ }
+
+ @Override
+ public void accept(String str) {
+ List<String> rawTokens = TokenUtils.removeDQuotedStrings(str);
+ ValueToggle<TokenType> strToggle = new ValueToggle<>(TokenType.DQ_STR, TokenType.RAW);
+ Function<String, Token<TokenType, String>> tokenzer = (strang) -> {
+ return new SimpleToken<>(strToggle.get(), strang);
+ };
+ TransformIterator<String,
+ Token<TokenType, String>> rawItr = new TransformIterator<>(rawTokens.iterator(), tokenzer);
+ FlatMapIterator<Token<TokenType, String>,
+ Token<TokenType, String>> mapItr = new FlatMapIterator<>(rawItr, (tok) -> {
+ if (tok.getKey() == TokenType.RAW) {
+ Iterator<String> tknItr = filtSplitter.split(tok.getValue()).toIterable().iterator();
+ Function<String, Token<TokenType, String>> literizer = (tokn) -> {
+ return new SimpleToken<>(TokenType.LITERAL, tokn);
+ };
+ TransformIterator<String,
+ Token<TokenType, String>> transf = new TransformIterator<>(tknItr, literizer);
+ return transf;
+ }
+ return new SingleIterator<>(tok);
+ });
+ SimpleTokenStream<TokenType,
+ String> sts = new SimpleTokenStream<>(mapItr, new SimpleToken<>(TokenType.TERMINAL, ""));
+ try {
+ // Prime token stream
+ sts.next();
+ CommandResult<TokenType, String> result = parser.parseExpression(0, sts, state, true);
+ terminal.addOutput(result.toString() + "\n");
+ } catch (ParserException pex) {
+ terminal.addOutput(pex.toString() + "\n");
+ }
+ terminal.addOutput(String.format("%d > ", comNo.incr()));
+ }
+} \ No newline at end of file
diff --git a/winot/winot-core/src/main/java/com/ashardalon/winot/core/package-info.java b/winot/winot-core/src/main/java/com/ashardalon/winot/core/package-info.java
new file mode 100644
index 0000000..57f99a6
--- /dev/null
+++ b/winot/winot-core/src/main/java/com/ashardalon/winot/core/package-info.java
@@ -0,0 +1,6 @@
+/**
+ * Core for the Winot language
+ * @author bjcul
+ *
+ */
+package com.ashardalon.winot.core; \ No newline at end of file