[tlox] Add string and boolean literals

This commit is contained in:
ctsk
2022-09-14 22:55:19 +02:00
parent b400c6b4ef
commit 94ffb5370b
5 changed files with 49 additions and 1 deletions

View File

@@ -1,6 +1,5 @@
package xyz.ctsk.lox; package xyz.ctsk.lox;
import com.oracle.truffle.api.Truffle;
import xyz.ctsk.lox.nodes.LoxRootNode; import xyz.ctsk.lox.nodes.LoxRootNode;
import xyz.ctsk.lox.parser.LoxParser; import xyz.ctsk.lox.parser.LoxParser;

View File

@@ -0,0 +1,17 @@
package xyz.ctsk.lox.nodes.expr;
import com.oracle.truffle.api.frame.VirtualFrame;
import xyz.ctsk.lox.nodes.LoxExpressionNode;
public class LoxBooleanLiteralNode extends LoxExpressionNode {
private final boolean value;
public LoxBooleanLiteralNode(boolean value) {
this.value = value;
}
@Override
public Object executeGeneric(VirtualFrame frame) {
return value;
}
}

View File

@@ -0,0 +1,18 @@
package xyz.ctsk.lox.nodes.expr;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.strings.TruffleString;
import xyz.ctsk.lox.nodes.LoxExpressionNode;
public class LoxStringLiteralNode extends LoxExpressionNode {
private final TruffleString value;
public LoxStringLiteralNode(TruffleString value) {
this.value = value;
}
@Override
public Object executeGeneric(VirtualFrame frame) {
return value;
}
}

View File

@@ -1,5 +1,6 @@
package xyz.ctsk.lox.parser; package xyz.ctsk.lox.parser;
import com.oracle.truffle.api.strings.TruffleString;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
import xyz.ctsk.lox.LoxException; import xyz.ctsk.lox.LoxException;
import xyz.ctsk.lox.nodes.LoxExpressionNode; import xyz.ctsk.lox.nodes.LoxExpressionNode;
@@ -11,6 +12,16 @@ public class LoxNodeFactory {
return new LoxNumberLiteralNode(value); return new LoxNumberLiteralNode(value);
} }
public static LoxStringLiteralNode createStringLiteral(Token literalToken) {
var value = TruffleString.fromJavaStringUncached(literalToken.getText(), TruffleString.Encoding.UTF_16);
return new LoxStringLiteralNode(value);
}
public static LoxBooleanLiteralNode createBooleanLiteral(Token literalToken) {
var value = Boolean.parseBoolean(literalToken.getText());
return new LoxBooleanLiteralNode(value);
}
public static LoxExpressionNode createUnary(Token op, LoxExpressionNode value) { public static LoxExpressionNode createUnary(Token op, LoxExpressionNode value) {
return switch (op.getText()) { return switch (op.getText()) {
case "-" -> LoxNegNodeGen.create(value); case "-" -> LoxNegNodeGen.create(value);

View File

@@ -45,6 +45,9 @@ expression returns [LoxExpressionNode result]
literal returns [LoxExpressionNode result] literal returns [LoxExpressionNode result]
: NUMBER { $result = factory.createNumberLiteral($NUMBER); } : NUMBER { $result = factory.createNumberLiteral($NUMBER); }
| STRING { $result = factory.createStringLiteral($STRING); }
| TRUE { $result = factory.createBooleanLiteral($TRUE); }
| FALSE { $result = factory.createBooleanLiteral($FALSE); }
; ;
AND: 'and' ; AND: 'and' ;