abacus

词法分析:从字符串的表达式中分割数学元素

待分析表达式:1-2*(sin(pi/3))^2

运算数:字符串体("1"),数值(1)

运算符:字符串体("-"),优先级(1),所需运算数个数(2),计算函数(减法)

运算数:字符串体("2"),数值(2)

运算符:字符串体("*"),优先级(2),所需运算数个数(2),计算函数(乘法)

括号:字符串体("("),类型(左)

运算符:字符串体("sin"),优先级(100),所需运算数个数(1),计算函数(正弦)

括号:字符串体("("),类型(左)

运算数:字符串体("pi"),数值(3.1415926535)

运算符:字符串体("/"),优先级(2),所需运算数个数(2),计算函数(除法)

括号:字符串体(")"),类型(右)

括号:字符串体(")"),类型(右)

运算符:字符串体("^"),优先级(3),所需运算数个数(2),计算函数(乘方)

运算数:字符串体("2"),数值(2)

设计特色:把普通运算符与函数运算符统一处理

递归计算

(- 1 (* 2 (^ (sin (/ pi 3)) 2)))

Step1: (- 1 (* 2 (^ (sin 1.047197551) 2)))

Step2: (- 1 (* 2 (^ 0.8660256282 2)))

Step3: (- 1 (* 2 0.7500010327))

Step4: (- 1 1.500002065)

Step5: -0.500002065

ok. :-)

任务:以字符串形式输入表达式,计算其值

关键:如何解释字符串的数学意义

语法分析:把表达式转换为运算符前置的规范形式

为何要转换为运算符前置的规范形式

传统的数学表达式不合理

二元运算符置于两个运算数之间,这对非二元运算符不适用

一元运算符负号位于运算数之前,而阶乘位于运算数之后

函数运算符采用了另一种不同的形式:opt(x1,x2,.....)

计算机需要一种规范的结构来描述数学表达式

把数学表达式转换为运算数前置的规范形式

转换前:(3-2)*8

转换后:(* (- 3 2) 8)

转换前:1-2*(sin(pi/3))^2

转换后:(- 1 (* 2 (^ (sin (/ pi 3)) 2)))