自制编程语言CXScript(二) 实现赋值语句和四则运算
1.语句扫描
上次说到自定义语言的思路,现在让我们实现一下大概的框架:首先需要的就是判别不同的语句,而后才能做进一步的计算。
由于“精心”的设计,语句都有着特定的开头。比如:
如果玉米价格 = 20 ←这就是判断语句
令总价=玉米价格*玉米条数 ←这就是赋值语句
这里为了行文方便,暂用if 和 let作为关键字:
显然,用字符串的startsWith()可以很快速地识别语句类型但是无法完全地判断语句写得对不对。
比如会有人这么写
如果玉米价格 ←写到一半就结束了
所以,还是需要在快速检测后构造对应的正则表达式进行匹配,如果模式匹配对了,就执行对应的操作。
比如对于赋值语句,需要:
左边的是变量单词;
右边的是式子,可以是一个单词,或者一个数字,或者是一个四则运算。
对应的正则就可以构造成这样的形式:
"^"[email protected]"+(\w+) *= *(.+)"
为了实现可自定义关键字,这里代入的是let的字符变量,目前应该是这样的:
@"^if+(\w+) *= *(.+)"
之所以后面的符号没有做进一步的定义而是任意字符,则是……好吧编不下去了,就是构造起来太复杂了。这个留到真正计算时再去判别错误所在点。
2.表达式处理
扫描语句之后,就是捕获对应的值,然后代入计算:
计算时,需要利用栈以记录之前的操作符号到哪了,还需要一个值的栈。计算过程是:拿到符号时,与之前的符号做比较,如果之前的符号优先级高,就意味着可以把之前的符号先做计算。否则的话就要继续保持符号记录,因为后面可能会有优先级更高的操作符。
比如a+b*c,程序一开始看到的一定是a+b,但是后面可能有优先级更高的符号,所以将记录而不进行运算。具体的就跟数据结构的算法差不多。
这里的EvalExprsInStack就执行了上述的过程。
3.扫描符号
上述的表达式计算只支持:
a+b+7*6这样的形式,自然是不行的,所以还需要能支持符号对应的扫描,比如会有以下的形式的表达式:
a1+anotherNum+8
所以需要有对应的扫描函数,每次能扫出一段单词/数字并予以状态描述。而且,还需要防止不符合规则的表达符号:
a1++a2**a3
所以还需要有之前的状态记录,在扫描单词的时候有一定的判断过程。另外……还有可能遇到多个的空格,也需要对应的状态识别,对应的过程描述如下:
4.运行结果
我知道不晒晒程序图,肯定没人相信代码能运行出来,所以写个计算菜价的程序结果:
再来一个有加法和乘法运算的:
好了,操作运算的基本就到这里了。细节深究起来就可以写一篇论文了。
现在在实际操作的时候发现bug还是有的(比如该死的空格还是会导致运算出错),还有if部分则遇到了不小的问题……不说了,默默去修(wan)代(you)码(xi)了。
_______________________________________________
最后只想说一句****的编辑器是真心不好用。。。粘贴图片后发布出来就是个空白,得重新编辑一次。