以下翻译脑袋的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);
};