2016-09-05 43 views
2

目前正在开发一个小型的宠物项目,数学解析器/词法分析器,并最终为求解/学习而求解。我已经制定了一个基本的原型,现在正在将其转换为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!

+0

我应该添加 - 上面的代码片段纯粹是为了演示问题。 –

回答

1

基本型e.g ISNUMERIC,isFunction,isVariable或可替代的直下型=== TokenFactory.NUMERIC等等......这对我来说,感觉错

都能跟得上。这是相当习惯的,因为类型控制着那里的功能。

例如,您将看到TypeScript checker.ts散布在.kindSyntaxKind)上,其位于TypeScript AST节点鉴别器处。

另外,您可能需要考虑添加例如递归的访问者。

function visit(item){ 

if (item.addition) { 
    return visit(item.left) + visit(item.right) 
} 

if (item.literal) { 
    return literal.value(); 
} 

// ETC. 
} 
+0

感谢您的反馈,我会看看checker.ts,我现在可以回到编码:) –