自制编程语言CXScript(二) 实现赋值语句和四则运算

​1.语句扫描

上次说到自定义语言的思路,现在让我们实现一下大概的框架:首先需要的就是判别不同的语句,而后才能做进一步的计算。

 

由于“精心”的设计,语句都有着特定的开头。比如:

 

如果玉米价格 = 20                     ←这就是判断语句

总价=玉米价格*玉米条数      ←这就是赋值语句

 

这里为了行文方便,暂用if 和 let作为关键字:

 自制编程语言CXScript(二) 实现赋值语句和四则运算自制编程语言CXScript(二) 实现赋值语句和四则运算

 

显然,用字符串的startsWith()可以很快速地识别语句类型但是无法完全地判断语句写得对不对。

 

比如会有人这么写

 

如果玉米价格                            ←写到一半就结束了

 

所以,还是需要在快速检测后构造对应的正则表达式进行匹配,如果模式匹配对了,就执行对应的操作。

 

比如对于赋值语句,需要:

 

左边的是变量单词;

 

右边的是式子,可以是一个单词,或者一个数字,或者是一个四则运算。

 

对应的正则就可以构造成这样的形式:

 

"^"[email protected]"+(\w+) *= *(.+)"

 

为了实现可自定义关键字,这里代入的是let的字符变量,目前应该是这样的:

 

@"^if+(\w+) *= *(.+)"

 

之所以后面的符号没有做进一步的定义而是任意字符,则是……好吧编不下去了,就是构造起来太复杂了。这个留到真正计算时再去判别错误所在点。

 

 

2.表达式处理

 

 

扫描语句之后,就是捕获对应的值,然后代入计算:

 自制编程语言CXScript(二) 实现赋值语句和四则运算自制编程语言CXScript(二) 实现赋值语句和四则运算

 

计算时,需要利用栈以记录之前的操作符号到哪了,还需要一个值的栈。计算过程是:拿到符号时,与之前的符号做比较,如果之前的符号优先级高,就意味着可以把之前的符号先做计算。否则的话就要继续保持符号记录,因为后面可能会有优先级更高的操作符。

 

比如a+b*c,程序一开始看到的一定是a+b,但是后面可能有优先级更高的符号,所以将记录而不进行运算。具体的就跟数据结构的算法差不多。

 

自制编程语言CXScript(二) 实现赋值语句和四则运算

 自制编程语言CXScript(二) 实现赋值语句和四则运算

这里的EvalExprsInStack就执行了上述的过程。

 

 

 

3.扫描符号

 

 

上述的表达式计算只支持:

 

a+b+7*6这样的形式,自然是不行的,所以还需要能支持符号对应的扫描,比如会有以下的形式的表达式:

 

a1+anotherNum+8

 

所以需要有对应的扫描函数,每次能扫出一段单词/数字并予以状态描述。而且,还需要防止不符合规则的表达符号:

 

a1++a2**a3

 

所以还需要有之前的状态记录,在扫描单词的时候有一定的判断过程。另外……还有可能遇到多个的空格,也需要对应的状态识别,对应的过程描述如下:

 自制编程语言CXScript(二) 实现赋值语句和四则运算

自制编程语言CXScript(二) 实现赋值语句和四则运算

 

 

 

 

 

4.运行结果

 

 

我知道不晒晒程序图,肯定没人相信代码能运行出来,所以写个计算菜价的程序结果:

 自制编程语言CXScript(二) 实现赋值语句和四则运算

 自制编程语言CXScript(二) 实现赋值语句和四则运算

再来一个有加法和乘法运算的:

 自制编程语言CXScript(二) 实现赋值语句和四则运算自制编程语言CXScript(二) 实现赋值语句和四则运算

好了,操作运算的基本就到这里了。细节深究起来就可以写一篇论文了。

 

现在在实际操作的时候发现bug还是有的(比如该死的空格还是会导致运算出错),还有if部分则遇到了不小的问题……不说了,默默去修(wan)代(you)码(xi)了。

 

 

 

 _______________________________________________

最后只想说一句****的编辑器是真心不好用。。。粘贴图片后发布出来就是个空白,得重新编辑一次。