JavaScript实现高级科学计算器库

本文介绍了使用JavaScript实现高级科学计算器的方法,包括处理左递归、简化文法分析、错误处理、运算符优先级和作用域理解。通过将按钮直接映射为Token,利用JS的Number()函数转换数字,以及利用数组作为栈进行运算。讨论了错误处理策略,如每次输入Token后立即解析求值。还探讨了使用return和throw控制流,以及返回多个值的技巧。最后,提出了将求值逻辑改进为编译器思路的挑战,涉及临时变量的管理和序列化。
摘要由CSDN通过智能技术生成

代码不贴了,主要讲解一下思路。

   //BNF定义:
   //exprN代表优先级>=N的算符表达式
   expr := expr20
   expr100 := value //数值常量优先级最高,当然也可以把expr100合并到expr80,这样可以少写一个parseExpr100解析子函数
   expr80  :=  ( expr ) | expr100 //其次是括号表达式
   expr60  :=  sin expr60 | cos expr60 | ln expr60 | log expr60 | sqrt expr60 | ... | expr80 //其次是一元函数, 一元取负暂不考虑
   expr50  := expr60 x^y expr50 | expr60 //二元函数的优先级高于乘除运算,低于一元函数,不加括号的情况下,二元函数从右往左运算;
   expr40  :=  expr50 '*' expr50 | expr50 '/' expr50  | expr50 //接下来是二元乘除运算
      ==> expr50 | expr50 ( '*' expr40 )* | expr50 ( '/' expr40)*
   expr20  := expr20 + expr40 | expr20 - expr40  | expr40 //接下来是二元加减运算
      ==> expr40 | expr40 ('+' expr40)* | expr40 ('-' expr40)* 
      //注意,减法运算不满足交换律,右边的被减数优先级必须至少是乘和除
   //糟糕的问题:expr40、expr20正常的写法会导致左递归,需要改写

function AdvancedCalculator(){
   //语法分析的原始输入流:
   this.tokens = [];//中缀带括号的, 3种语法分析输入单位:类型为String的(和)、类型为Number的value、类型为Object/String的运算符
   this.tokens_scan_index = 0;
   this.saved_tokens_scan_index_stack = [];    
   this.value_buffer = [];
}
Advance
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值