当前位置: 首页 > news >正文

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); };

转载于:https://www.cnblogs.com/jiangzhen/p/4467851.html

相关文章:

  • 构造方法、this关键字的另一种用法
  • 模板 计算1的个数
  • 京北机房 怀来云交换数据中心主机托管
  • 排列组合
  • 结巴分词
  • perf4j使用
  • hdfs使用操作命令
  • node.js的npm详解
  • 求一个n!中尾数有多少个零
  • 扫描之家:RFID技术可以应用在哪些方面?
  • 设置myeclipse自动生成的author等注释
  • equals和==的区别
  • go 安装下载
  • web和APP测试区别
  • 作为一个it码农一天不学习你会不会觉得心里不安
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • [Vue CLI 3] 配置解析之 css.extract
  • 【前端学习】-粗谈选择器
  • 10个最佳ES6特性 ES7与ES8的特性
  • 2017 年终总结 —— 在路上
  • Angular数据绑定机制
  • conda常用的命令
  • hadoop集群管理系统搭建规划说明
  • input实现文字超出省略号功能
  • java第三方包学习之lombok
  • Meteor的表单提交:Form
  • oschina
  • php的插入排序,通过双层for循环
  • python 装饰器(一)
  • spring学习第二天
  • windows-nginx-https-本地配置
  • 翻译--Thinking in React
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 让你的分享飞起来——极光推出社会化分享组件
  • 如何进阶一名有竞争力的程序员?
  • 如何在 Tornado 中实现 Middleware
  • 阿里云API、SDK和CLI应用实践方案
  • 交换综合实验一
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #预处理和函数的对比以及条件编译
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (C语言)二分查找 超详细
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (vue)页面文件上传获取:action地址
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (十八)三元表达式和列表解析
  • (四) Graphivz 颜色选择
  • (四)linux文件内容查看
  • (四)模仿学习-完成后台管理页面查询
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world