【原创源码】C#编写一款自己的脚本语言.第六章
本帖最后由 moodlee 于 2016-3-8 22:00 编辑第六章 幽兰
她的“可以”,驻在脑海,回旋起伏,恰若天籁。
她送我的一句轻言,却让我感到生命的厚重。
——————————
“1+2-3/4*5”与“1+2-3+4 ”不同在于:
“+-”与“/*”的优先级不同。
枯燥的东西,我就不放在这里了,请转看沙发。(你可以拿出草稿纸模拟一下哦~)
——————————
隐逸的秋菊,富贵的牡丹,君子般的莲,而我却最爱那空谷幽兰。
_____________________________________________________________
这是一个系列的《原创源码》。
有可能单个章节无法看出《源码》二字。但这一系列的章节是为了最后的源码而做铺垫。
最后的源码是开花结果,它是需要枝叶的。
或许其他人面对《原创源码》的态度是,直接贴上代码,而不管代码的形成过程,
而我不同,我注重这个形成过程。
所以,请版主尊重我的选择,不要随意改成《笔记》。
(我已将第五章改回,谢谢。)
—————————————————————————————————————
*****以下为枯燥地段,慎入*****
“1+2-3/4*5 ”的解析方法:
首先,我们定义这几个变量:
1、左变量=空
2、右变量=空
3、运算开关=假
4、非执行代码=空
5、当前运算符号=空
***注释:
“-+”优先级为0
“*/”优先级为1
***第一个字符“1”
判断为数值符号,判断【运算开关】为假,将“1”添加至【左变量】
*此时,1=“1”,2=空,3=假,4=空,5=空
***第二个字符“+”
判断为运算符号,判断优先级为0,将【左变量】添加至【非执行代码】,将【左变量】清空,将“+”添加至【非执行代码】
*此时,1=空,2=空,3=假,4=“1+”,5=空
***第三个字符“2”
判断为数值符号,判断【运算开关】为假,将“2”添加至【左变量】
*此时,1=“2”,2=空,3=假,4=“1+”,5=空
***第四个字符“-”
判断为运算符号,判断优先级为0,将【左变量】添加至【非执行代码】,将【左变量】清空,将“-”添加至【非执行代码】
*此时,1=空,2=空,3=假,4=“1+2-”,5=空
***第五个字符“3”
判断为数值符号,判断【运算开关】为假,将“3”添加至【左变量】
*此时,1=“3”,2=空,3=假,4=“1+2-”,5=空
***第六个字符“/”
判断为运算符号,判断优先级为1,判断【运算开关】为假,设置【运算开关】为真,设置【当前运算符号】为“/”
*此时,1=“3”,2=空,3=真,4=“1+2-”,5=“/”
***第七个字符“4”
判断为数值符号,判断【运算开关为】为真,将“4”添加至【右变量】
*此时,1=“3”,2=“4”,3=真,4=“1+2-”,5=“/”
***第八个字符 "*"
判断为运算符号,判断优先级为1,判断【运算开关】为真,根据【当前运算符号】为“/”执行函数Divided(【左变量】,【右变量】),返回数值0.75,将【左变量】清空,将“0.75”添加到【左变量】,将【右变量】清空,设置【运算开关】为真,设置【当前运算符号】为“*”
*此时,1=“0.75”,2=空,3=真,4=“1+2-”,5=“*”
***第九个字符 “5”
判断为数值符号,判断【运算开关】为真,将“5”添加到【右变量】
*此时,1=“0.75”,2=“5”,3=真,4=“1+2-”,5=“*”
***结束时
根据【当前运算符号】为“*”执行函数Multiply(【左变量】,【右变量】),返回数值“3.75”,将“3.75”添加至【非执行代码】,返回【非执行代码】为“1+2-3.75”
*****只要在执行一下“1+2-3.75”就可以得出结果,相信对你来说会很简单!*****
所以,如果有多个优先级别的话,我们可以先执行优先级别较高的运算,再依次计算。
moodlee 发表于 2016-3-8 21:57
*****以下为枯燥地段,慎入*****
“1+2-3/4*5 ”的解析方法:
首先,我们定义这几个变量:
下次记得自己加上,不加我就直接删除了
【编程语言区】本版发帖标题格式=前缀+标题,不按照格式直接删除
http://www.52pojie.cn/thread-457450-1-1.html
{:17_1061:}没细看楼主都写的啥,反正表达式求值转为后缀表达式后用栈来求值~
over private string Divided (string X,string Y)
{
double lx=double.parse(X);
double ly=double.parse(Y);
return (lx/ly).ToString();
}
//相信Multiply你也知道怎么写了 支持技术大神,感谢无私奉献的楼主! 我是人民币 发表于 2016-3-8 22:03
没细看楼主都写的啥,反正表达式求值转为后缀表达式后用栈来求值~
over
百度百科了一下,谢谢你提出“后缀表达式”这个想法。
恩,暴露了我的无知{:1_1:} 萌新前来学习,感谢楼主分享{:301_974:} 上一章有一个朋友提到:
“逆波兰式”,百度一下,了解了,是一个很好的方法!(及后缀表达式)谢谢。
还有一个朋友提到“树的先序排列”,百度百科也未明白,准备购买专业书籍看一下,谢谢。 moodlee 发表于 2016-3-8 22:15
上一章有一个朋友提到:
“逆波兰式”,百度一下,了解了,是一个很好的方法!(及后缀表达式)谢谢。
应该是树的中序遍历求值吧
页:
[1]
2