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

最新文章

  1. hbuilder的使用
  2. Predicate接口和Consumer接口
  3. Architecture Pattern: Publish-subscribe Pattern
  4. Spring之@Configuration配置解析
  5. 创建安卓app的30个经验教训
  6. server 2008 ftp 环境重点说明
  7. C语言-cout&lt;&lt;&quot;123&quot;&lt;&lt;&quot;45&quot;&lt;&lt;endl;
  8. Memcached 使用与简单监测
  9. iOS 10 / Swift 3.0 / XCode 8 总结
  10. 线段树 或者 并查集 Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) C
  11. Codevs 5590 A+B 问题 超级版
  12. 【JS中循环嵌套常见的六大经典例题+六大图形题,你知道哪几个?】
  13. iOS 类似朋友圈的图片浏览器SDPhotoBrowser
  14. BZOJ 4513: [Sdoi2016]储能表 [数位DP !]
  15. Python List 删除元素
  16. Python 3 教程
  17. 20175311 2018-2019-2 《Java程序设计》第7周学习总结
  18. 用eclipse创建动态web项目手动生成web.xml方法
  19. Kickstart Practice Round 2017---A
  20. JavaScript中Object值合并方法

热门文章

  1. 在Oracle 11.2.0.1.0下dbms_stats.gather_table_stats收集直方图不准
  2. 【JavaScript】DAG(有向无环图),以及相关的JS库
  3. 元素的数据存储-jQuery.data()与.data()
  4. FastIV图像处理
  5. qt linux软件打包等
  6. iOS工程中的info.plist文件的完整研究
  7. [LeetCode] Add Two Numbers(stored in List)
  8. 【VBA编程】03.判断输入年份是否是闰年
  9. 自制MVC框架CRUD操作、列表、分页显示插件介绍
  10. Editplus 文件中批量搜索字符串的技巧