zoukankan      html  css  js  c++  java
  • 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); };
  • 相关阅读:
    MongoDB笔记: 安装和常见问题
    Spring Boot方式的Dubbo项目
    Centos7安装Redis5.0.5并加入Systemd服务
    生成Nginx服务器SSL证书和客户端证书
    OpenSSL的证书, 私钥和签名请求(CSRs)
    迁移Git项目到Gitlab
    Ubuntu18.04 Server安装Nginx+Git服务和独立的svn服务
    ESXi6.5上的Ubuntu虚机在远程SSH时宕机
    Nginx访问路径添加密码保护
    从阿里云DATAV GeoAtlas接口抽取行政区划数据
  • 原文地址:https://www.cnblogs.com/jiangzhen/p/4467851.html
Copyright © 2011-2022 走看看