可是在计算时如何知道这是一个函数,而不是一个字符串
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''
得到结果。
符号按照优先级入栈,操作数按照顺序入栈。
开始时:
数栈: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''
得到结果。
符号按照优先级入栈,操作数按照顺序入栈。
开始时:
数栈: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
语义分析,呵呵。。。
参考编译原理吧。
参考编译原理吧。