【发布时间】:2016-09-05 21:38:49
【问题描述】:
目前正在从事一个小型宠物项目,一个数学解析器/词法分析器,并最终用于娱乐/学习的求解器。我已经搞定了一个基本原型,现在正在寻找将其转换为 TypeScript 以进行清理。有兴趣的可以在这里https://github.com/chips5k/math-solver-prototype找到原型。
我正在尝试提出一种基于干净界面的方法来处理我的令牌。我怀疑我看错了,但希望有人能提供有用的建议。
在我的 TS 设计中,我有几个接口,基本接口是 Token,NumericToken 和 FunctionToken 扩展了这些接口。然后我有几个实现这些接口的类,例如:AdditionToken、VariableToken、NumberToken、PiToken、SineToken 等......
我的问题是,为了使用这些接口,我最终需要检查基本类型的方法,例如 isNumeric、isFunction、isVariable 或直接类型 === TokenFactory.NUMERIC 等......这对我来说,感觉不对,因为它基本上使使用界面无效。我怀疑我可以采用更好/更清洁的多态方法,但不幸的是我没有想法,无法找到关于我在做什么的信息。
在尝试解决一系列令牌时出现问题的示例:
if(t.isFunction()) {
var a = stack.unshift();
var b = stack.unshift();
if(a.isNumeric() && b.isNumeric()){
result.push(tokenFactory.create(t.evaluate<number>(a.evaluate<number>, b.evaluate<number>));
} else {
//return to stack and move on, e.g can't solve x + 1 directly
}
} else {
stack.push(t);
}
基本上是在寻找被认为是处理此类场景的理想方法,我怀疑它可能是设计的替代方法。
TIA!
【问题讨论】:
-
我应该补充一下 - 上面的代码 sn-p 纯粹是为了演示问题。
标签: oop parsing typescript lexer