diff options
Diffstat (limited to 'winot/winot-core/src/main')
6 files changed, 177 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 diff --git a/winot/winot-core/src/main/java/module-info.java b/winot/winot-core/src/main/java/module-info.java new file mode 100644 index 0000000..96194a7 --- /dev/null +++ b/winot/winot-core/src/main/java/module-info.java @@ -0,0 +1,10 @@ +/** + * Core module for the Winot language + * @author bjcul + * + */ +module com.ashardalon.winot.core { + requires bjc.utils; + requires jpratt; + requires esodata; +}
\ No newline at end of file |
