如何将读入的CString转换成函数?

时间:2023-01-27 13:02:38
界面上一个文本框让用户输入函数,如x*x+2

可是在计算时如何知道这是一个函数,而不是一个字符串

6 个解决方案

#1


需要对该字符串进行语义解析,如定义操作优先级和操作算法等

#2


参见mfc的动态类型网的实现方法
准确说叫伪动态类型网

#3


当然是表达式分析呀。

#4


例如表达式:x+y*(z-2)+w
符号按照优先级入栈,操作数按照顺序入栈。
开始时:
数栈:x
符号栈:+

当分析到y时,如果y后面的符号优先级不大于当前栈顶符号,即“+”,则进行运算;
否则继续入符号栈:由于*优先级大,所以入栈:
数栈:x,y
符号栈:+,*

然后遇到括号,继续入栈:
数栈:x,y,
符号栈:+,*,(

随后z和“-”入栈:
数栈:x,y,z
符号栈:+,*,(,-

2入栈:
数栈:x,y,z,2
符号栈:+,*,(,-

遇到“)”,退栈,计算z-2赋给次栈顶元素:
数栈:x,y,z'
符号栈:+,*,(

符号栈退栈:
数栈:x,y,z'
符号栈:+,*

“*”比z'后面的“+”优先级高,再次退栈:
数栈:x,y'
符号栈:+

同理,“+”比y'后面的“+”优先级高,再次退栈:
数栈:x'
符号栈:

继续分析输入串,“+”和w入栈:
数栈:x',w
符号栈:+

结束,不断退栈:
数栈:x''
得到结果。

#5


补充:当分析到变量时,到符号表中查找数值。

#6


语义分析,呵呵。。。
参考编译原理吧。

#1


需要对该字符串进行语义解析,如定义操作优先级和操作算法等

#2


参见mfc的动态类型网的实现方法
准确说叫伪动态类型网

#3


当然是表达式分析呀。

#4


例如表达式:x+y*(z-2)+w
符号按照优先级入栈,操作数按照顺序入栈。
开始时:
数栈:x
符号栈:+

当分析到y时,如果y后面的符号优先级不大于当前栈顶符号,即“+”,则进行运算;
否则继续入符号栈:由于*优先级大,所以入栈:
数栈:x,y
符号栈:+,*

然后遇到括号,继续入栈:
数栈:x,y,
符号栈:+,*,(

随后z和“-”入栈:
数栈:x,y,z
符号栈:+,*,(,-

2入栈:
数栈:x,y,z,2
符号栈:+,*,(,-

遇到“)”,退栈,计算z-2赋给次栈顶元素:
数栈:x,y,z'
符号栈:+,*,(

符号栈退栈:
数栈:x,y,z'
符号栈:+,*

“*”比z'后面的“+”优先级高,再次退栈:
数栈:x,y'
符号栈:+

同理,“+”比y'后面的“+”优先级高,再次退栈:
数栈:x'
符号栈:

继续分析输入串,“+”和w入栈:
数栈:x',w
符号栈:+

结束,不断退栈:
数栈:x''
得到结果。

#5


补充:当分析到变量时,到符号表中查找数值。

#6


语义分析,呵呵。。。
参考编译原理吧。