自制编程语言CXScript(一) 总括

来源:互联网 发布:中山大学网络服务中心 编辑:程序博客网 时间:2024/06/06 08:29

​在山(chen)重(mi)水(zhao)复(huan)疑(shi)无(xia)路(gu)即将断稿的时候,脑子一抽,想到可以分享点干货。

 

哦,放错图了。


 

嗯,今天的干货内容就分享——如何实现一款自定义的编程语言,顺便还能复习一下好多之前的内容。

 

这里不是要开发一款颠覆世界、改变思维的编程语言,而是为了做一款比较“小学生”的编程语言。

 

比如我希望能这么描述计算菜价:

 

 菜价 = 10

买菜数量 = 20

总价 =菜价*买菜数量

输出总价

 

还有判断语句可以去掉括号,做一些简单的判断运算:

 

如果总价 > 100

        输出 “不买了……太贵了”

其他情况下

        输出 “买了”+总价+“元”。

结束判断

 

嗯……基本上就这两个功能。

 

可能你会说:循环怎么办?

 

好吧,就再加个目标:

 

 

重复 i < 10

i=i+1

        输出 “目前是第” + i + “次”

结束重复

 

如果你接触过vb的话,总体上就跟VB有点像。

 

如果你没接触过任何编程语言……却发现你看得懂上面的程序,那恭喜你,你非常有学习编程语言的天赋。

 

其实……编程嘛,不就是为了把生活里做的事给一步步描述出来么?

 

所以,简化编程语言一直是编程界的趋势。比如从C语言到C#,就弱化了许多概念;从Java到Kotlin成为安卓的官方开发语言……你会发现它们的描述方式、编码风格越来越接近人类思维,也越来越容易。

 

咱们没法造一款上天入地轰烈一时的编程语言,就写一款简单得不能再简单(无法支持复杂语句)的吧。

 

好了,自此以下,就是程序猿才看得懂的内容了。

 

以下无指定情况下,以C#作为开发语言。

 

首先就是要实现简单的赋值语句:

 

a = 1

b = a + 2

a = 0

 

这里不要带入Swift的编程想法,这里的令(或者let)不是为了描述常量,而是为了接近语义:用于操作变量。

 

为了引入“变量”这个概念,需要用字典来存变量名和对应的值。为了简单起见,我们只实现整数的字典(也就是说,这个程序从始至终只有……int变量):

Dictionary<string,int> g_variables;

 

出现赋值语句的时候,只需要取出对应的符号,然后判断符号是数字,还是变量(规定以字母开头),然后取值即可。当右边的式子计算完毕之后,再把值放到左边对应的位置上。

比如:

 令 b = a+1

将会经历如下的过程:

 

这个过程为了字典总能取到值,默认没操作的变量都为0,比如你现在去要c,字典应该放一个c,并且告诉你c=0。

 

这个计算中最需要注意的可能就是:四则运算的实现了。

 

比如遇到 a = 1+ 2 * 3

 

是不能像上图一样逐一计算的,所以需要用到两个栈来读入符号和值,在栈内符号优先级较高的情况下,取出符号进行计算。具体的可以参看网上的四则运算计算。

 

我在实现的时候是没考虑支持括号的,所以每次遇到新符号优先级低的时候,只取出一次计算,这样栈内的符号在最后是可以从右往左计算的。

 

比如 

a = 1+2*3*4+5

 

在基于上面的规则下,会分别先计算2*3=6,6*4=24,然后由于栈的特性,将最后从右往左算出5+24+1。

 

在四则运算能正确计算之后,同理也可以用来判断如果里面的条件。

 

比如刚刚写出了:

 

如果  a > 20*10

 

显然左右式都可以进行一次计算,获得对应的值,然后进行比较。

 

看,一下子你就实现了两个语句……

 

不过细节还是有很多考究的点的。下次再根据实际的代码谈谈吧。

 

总而言之,目前我们就支持三种语句:顺序、循环、分支。而我们即将开始的,却是……变量操作。但是变量操作一旦能顺利完成,对于分支或者循环而言,将是事半功倍的。

 

 

原创粉丝点击