[tlox] Implement TruffleLanguage class

This commit is contained in:
ctsk
2024-09-02 16:14:27 +02:00
parent a62fdeb8e4
commit 2c8817aa69
3 changed files with 47 additions and 12 deletions

View File

@@ -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<Void> {
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;
}
}

View File

@@ -1,5 +1,6 @@
package xyz.ctsk.lox; package xyz.ctsk.lox;
import xyz.ctsk.lox.nodes.LoxExpressionNode;
import xyz.ctsk.lox.nodes.LoxRootNode; import xyz.ctsk.lox.nodes.LoxRootNode;
import xyz.ctsk.lox.parser.LoxParser; import xyz.ctsk.lox.parser.LoxParser;
@@ -22,13 +23,11 @@ public class Main {
} }
public static void run(String program) { public static void run(String program) {
var parsed = LoxParser.parseLox(program); var parsed = (LoxExpressionNode) LoxParser.parseLox(program);
if (parsed == null) return;
if (parsed instanceof LoxParser.ExpressionContext expr) { var root = new LoxRootNode(parsed);
var root = new LoxRootNode(expr.result); var callTarget = root.getCallTarget();
var callTarget = root.getCallTarget(); System.out.println(callTarget.call());
System.out.println(callTarget.call());
}
} }
public static void main(String[] args) throws IOException { public static void main(String[] args) throws IOException {

View File

@@ -5,21 +5,31 @@ grammar Lox;
import com.oracle.truffle.api.source.Source; import com.oracle.truffle.api.source.Source;
import xyz.ctsk.lox.nodes.LoxNode;
import xyz.ctsk.lox.nodes.LoxExpressionNode; import xyz.ctsk.lox.nodes.LoxExpressionNode;
import xyz.ctsk.lox.parser.*; import xyz.ctsk.lox.parser.*;
import java.io.IOException;
import java.io.Reader;
} }
@parser::members { @parser::members {
private LoxNodeFactory factory; private LoxNodeFactory factory;
public static Object parseLox(String source) { public static LoxNode parseLox(String source) {
LoxLexer lexer = new LoxLexer(CharStreams.fromString(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)); LoxParser parser = new LoxParser(new CommonTokenStream(lexer));
parser.factory = new LoxNodeFactory(); parser.factory = new LoxNodeFactory();
return parser.file().expression().result;
return parser.expression();
} }
} }