TypeScript Visitor設計模式

如下翻譯腦殼的VBF項目,試試看TypeScript可否重寫。 class RegExpr {
    Accept<T>(convert: Converter<T>) {
    }
}
 
class SymbolExpr extends RegExpr {
    Symbol: string
    constructor(symbol: string) {
        this.Symbol = symbol;
        super();
    }
    Accept<T>(convert: Converter<T>) {
        return convert.AcceptSymbolExpr(this);
    }
}
class KleeneStarExpr extends RegExpr {
    InnerExpression: RegExpr
    Accept<T>(convert: Converter<T>) {
        return convert.AcceptKleeneStarExpr(this);
    }
}
class AlternationExpr extends RegExpr {
    Expr1: RegExpr
    Expr2: RegExpr
    Accept<T>(convert: Converter<T>) {
        return convert.AcceptAlternationExpr(this);
    }
}
class ConcatenationExpr extends RegExpr {
    Left: RegExpr
    Right: RegExpr
    Accept<T>(convert: Converter<T>) {
        return convert.AcceptConcatenationExpr(this);
    }
}
class EmptyExpr extends RegExpr {
    Accept<T>(convert: Converter<T>) {
        return convert.AcceptEmpty(this);
    }
}
 
interface Converter<T> {
    AcceptEmpty(expr: RegExpr): T;
    AcceptSymbolExpr(expr: SymbolExpr): T;
    AcceptKleeneStarExpr(expr: KleeneStarExpr): T;
    AcceptAlternationExpr(expr: AlternationExpr): T;
    AcceptConcatenationExpr(expr: ConcatenationExpr): T;
}
class RegularExprPrettyPrint implements Converter<String> {
 
    AcceptEmpty(expr: EmptyExpr) {
        return "ε";
    }
    AcceptSymbolExpr(expr: SymbolExpr) {
        return expr.Symbol;
    }
    AcceptKleeneStarExpr(expr: KleeneStarExpr) {
        return "(" + expr.InnerExpression.Accept(this) + ")*";
    }
    AcceptAlternationExpr(expr: AlternationExpr) {
        return "(" + expr.Expr1.Accept(this) + "|" + expr.Expr2.Accept(this) + ")";
    }
    AcceptConcatenationExpr(expr: ConcatenationExpr) {
        return "(" + expr.Left.Accept(this) + expr.Right.Accept(this) + ")";
    }
}
 
 
window.onload = () => {
    var s = new SymbolExpr("A");
    var kstart = new KleeneStarExpr();
    kstart.InnerExpression = s;
    var formatter = new RegularExprPrettyPrint();
    var str = kstart.Accept(formatter)
    alert(str);
};
相關文章
相關標籤/搜索