lox/jlox/src/com/lox/AstPrinter.java

103 lines
2.6 KiB
Java

package com.lox;
// import com.
class AstPrinter implements Expr.Visitor<String> {
String print(Expr expr) {
return expr.accept(this);
}
@Override
public String visitSuperExpr(Expr.Super expr){
return "TODO";
}
@Override
public String visitSetExpr(Expr.Set expr){
return "TODO";
}
@Override
public String visitGetExpr(Expr.Get expr) {
return "TODO";
}
@Override
public String visitThisExpr(Expr.This expr) {
return "TODO";
}
@Override
public String visitCallExpr(Expr.Call expr){
return "TODO";
}
@Override
public String visitLogicalExpr(Expr.Logical expr){
//throw exception
return "TODO";
}
@Override
public String visitVariableExpr(Expr.Variable expr){
if(expr.name.literal == null){
return expr.name.lexeme;
}
return parenthesize(
"variable"
,new Expr.Literal(expr.name.lexeme)
,new Expr.Literal(expr.name.literal));
}
@Override
public String visitAssignExpr(Expr.Assign assign){
return parenthesize("set!"
,new Expr.Literal(assign.name.lexeme)
,assign.value);
}
@Override
public String visitBinaryExpr(Expr.Binary expr) {
return parenthesize(expr.operator.lexeme,
expr.left, expr.right);
}
@Override
public String visitGroupingExpr(Expr.Grouping expr) {
return parenthesize("group", expr.expression);
}
@Override
public String visitLiteralExpr(Expr.Literal expr) {
if (expr.value == null) return "nil";
return expr.value.toString();
}
@Override
public String visitUnaryExpr(Expr.Unary expr) {
return parenthesize(expr.operator.lexeme, expr.right);
}
private String parenthesize(String name, Expr... exprs) {
StringBuilder builder = new StringBuilder();
builder.append("(").append(name);
for (Expr expr : exprs) {
builder.append(" ");
builder.append(expr.accept(this));
}
builder.append(")");
return builder.toString();
}
public static void main(String[] args) {
Expr expression = new Expr.Binary(
new Expr.Unary(
new Token(TokenType.MINUS, "-", null, 1),
new Expr.Literal(123)),
new Token(TokenType.STAR, "*", null, 1),
new Expr.Grouping(
new Expr.Literal(45.67)));
Token varToken = new Token(TokenType.IDENTIFIER,"drink","tea",0);
Expr varExpr = new Expr.Variable(varToken);
Expr assignExpr = new Expr.Assign(
varToken
,new Expr.Literal("\"cola\"")
);
System.out.println(new AstPrinter().print(expression));
System.out.println(new AstPrinter().print(varExpr));
System.out.println(new AstPrinter().print(assignExpr));
}
}