毕业设计真是件麻烦事,没啥好的想法,不知道写啥。就根据自己的喜好实现了一个脚本解释器(语法类似于 js) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
zccrs
V2EX    程序员

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

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

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

    用 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     Solana     3174 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 10:53 PVG 18:53 LAX 03:53 JFK 06:53
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86