Ich versuche einen Interpreter für eine Untermenge von Pascal zu schreiben und stehe vor einer Design Entscheidung - bisher habe ich einen Lexer und einen Parser geschrieben. Der Parser erzeugt den abstrakten Syntaxbaum (AST) und nun fehlt noch der tatsächliche Interpreter, der den Baum "auswertet". Das Problem ist: die verschiedenen Kinder im AST bedürfen unterschiedlicher Auswertungen. So habe ich z.B. eine Klasse BinOp, wo der rechte und linke Kindsknoten gemäß der binären operation verknüpft werden (nebenbei muss auch geprüft werden, von was für einem typ die beiden Kindsknoten sind). Im folgenden habe ich ein paar der Klassen angehängt um hoffentlich die Probleme zu verdeutlichen.
[CODE lang="java" title="BinOp Klasse"]package com.Parser;
import com.Lexer.Token;
import com.Visitor.*;
public class BinaryOp extends AST {
public AST left;
public AST right;
public Token operation;
public BinaryOp(AST left, AST right, Token op) {
this.left = left;
this.right = right;
operation = op;
}
@Override
public AST visit(Visitor visitor) {
// add something smart here.
return null;
}
@Override
public void print(){
left.print();
System.out.println("Binary operation of type : " + operation.type);
right.print();
}
@Override
public Object gettype() {
return operation.type;
}
}
[/CODE]
[CODE lang="java" title="AST Klasse"]package com.Parser;
import com.Visitor.Visitor;
public abstract class AST {
abstract AST visit(Visitor visitor);
abstract void print();
abstract Object gettype();
}[/CODE]
[CODE lang="java" title="BinOp Klasse"]package com.Parser;
import com.Lexer.Token;
import com.Visitor.*;
public class BinaryOp extends AST {
public AST left;
public AST right;
public Token operation;
public BinaryOp(AST left, AST right, Token op) {
this.left = left;
this.right = right;
operation = op;
}
@Override
public AST visit(Visitor visitor) {
// add something smart here.
return null;
}
@Override
public void print(){
left.print();
System.out.println("Binary operation of type : " + operation.type);
right.print();
}
@Override
public Object gettype() {
return operation.type;
}
}
[/CODE]
[CODE lang="java" title="AST Klasse"]package com.Parser;
import com.Visitor.Visitor;
public abstract class AST {
abstract AST visit(Visitor visitor);
abstract void print();
abstract Object gettype();
}[/CODE]