【问题标题】:Math Parser/Lexer - Token interface designMath Parser/Lexer - 令牌界面设计
【发布时间】: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


【解决方案1】:

基本类型,例如 isNumeric、isFunction、isVariable 或直接类型 === TokenFactory.NUMERIC 等...这对我来说感觉不对

不。这是相当惯用的,因为类型控制那里的功能。

例如,您将看到 TypeScript checker.ts 到处都是对位于 TypeScript AST 节点鉴别器的 .kind (SyntaxKind) 的检查。

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

function visit(item){

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

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

// ETC.
}

【讨论】:

  • 感谢您的反馈,我会看看 checker.ts,我现在可以回去编码了 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多