abacus
语法分析:把表达式转换为运算符前置的规范形式
把数学表达式转换为运算数前置的规范形式
转换前:1-2*(sin(pi/3))^2
转换后:(- 1 (* 2 (^ (sin (/ pi 3)) 2)))
转换前:(3-2)*8
转换后:(* (- 3 2) 8)
为何要转换为运算符前置的规范形式
计算机需要一种规范的结构来描述数学表达式
传统的数学表达式不合理
函数运算符采用了另一种不同的形式:opt(x1,x2,.....)
一元运算符负号位于运算数之前,而阶乘位于运算数之后
二元运算符置于两个运算数之间,这对非二元运算符不适用
关键:如何解释字符串的数学意义
任务:以字符串形式输入表达式,计算其值
递归计算
(- 1 (* 2 (^ (sin (/ pi 3)) 2)))
ok. :-)
Step5: -0.500002065
Step4: (- 1 1.500002065)
Step3: (- 1 (* 2 0.7500010327))
Step2: (- 1 (* 2 (^ 0.8660256282 2)))
Step1: (- 1 (* 2 (^ (sin 1.047197551) 2)))
词法分析:从字符串的表达式中分割数学元素
设计特色:把普通运算符与函数运算符统一处理
待分析表达式:1-2*(sin(pi/3))^2
运算符:字符串体("^"),优先级(3),所需运算数个数(2),计算函数(乘方)
括号:字符串体(")"),类型(右)
运算符:字符串体("/"),优先级(2),所需运算数个数(2),计算函数(除法)
运算数:字符串体("pi"),数值(3.1415926535)
运算符:字符串体("sin"),优先级(100),所需运算数个数(1),计算函数(正弦)
括号:字符串体("("),类型(左)
运算符:字符串体("*"),优先级(2),所需运算数个数(2),计算函数(乘法)
运算数:字符串体("2"),数值(2)
运算符:字符串体("-"),优先级(1),所需运算数个数(2),计算函数(减法)
运算数:字符串体("1"),数值(1)