TypeScript Visitor设计模式
2024-09-03 04:31:23
以下翻译脑袋的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);
};
最新文章
- hbuilder的使用
- Predicate接口和Consumer接口
- Architecture Pattern: Publish-subscribe Pattern
- Spring之@Configuration配置解析
- 创建安卓app的30个经验教训
- server 2008 ftp 环境重点说明
- C语言-cout<;<;";123";<;<;";45";<;<;endl;
- Memcached 使用与简单监测
- iOS 10 / Swift 3.0 / XCode 8 总结
- 线段树 或者 并查集 Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) C
- Codevs 5590 A+B 问题 超级版
- 【JS中循环嵌套常见的六大经典例题+六大图形题,你知道哪几个?】
- iOS 类似朋友圈的图片浏览器SDPhotoBrowser
- BZOJ 4513: [Sdoi2016]储能表 [数位DP !]
- Python List 删除元素
- Python 3 教程
- 20175311 2018-2019-2 《Java程序设计》第7周学习总结
- 用eclipse创建动态web项目手动生成web.xml方法
- Kickstart Practice Round 2017---A
- JavaScript中Object值合并方法
热门文章
- 在Oracle 11.2.0.1.0下dbms_stats.gather_table_stats收集直方图不准
- 【JavaScript】DAG(有向无环图),以及相关的JS库
- 元素的数据存储-jQuery.data()与.data()
- FastIV图像处理
- qt linux软件打包等
- iOS工程中的info.plist文件的完整研究
- [LeetCode] Add Two Numbers(stored in List)
- 【VBA编程】03.判断输入年份是否是闰年
- 自制MVC框架CRUD操作、列表、分页显示插件介绍
- Editplus 文件中批量搜索字符串的技巧