我的脚本解释器

下载地址

 

2009/7/6 更新信息

 

修复一个很傻瓜的bug:字符串中没有对转义字符“/”进行处理,结果像 "/"" 这样的字符串常量表达式分析出错。

已修复。

 

 



2008/5/6 更新信息

添加文件访问功能。使用File对象可实现对文本文件的读写。File对象有如下成员:

File() 构造函数
File(file)  构造并打开文件
File.open(file) 打开文件,成功返回true,失败返回false
File.close() 关闭文件
File.seek(pos) 定位读写指针到pos指定的位置
File.tell() 返回目前的位置,整数
File.length() 返回文件长度
File.eof() 返回是否到文件结尾
File.read() 读一个字符串,以空格、制表符、回车为分割符号,并返回该字符串。
File.readline() 读文件一行并返回。
File.write(str) 将字符串写入文件。

例子代码:

 

 

=   new  File(filename);
println(
" file length :  " , f.length());
while ( ! f.eof())
    println(f.readline());
f.close();

 

这是下载包中fprt.scpexe文件的一部分。

==================================================================

2008/4/22 更新信息

修正了 负号"-"引起的空指针导致程序退出时崩溃问题。例子代码中的split函数使用了-1,会导致程序退出时崩溃。

由于原先定义“-”为双目运算符。后来允许其为单目前置运算符,并且没有再重新写新的代码,还是让单目“-”翻译

为双目表达式。由于双目表达式使用left和right两个指针表示左右操作数,而更改“-”作用时只是在分析中让left=0

,退出时没有判断left是否为空就直接进行清除操作,导致程序崩溃。

现已更新,检查left是否为0。

==================================================================

08年3月17日再次更新。

更新信息:

加入函数flush用以清空输入缓冲,用法和getline相同。

加入函数srand和rand,用来获取伪随机数,作用和C语言标准库同名函数相同。
用法:
srand(); //以当前time值作为seed
srand(seed); // 以自定义的数字作为seed
rand(); //返回一个随机整数
rand(max); // 返回rand() % max
rand(start, end); // 返回start和end之间的一个随机数,start和end大小关系没有限定。

加入object特性,可以自定义对象。

加入匿名函数特性,可以使用匿名函数。

object.scp中的示例:

 

object student(id, nm, sp, grd)
{
    ID 
=  id;
    name 
=  nm;
    specialty 
=  sp;
    grade 
=  grd;
    introduce 
=   function ()
    
{
        println(
" I'm  " , this .name, 
                
"  a  " this .grade,  "  of this university,  " ,
                
" specialty in  " this .specialty,  " " ,
                
" student no.  " this .ID,  " , "  ,
                
" nice to meet you! " );
    }
;
}


function  main()
{
    s 
=   new  student( " 123456789 " " Franklin Charlie " " computer science " " freshman " );
    s.introduce();
    println(s);
    println(s.type());
    println(s.string());
}

 

运行输出:

I'm Franklin Charlie a freshman of this university, specialty in computer science, student no. 123456789,nice to meet you!
student{specialty="computer science";ID="123456789";grade="freshman";introduce=function anonymous_6();name="Franklin Charlie";}
object student{specialty;ID;grade;introduce;name;}
student{specialty="computer science";ID="123456789";grade="freshman";introduce=function anonymous_6();name="Franklin Charlie";}

修复 != 比较运算符与null相关运算出错的bug。

修复特定条件下堆栈出错的bug。

特别注意:如果使用object构造循环结构会造成循环引用,导致内存泄漏。该问题正在处理中。当前的object特性仅处于可用状态。

======================================================================

已经更新,为所有类型添加了成员函数,下面是所有全局函数和成员函数的说明。

全局函数:
get()   // 返回一个记号,或者双引号括起来的字符串
getline() // 返回一行
print(...) // 打印所有参数
println(...) // 打印所有参数,最后还输出一个回车
exec(...) // 将所有参数作为控制台的字符串命令来执行,从左到右,
            //直到某一个命令失败(返回结果不为0),并返回最后那个命令的返回值。

成员函数
object.type() // 返回字符串
             //"object", "string", "integer", "bool", "array", "nat"[not a type, e.g. null.type() = "nat"]
object.string() // 将obj转换为字符串,相当于java的toString
object.integer() // 将obj转换为整数
object.bool()  // 将obj转换为bool

string.length()
string.indexOf(subs, [off])
string.subString(start, count)

array.length() // 返回数组的元素个数

注:所有值都是object,包括常量,string是字符串对象,array是数组。

 

function split(string, sparator)
{
    
if (sparator  ==   null ) sparator  =   "" ;
    array 
=   null ;
    count 
=   0 ;
    
while (string.length() > 0 )
    
{
         pos 
=  string.indexOf(sparator);
         
if (pos  ==   - 1 ) pos  =  string.length();
         
else   if (pos  ==   0 ) pos  =   1 ;
         array[count] 
=  string.subString( 0 , pos);
         count 
=  count + 1 ;
         string 
=  string.subString(pos + sparator.length(), string.length());
    }

    
return  array;
}


println(split(
" hello world, are you ok? " "   " ));

 

输出:array[5]{"hello","world,","are","you","ok?"}

========================================================================

目前只支持函数编程,不支持对象。对象的支持正在谋划之中。

特点:

1、支持list表达式(效仿Lua),即a,b,c= 1,2,3; a,b = b,a; // 交换a和b。

2、支持数组。

3、语法与JavaScript大致相同。

4、带有5个内置函数:get (从标准输入读取一个记号), getline(从标准输入读取一行),print(打印一个或多个变量),println(print之后再打印一个换行),exec(执行一个或多个命令,直到某一个命令失败,则后面的命令不执行)

压缩包中包含了例子文件。 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值