[tlox] Implement TruffleLanguage class
This commit is contained in:
26
jlox/tlox/src/main/java/xyz/ctsk/lox/LoxLanguage.java
Normal file
26
jlox/tlox/src/main/java/xyz/ctsk/lox/LoxLanguage.java
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user