Kategorier: Alle - 分析

af zhcosin mind 12 år siden

812

abacus

计算器程序需要处理复杂的数学表达式,为此需将输入的字符串表达式解析成计算机能理解的形式。首先,需要进行词法分析,将字符串中的各个数学元素分解出来,包括括号、运算符和运算数等。接着,根据运算符的优先级和所需的运算数进行递归计算,将表达式逐步化简。为了便于计算机处理,表达式还需转换为运算符前置的规范形式,这样可以统一处理不同类型的运算符,包括二元和一元运算符、函数运算符等。

abacus

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)