V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
zccrs
V2EX  ›  程序员

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

  •  
  •   zccrs · 2017-03-17 14:35:47 +08:00 · 2578 次点击
    这是一个创建于 2838 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    用 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 语句的执行过程:

    • 1.求解“表达式”的值;
    • 2.如果“表达式”的值与某个 case 后面的“常量”的值相同,则从这里开始顺序执行语句。结果 switch 执行有两种形式:一是遇到 break 语句为止;二是未遇到 break 语句,则程序依次执行完所有语句组。
    • 3.如果“表达式”的值与任何一个 case 后面的“常量”的值都不相同,当有 default 子句时,则执行 default 后面的语句,如果没有 default 子句,则结束 switch 。

    其中 break 的一般形式为

    break;
    

    循环控制语句

    while 语句

    while 语句的一般形式为

    while( 表达式 )
    {
    	循环体
    }
    

    while 语句的执行过程:

    • 1.求解小括号中表达式的值。如果表达式的值为真,转第 2 步;否则转第 3 步。
    • 2.执行循环体,然后转第 1 步。
    • 3.执行 while 语句后面的语句。

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

    for 语句

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

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

    for 语句的执行过程:

    • 1.求解表达式 1 的值。
    • 2.求解表达式 2 的值,若其值为假,则结束循环,转第 4 步;若其值为真,则执行循环体。
    • 3.求解表达式 3 。
    • 4.结束循环。

    对象的定义

    对象定义的一般形式为:

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

    例如:

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

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

    object.sex = '男';
    

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

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

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

    7 条回复    2017-03-20 10:28:40 +08:00
    to2false
        1
    to2false  
       2017-03-17 14:38:11 +08:00
    标题看前半段我就想进来说,写个图书馆管理系统 [手动滑稽]
    myway
        2
    myway  
       2017-03-17 14:41:23 +08:00
    2333 ,楼上+1 。。。
    zccrs
        3
    zccrs  
    OP
       2017-03-17 15:02:30 +08:00
    @to2false 写这个的还真不少。。。。各种系统,各种网站
    fy
        4
    fy  
       2017-03-17 16:22:12 +08:00
    楼主好巧,我毕设也是脚本引擎:
    https://github.com/fy0/python_lite
    跟楼主一样打算业余时间搞下去,可惜深感自己太菜,现在跑去刷题了。打算学成之后再来接着搞。
    hzw94
        5
    hzw94  
       2017-03-17 23:42:08 +08:00
    都是大神,一个渣渣的我路过
    cwing
        6
    cwing  
       2017-03-18 09:04:16 +08:00
    随便选个算法 钻研一下~ 本科论文又不需要太高要求~又不用写 XX 系统那些脏活~哈哈
    zccrs
        7
    zccrs  
    OP
       2017-03-20 10:28:40 +08:00
    @fy 加油
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3137 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:32 · PVG 21:32 · LAX 05:32 · JFK 08:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.