moodlee 发表于 2016-3-8 21:56

【原创源码】C#编写一款自己的脚本语言.第六章

本帖最后由 moodlee 于 2016-3-8 22:00 编辑

第六章 幽兰
她的“可以”,驻在脑海,回旋起伏,恰若天籁。
她送我的一句轻言,却让我感到生命的厚重。
——————————
“1+2-3/4*5”与“1+2-3+4 ”不同在于:
“+-”与“/*”的优先级不同。
枯燥的东西,我就不放在这里了,请转看沙发。(你可以拿出草稿纸模拟一下哦~)
——————————
隐逸的秋菊,富贵的牡丹,君子般的莲,而我却最爱那空谷幽兰。


_____________________________________________________________

这是一个系列的《原创源码》。
有可能单个章节无法看出《源码》二字。但这一系列的章节是为了最后的源码而做铺垫。
最后的源码是开花结果,它是需要枝叶的。
或许其他人面对《原创源码》的态度是,直接贴上代码,而不管代码的形成过程,
而我不同,我注重这个形成过程。
所以,请版主尊重我的选择,不要随意改成《笔记》。
(我已将第五章改回,谢谢。)
—————————————————————————————————————


moodlee 发表于 2016-3-8 21:57

*****以下为枯燥地段,慎入*****
“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”就可以得出结果,相信对你来说会很简单!*****

所以,如果有多个优先级别的话,我们可以先执行优先级别较高的运算,再依次计算。

Cizel 发表于 2016-3-9 00:26

moodlee 发表于 2016-3-8 21:57
*****以下为枯燥地段,慎入*****
“1+2-3/4*5 ”的解析方法:
首先,我们定义这几个变量:


下次记得自己加上,不加我就直接删除了
【编程语言区】本版发帖标题格式=前缀+标题,不按照格式直接删除
http://www.52pojie.cn/thread-457450-1-1.html

我是人民币 发表于 2016-3-8 22:03

{:17_1061:}没细看楼主都写的啥,反正表达式求值转为后缀表达式后用栈来求值~
over

moodlee 发表于 2016-3-8 22:04

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:11

支持技术大神,感谢无私奉献的楼主!

moodlee 发表于 2016-3-8 22:11

我是人民币 发表于 2016-3-8 22:03
没细看楼主都写的啥,反正表达式求值转为后缀表达式后用栈来求值~
over

百度百科了一下,谢谢你提出“后缀表达式”这个想法。
恩,暴露了我的无知{:1_1:}

思念灬给了谁 发表于 2016-3-8 22:14

萌新前来学习,感谢楼主分享{:301_974:}

moodlee 发表于 2016-3-8 22:15

上一章有一个朋友提到:
“逆波兰式”,百度一下,了解了,是一个很好的方法!(及后缀表达式)谢谢。

还有一个朋友提到“树的先序排列”,百度百科也未明白,准备购买专业书籍看一下,谢谢。

我是人民币 发表于 2016-3-8 22:17

moodlee 发表于 2016-3-8 22:15
上一章有一个朋友提到:
“逆波兰式”,百度一下,了解了,是一个很好的方法!(及后缀表达式)谢谢。



应该是树的中序遍历求值吧
页: [1] 2
查看完整版本: 【原创源码】C#编写一款自己的脚本语言.第六章