毕业设计真是件麻烦事,没啥好的想法,不知道写啥。就根据自己的喜好实现了一个脚本解释器(语法类似于 js)

2017-03-17 14:35:47 +08:00
 zccrs

这个项目是我去年做毕业设计时写的,毕业之后就没有再坚持下去,但是一直对这方面挺感兴趣的,想在业务时间把这个项目继续下去,不知道大家有没有什么好的想法能让这个项目更有意义,求指教。

用 Flex 和 Bison 配合实现的,词法和语法解析。 用到了 libQt5Core (纯 C++用不习惯,为了撸的快点。。。)

脚本名字叫: zScript (求不要喷我没文化)

变量的定义

变量使用关键字“ var ”进行定义。 zScript 提供了两种形式的变量定义语句。

1.直接定义的形式,该语句的一般形式为:
var 标识符;

该语句的含义是:定义变量名为“标识符”的变量。例如:

var a;

该语句的作用是:定义一个名为“ a ”的变量。

2.定义同时给变量初始化赋值,该语句的一般形式为:
var 标识符 = 表达式;

该语句的含义是:定义变量名为“标识符”的变量,且给变量赋值为表达式的结果。例如:

var a = 1 + 2;

该语句的作用是:定义一个名为“ a ”的变量,且赋值为 3 。 “ var ”关键字可同时定义多个变量,每个变量之间使用符号“,”分割。

匿名函数的定义

匿名函数定义的一般形式为:

(形参列表) {
	语句组
}

该语句的含义是:生成一个函数对象,例如:

(a) {
	console.log(a);
}

该语句的作用是:定义一个函数,它有一个名为“ a ”的形参,执行此函数会将 a 的值打印到屏幕上。 形参列表,可为空、一个、多个,多个形参之间使用“,”分割。

数组的定义

数组定义的一般形式为:

var a = [表达式 1, 表达式 2, ...];

该语句的含义是:生成一个数组,数组元素为中括号中表达式的结果。例如:

var a = [1, 2, 3];

该语句的作用是:定义一个包含三个元素的数组,元素的值分别为 1 、 2 、 3 ,然后赋值给变量 a ; 数组使用“[”“]”定义,中间内容可以为空、一个表达式、多个表达式,多个表达式之间使用“,”隔开。

a = a[0];

取数组元素语法和 C 语言一样,都是中括号中写入数组下标。

选择控制语句

一个选择结构,包括一组或若干组操作,每组操作称为一个分支。通过选择控制语句可以实现选择结构。选择控制语句包括 if 语句、 switch 语句及起辅助控制作用的 break 语句。 If 语句用于计算给定的表达式,根据表达式的值是否为假,决定是否执行某一组操作。 Switch 语句首先求解一个表达式,然后根据计算结果的值,从哈希表中查询该从哪一组操作开始执行。 Break 语句用于 switch 结构中,用于终止当前 switch 结构的执行。 ####if 语句 zScript 提供了两种形式的 if 语句。

1.单 if 子句的 if 语句。该 if 语句的一般形式为:
if(表达式)
{
	语句组
}

该语句的含义是:只有表达式的值为非零值时,才执行其内部的语句组。例如:

if ( a > b )
{
	console.log(“ hello ”);
}

该语句的作用是:当 a 的值大于 b 的值时(此时,“ a>b ”的值为真,为非假值),在屏幕上显示“ hello ”;否则,不显示“ hello ”。

2.带 else 子句的 if 语句。该 if 语句的一般形式为:
if ( 表达式 )
{
	语句组 1
} else {
	语句组 2
}

该语句的含义是:当表达式的值为非假时,执行语句组 1 ,而不执行语句组 2 ;否则,即表达式的值为假时,执行语句组 2 ,而不执行语句组 1 。例如:

if ( a > b )
{
	console.log(“ hello1 ”);
} else {
	console.log(“ hello2 ”);
}

该语句的作用是:若 a 的值大于 b 的值(此时“ a>b ”为真,为非假值),则在屏幕上显示“ hello1 ”,而不显示“ hello2 ”;否则,即表达式的值为假时,显示“ hello2 ”,而不显示“ hello1 ”。

switch 语句

Switch 语句与 if 语句一样,也可以实现分支选择。但 if 语句是判断一个表达式的值是否为假,决定是否执行某个分支;而 switch 语句是计算一个表达式的值,根据计算结果,从哈希表查询从哪个分支开始执行代码。 Switch 语句的一般形式为:

switch( 表达式 )
{
	case 常量 1 :
	语句组 1
	case 常量 2 :
	语句组 2
	...
	case 常量 n :
	语句组 n
	default:
	语句组 n + 1
}

switch 语句的执行过程:

其中 break 的一般形式为

break;

循环控制语句

while 语句

while 语句的一般形式为

while( 表达式 )
{
	循环体
}

while 语句的执行过程:

小括号中表达式的值是否为假,决定着循环体是终止还是继续循环。因此,该表达式的值为循环条件。 while 循环语句的执行特点是,先判断循环条件是否成立,然后决定是否执行循环体。 当 while 语句的循环体只包含一条语句时,包含该循环体的“{}”可以省略。

for 语句

在两种循环语句中, for 语句最为灵活。 for 语句的一般形式为:

for (表达式 1; 表达式 2; 表达式 3)
{
	循环体
}

for 语句的执行过程:

对象的定义

对象定义的一般形式为:

{
	属性名 1: 属性的值,
	属性名 2: 属性的值,
	...
	属性名 n: 属性的值,
	属性名 n+1: 属性的值
}

例如:

var object = {
	name: "张三",
	age: 18
};

变量 object 即是一个对象,它包含两个属性。 注:当对一个对象不存在的属性赋值时会将此属性加入到对象中,例如:

object.sex = '男';

对象 object 中就会多出一个“ sex ”属性。

理论上来说是可以跨平台的,但是其它平台还没适配,目前只能在 Linux 下正常使用。 上面的介绍没有覆盖所有的语法,比如函数中返回多个值之类的 项目中附带了一个 dome ,用 zScript 写的一个终端中跑的贪吃蛇游戏。

源码: Github ( https://github.com/zccrs/zScript )

2539 次点击
所在节点    程序员
7 条回复
to2false
2017-03-17 14:38:11 +08:00
标题看前半段我就想进来说,写个图书馆管理系统 [手动滑稽]
myway
2017-03-17 14:41:23 +08:00
2333 ,楼上+1 。。。
zccrs
2017-03-17 15:02:30 +08:00
@to2false 写这个的还真不少。。。。各种系统,各种网站
fy
2017-03-17 16:22:12 +08:00
楼主好巧,我毕设也是脚本引擎:
https://github.com/fy0/python_lite
跟楼主一样打算业余时间搞下去,可惜深感自己太菜,现在跑去刷题了。打算学成之后再来接着搞。
hzw94
2017-03-17 23:42:08 +08:00
都是大神,一个渣渣的我路过
cwing
2017-03-18 09:04:16 +08:00
随便选个算法 钻研一下~ 本科论文又不需要太高要求~又不用写 XX 系统那些脏活~哈哈
zccrs
2017-03-20 10:28:40 +08:00
@fy 加油

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/348200

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX