From 2c8817aa698313ccf7f84bb659c0551a7d161a92 Mon Sep 17 00:00:00 2001 From: ctsk <9384305+ctsk@users.noreply.github.com> Date: Mon, 2 Sep 2024 16:14:27 +0200 Subject: [PATCH] [tlox] Implement TruffleLanguage class --- .../main/java/xyz/ctsk/lox/LoxLanguage.java | 26 +++++++++++++++++++ .../tlox/src/main/java/xyz/ctsk/lox/Main.java | 13 +++++----- .../main/resources/xyz/ctsk/lox/parser/Lox.g4 | 20 ++++++++++---- 3 files changed, 47 insertions(+), 12 deletions(-) create mode 100644 jlox/tlox/src/main/java/xyz/ctsk/lox/LoxLanguage.java diff --git a/jlox/tlox/src/main/java/xyz/ctsk/lox/LoxLanguage.java b/jlox/tlox/src/main/java/xyz/ctsk/lox/LoxLanguage.java new file mode 100644 index 0000000..a25f388 --- /dev/null +++ b/jlox/tlox/src/main/java/xyz/ctsk/lox/LoxLanguage.java @@ -0,0 +1,26 @@ +package xyz.ctsk.lox; + +import com.oracle.truffle.api.CallTarget; +import com.oracle.truffle.api.TruffleLanguage; +import xyz.ctsk.lox.nodes.LoxExpressionNode; +import xyz.ctsk.lox.nodes.LoxNode; +import xyz.ctsk.lox.nodes.LoxRootNode; +import xyz.ctsk.lox.parser.LoxParser; + +@TruffleLanguage.Registration(id = LoxLanguage.ID, name = LoxLanguage.NAME) +public class LoxLanguage extends TruffleLanguage { + public static final String ID = "lox"; + public static final String NAME = "Lox"; + + @Override + protected CallTarget parse(ParsingRequest request) throws Exception { + LoxNode node = LoxParser.parseLox(request.getSource().getReader()); + var rootNode = new LoxRootNode((LoxExpressionNode) node); + return rootNode.getCallTarget(); + } + + @Override + protected Void createContext(Env env) { + return null; + } +} diff --git a/jlox/tlox/src/main/java/xyz/ctsk/lox/Main.java b/jlox/tlox/src/main/java/xyz/ctsk/lox/Main.java index 34cb2da..792769a 100644 --- a/jlox/tlox/src/main/java/xyz/ctsk/lox/Main.java +++ b/jlox/tlox/src/main/java/xyz/ctsk/lox/Main.java @@ -1,5 +1,6 @@ package xyz.ctsk.lox; +import xyz.ctsk.lox.nodes.LoxExpressionNode; import xyz.ctsk.lox.nodes.LoxRootNode; import xyz.ctsk.lox.parser.LoxParser; @@ -22,13 +23,11 @@ public class Main { } public static void run(String program) { - var parsed = LoxParser.parseLox(program); - - if (parsed instanceof LoxParser.ExpressionContext expr) { - var root = new LoxRootNode(expr.result); - var callTarget = root.getCallTarget(); - System.out.println(callTarget.call()); - } + var parsed = (LoxExpressionNode) LoxParser.parseLox(program); + if (parsed == null) return; + var root = new LoxRootNode(parsed); + var callTarget = root.getCallTarget(); + System.out.println(callTarget.call()); } public static void main(String[] args) throws IOException { diff --git a/jlox/tlox/src/main/resources/xyz/ctsk/lox/parser/Lox.g4 b/jlox/tlox/src/main/resources/xyz/ctsk/lox/parser/Lox.g4 index a98c4c8..b893615 100644 --- a/jlox/tlox/src/main/resources/xyz/ctsk/lox/parser/Lox.g4 +++ b/jlox/tlox/src/main/resources/xyz/ctsk/lox/parser/Lox.g4 @@ -5,21 +5,31 @@ grammar Lox; import com.oracle.truffle.api.source.Source; +import xyz.ctsk.lox.nodes.LoxNode; import xyz.ctsk.lox.nodes.LoxExpressionNode; import xyz.ctsk.lox.parser.*; +import java.io.IOException; +import java.io.Reader; + } @parser::members { private LoxNodeFactory factory; - public static Object parseLox(String source) { - LoxLexer lexer = new LoxLexer(CharStreams.fromString(source)); + public static LoxNode parseLox(String source) { + return parseLox(CharStreams.fromString(source)); + } + + public static LoxNode parseLox(Reader reader) throws IOException { + return parseLox(CharStreams.fromReader(reader)); + } + + public static LoxNode parseLox(CharStream inputStream) { + LoxLexer lexer = new LoxLexer(inputStream); LoxParser parser = new LoxParser(new CommonTokenStream(lexer)); - parser.factory = new LoxNodeFactory(); - - return parser.expression(); + return parser.file().expression().result; } }