以下翻译脑袋的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); };
时间: 2024-10-13 16:27:25