`
deepfuture
  • 浏览: 4411568 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:80123
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:70327
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:103580
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:286537
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:15043
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:67780
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:32289
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:46075
社区版块
存档分类
最新评论

用erlang写的一个在erlang上跑的脚本语言-LGPL协议

阅读更多
-module(pparser).  
-export([start/1]).  
-import(io,[fwrite/1,format/2]).
-import(sfile,[load/1,unload/1,readline/1]).
-import(string,[len/1,substr/3,to_lower/1,to_upper/1,strip/1,tokens/2,join/2]).
-import(ets,[new/2,insert/2,delete/1,lookup/2]).
-import(qsort,[qsort3/1]).
-import(lists,[reverse/1,concat/1]).
-vsn(0.1005).
-author({deepfuturelx@gmail.com}).
%解释执行源代码
%遵守LGPL协议

start(Sfilename)->%启动解释器
fwrite("Poles 0.1005 \nContact us:deepfuturelx@gmail.com\nload.....~n"),
try load(Sfilename) of
       Sf->
       prestart(Sfilename),     
       try read(Sf)
       catch
            {error,Why}->
                  format("~s~n",[Why]);
            {runerr,Runwhy}->
                  format("~s~n",[Runwhy])    
       after
          preclose(),       
          unload(Sf)
       end    
catch
    err->format("load ~s error~n",[Sfilename]) 
end.

prestart(Sfilename)->%解析前运行
     erase(),%清空符号表
     getcurln(),
     format("load ~s finished.~n",[Sfilename]).

preclose()->%关闭前运行
     erase().%清空符号表

read(Sf)->%读源代码
case readline(Sf) of
  eof->format("run finished~n",[]);  
  Data->
     begin 
        try parse(Data) 
        catch
           {error,Why}->throw({error,Why});
           {runerr,Runwhy}->throw({runerr,Runwhy})          
        end
     end,   
     read(Sf)       
end.        
  
parse(Data)->%解析一行
   inccurln(),
   Line=strip(substr(Data,1,len(Data)-1)),
   case substr(Line,1,1)=:="#" of
      true->%注释使用#
         notes(Line);
      false->%非注释,执行
          begin  
            Sline=tokens(Line,"\t"),         
            try run(Sline)           
            catch
              {error,Why}->throw({error,Why});
              {runerr,Runwhy}->throw({runerr,Runwhy}) 
            end
          end  
  end.
  
run(Spline)->%运行一行代码
   %format("~p~n",[Spline]), 
   try runinstruction(list_to_tuple(Spline)) 
   catch        
       {error,Why}->throw({error,concat([" line ",getcurln()," ~"])++join(Spline," ")++"|====>runtime error:"++Why});  
       {runerr,Runwhy}->throw({runerr,concat([" line ",getcurln()," ~"])++join(Spline," ")++"|====>run error:"++Runwhy})        
   end.
   
runinstruction(Instruction)-> %分析并执行指令 
   try Instruction of       
          {"list",Source,Target}->modisymbol({Source,list,Target,null});%列表变量声明
          {"list",Source}->modisymbol({Source,list,[],null});%列表变量赋值并声明
          {"var",Source,Target}->modisymbol({Source,var,Target,null});%标量赋值声明
          {"var",Source}->modisymbol({Source,var,null,null});%标量声明  
               
        {"mov",Source,Target}->assign({Source,Target});%赋值
          {"pushlist",Source,Target}->pushlist({Source,Target});%push 列表 列表        
          {"push",Source,Target}->push({Source,Target});%push 元素 列表
          {"qsort",Source,Target}->qsort({Source,Target});%qsort 列表
          {"pop",Source,Target}->pop({Source,Target});%pop 列表
          {"pop",Source,Target,"del"}->pop({Source,Target},del);%pop and del 列表首          
          {"say",Source}->say({Source});%带回车输出
          {"print",Source}->print({Source});%输出
          {}->{}%空行
  catch
       {error,Why}->throw({error,Why});
       {runerr,Runwhy}->throw({runerr,Runwhy})
  end.



  
notes(Sline)->Sline.   

newsysinfo(poles_symbol)->%
    new(poles_symbol,[set,named_table]).

delsysinfo(poles_symbol)->%
  delete(poles_symbol).
    
modisymbol({Name,Type,Value,Flag})->%符号表修改符号
   put(Name,{Name,Type,Value,Flag}).
   
assign({Value,Name})->%赋值
    case findsymbol(Name) of 
        false->throw({runerr,Name++" not defined"});
      {_,Type,_,SFlag}->
         Svalue=eval(Value),
         modisymbol({Name,Type,Svalue,SFlag})
    end.   

say({Name})->%带回车输出
    case findsymbol(Name) of  
        false->
            Value=eval(Name),
            format("~p~n",[Value]);
      {_,_,Value,_}->format("~p~n",[Value])
    end. 

        
print({Name})->%输出
    case findsymbol(Name) of  
        false->
            Value=eval(Name),
            format("~p",[Value]);
      {_,_,Value,_}->format("~p",[Value])
    end. 

push({Value,Name})->%在列表首加入元素
    case findsymbol(Name) of  
        false->throw({runerr,Name++" not defined"});
      {_,Type,SValue,SFlag}->modisymbol({Name,Type,[eval(Value)|SValue],SFlag})
    end.

pushlist({Value,Name})->%在列表首加入列表元素
    case findsymbol(Name) of  
        false->throw({runerr,Name++" not defined"});
      {_,Type,SValue,SFlag}->modisymbol({Name,Type,eval(Value)++SValue,SFlag})
    end.
    
pop({Sname,Dname})->%在列表首取出元素
    case findsymbol(Sname) of  
        false->throw({runerr,Dname++"not defined"});
      {_,Type,[Popvalue|_Svalue],Sflag}->
            case findsymbol(Dname) of
                   false->throw({runerr,Dname++" not defined"});      
                   {_,_,_,_}->modisymbol({Dname,Type,Popvalue,Sflag})         
            end   
    end.    

pop({Sname,Dname},del)->%在列表首取出并删除元素
    case findsymbol(Sname) of  
        false ->throw({runerr,Dname++"not defined"});
      {_,Type,[Popvalue|Svalue],Sflag}->
            case findsymbol(Dname) of
                   false->throw({runerr,Dname++" not defined"});      
                   {_,_,_,_}->
                       modisymbol({Sname,Type,Svalue,Sflag}),
                       modisymbol({Dname,Type,Popvalue,Sflag})         
            end   
    end. 

    


trans(ErlTokens,Stk,NewErlTokens)->%处理表达式中的变量 
     [Stoken|Et]=ErlTokens,
     case Stoken of  
        {atom,_,Name}->%变量
              NewEtoken=[{var,1,list_to_atom(to_upper(atom_to_list(Name)))}|NewErlTokens],
              case findsymbol(atom_to_list(Name)) of
                   false->throw({runerr,atom_to_list(Name)++" not defined"}); 
                   {_Name,Type,Val,_Flag}->

                       case Type of
                            list->
                            NewVal=concat([Stk,to_upper(atom_to_list(Name)),"=",concat(io_lib:format("~p",[Val])),","]);
                             _Other->NewVal=concat([Stk,to_upper(atom_to_list(Name)),"=",Val,","])
                       end,
                       
                       trans(Et,NewVal,NewEtoken)                   
              end;
        {dot,Flag}->%结束
              NewEtoken=[{dot,Flag}|NewErlTokens],
              Etoken=reverse(NewEtoken),  
              {ok,VarEtoken,_}=erl_scan:string(Stk),%转换变量声明为erlang内部的方式VarEtoken
              EndToken=addexpress(VarEtoken,Etoken),%将erlang内部方式声明的变量加入到现有表达式中
              EndToken;
        Val->%普通运算
              NewEtoken=[Val|NewErlTokens],
              trans(Et,Stk,NewEtoken)
     end.
              
addexpress(VarEtoken,Etoken)->%将erlang内部方式声明的变量加入到现有表达式中
    case VarEtoken of
      []->Etoken;
      Val->
          EndEtoken=Val++Etoken,
          EndEtoken
    end.

    
eval(S) ->%计算表达式
    case findsymbol(S) of  
      {_,_,Value,_}->Value;
      false->
         begin
            {ok,ErlTokens,_}=erl_scan:string(S++"."),
            SErlTokens=trans(ErlTokens,[],[]),

           {ok,ErlAbsForm}=erl_parse:parse_exprs(SErlTokens),
           {value,Value,_}=erl_eval:exprs(ErlAbsForm,[]),
             Value  
         end      
    end. 
     

qsort({Sname,Dname})->%排序list
    case findsymbol(Sname) of  
        false->throw({runerr,Dname++"not defined"});
      {_,Type,Svalue,Sflag}->
            case findsymbol(Dname) of
                   false->throw({runerr,Dname++" not defined"});      
                   {_,_,_,_}->
                       Sortvalue=qsort3(Svalue),
                       modisymbol({Dname,Type,Sortvalue,Sflag})         
            end   
    end. 
   
    
getcurln()->%取得当前行号
begin
 case findsymbol(sys__line) of
      false->modisymbol({sys__line,runsys,1,null}),1;
      {sys__line,runsys,Line,null}->Line 
 end
end.

inccurln()->%当前行号++
Curline=getcurln()+1,
modisymbol({sys__line,runsys,Curline,null}).

findsymbol(Name)->%找到符号,并返回值
  case get(Name) of 
       undefined->false;
       Val->Val
  end.     



 

-module(sfile).
-export([load/1,readline/1,unload/1]). 
-import(io,[get_line/2,atom/0]). 
-import(file,[open/2,close/1]). 
-vsn(0.1001).
-author({deepfuture}).
%源代码文件操作
%load读取源文件,readline读取一行,unload关闭源文件

load(Sfilename)->
        case open(Sfilename,read) of
             {ok,Sf}->Sf;       
     		 {error,Why}->throw(err)	 
end.

readline(Sf)->get_line(Sf,"").

unload(Sf)->close(Sf).

 

% Copyright (c) 2010 the authors listed at the following URL, and/or
% the authors of referenced articles or incorporated external code:
% http://en.literateprograms.org/Quicksort_(Erlang)?action=history&offset=20060711142841
% 
% Permission is hereby granted, free of charge, to any person obtaining
% a copy of this software and associated documentation files (the
% "Software"), to deal in the Software without restriction, including
% without limitation the rights to use, copy, modify, merge, publish,
% distribute, sublicense, and/or sell copies of the Software, and to
% permit persons to whom the Software is furnished to do so, subject to
% the following conditions:
% 
% The above copyright notice and this permission notice shall be
% included in all copies or substantial portions of the Software.
% 
% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
% MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
% IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
% CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
% TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
% SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
% 
% Retrieved from: http://en.literateprograms.org/Quicksort_(Erlang)?oldid=6960

-module(qsort).
-export([qsort1/1, qsort2/1, qsort3/1]).

qsort1([]) ->
    [];
qsort1([H | T]) -> 
    qsort1([ X || X <- T, X < H ]) ++ [H] ++ qsort1([ X || X <- T, X >= H ]).

qsort2([]) ->
    [];
qsort2([H | T]) ->
    {Less, Equal, Greater} = part(H, T, {[], [H], []}),
    qsort2(Less) ++ Equal ++ qsort2(Greater).

part(_, [], {L, E, G}) ->
    {L, E, G};
part(X, [H | T], {L, E, G}) ->
    if
        H < X ->
            part(X, T, {[H | L], E, G});
        H > X ->
            part(X, T, {L, E, [H | G]});
        true ->
            part(X, T, {L, [H | E], G})
    end.


qsort3([]) ->
    [];
qsort3([H | T]) ->
    qsort3_acc([H | T], []).

qsort3_acc([], Acc) ->
    Acc;

qsort3_acc([H | T], Acc) ->
    part_acc(H, T, {[], [H], []}, Acc).

part_acc(_, [], {L, E, G}, Acc) ->
    qsort3_acc(L, (E ++ qsort3_acc(G, Acc)));
part_acc(X, [H | T], {L, E, G}, Acc) ->
    if
        H < X ->
            part_acc(X, T, {[H | L], E, G}, Acc);
        H > X ->
            part_acc(X, T, {L, E, [H | G]}, Acc);
        true ->
            part_acc(X, T, {L, [H | E], G}, Acc)
    end.





 

 

 

 一、将代码开源(遵守LGPL协议)

当前版本的语言规范

代码以三指令和四指令为主,以TAB分割每行代码的元素
list 变量名 声明列表变量
var 变量名 声明单变量
push 表达式 列表变量 为将表达式的值放入列表首部
pop 列表变量 变量  为获得列表首部的值并放入变量
pop 列表变量 变量 del 为将列表首部的变量弹出放入变量
以#开头表示注释,注释必须单独占一行
pushlist 列表变量 列表变量 为将列表放入列表首部
say 表达式 带回车输出
print 表达式 输出
mov 表达式 变量 赋值到变量
表达式计算支持erlang格式的标准表达式,包括列表计算,不支持表达式直接调用erlang的函数
四、脚本代码示例

#test2.po
#代码以三指令和四指令为主,以TAB分割每行代码的元素
list a
list b


pushlist [88,89] a
#取余
push 5 rem 2 b
#a++[90,91]和a--[89]完成2个列表的计算
pushlist a++[90,91] b
pushlist a--[89] b

say "===="
say b

任务

1、调试和完善现在指令

2、增加部分顺序执行指令

3、尝试编写对条件语句的解析

4、完成函数

5、继续并行计算架构代码

三、当前版本的语言规范

代码以三指令和四指令为主,以TAB分割每行代码的元素
list 变量名 声明列表变量
var 变量名 声明单变量
push 表达式 列表变量 为将表达式的值放入列表首部
pop 列表变量 变量  为获得列表首部的值并放入变量
pop 列表变量 变量 del 为将列表首部的变量弹出放入变量
以#开头表示注释,注释必须单独占一行
pushlist 列表变量 列表变量 为将列表放入列表首部
say 表达式 带回车输出
print 表达式 输出
mov 表达式 变量 赋值到变量
表达式计算支持erlang格式的标准表达式,包括列表计算,不支持表达式直接调用erlang的函数
四、脚本代码示例
1、
#test2.po
#代码以三指令和四指令为主,以TAB分割每行代码的元素
list a
list b


pushlist [88,89] a
#取余
push 5 rem 2 b
#a++[90,91]和a--[89]完成2个列表的计算
pushlist a++[90,91] b
pushlist a--[89] b

say "===="
say b

2、
进入erlang,将pparser.beam等目录下的beam文件列入erlang的搜索目录,然后运行脚本
pparser:start("脚本文件名称").
比如:
1>pparser:start("test2.po").
Poles 0.1005
Contact us:deepfuturelx@gmail.com
load.....
load ../test/test2.po finished.
"===="
[88,88,89,90,91,1]
run finished
ok

 

1
5
分享到:
评论

相关推荐

    erlang-22.3-1.el7.x86_64.rpm

    总结,"erlang-22.3-1.el7.x86_64.rpm"是一个专为RabbitMQ准备的Erlang版本,适合在RHEL 7或类似系统上运行,利用Erlang的并发、分布式和容错特性来保证RabbitMQ的稳定性和效率。通过RPM包的形式,用户可以便捷地在...

    esl-erlang-26.0.2x86-64.zip

    宝塔安装RabbitMQ提示elang环境没有解决方法 ...------------------------------------------------------------------ 大家一定要看自己的日志报错,是缺少了...那就将这个 文件名字改成 esl-erlang_26.0.2-1~alinux~3_x

    erlang-23.2.3-1.el7.x86_64.rpm和erlang-23.2.1-1.el7.x86_64.rpm.rar

    描述中提到的"rabbitmq-server-3.8.17-1.el8.noarch.rpm"是RabbitMQ服务器的一个版本,RabbitMQ是一个基于AMQP(Advanced Message Queuing Protocol)的消息代理,它使用Erlang语言编写。RabbitMQ允许应用程序通过...

    基于Erlang VM的语言

    1. **Reia**: Reia是一种类似于Ruby和Python的脚本语言,旨在提供更友好的语法同时利用Erlang VM的特性。Reia的特色包括单一及多重赋值(Single & Multiple Assignment, MA),以及静态单赋值(Static Single ...

    用Erlang写了个解八数码的小程序

    标题中的“用Erlang写了个解八数码的小程序”指的是使用Erlang编程语言实现的一个解决8数码问题(也称为滑动拼图)的算法。8数码问题是一个经典的计算机科学问题,它涉及到在一个3x3的网格上,通过空格与其他数字...

    erlang-otp-win64位 25.3版本

    在Windows操作系统上,Erlang OTP通常提供为预编译的64位版本,如"erlang-otp-win64位 25.3版本",这确保了它能在Windows 64位环境下高效运行。 Erlang OTP(Open Telephony Platform)是一个开放源码的软件框架,...

    erlang写的一个特别的web服务器

    Erlang是一种面向并发的、基于actor模型的编程语言,由瑞典电信设备制造商Ericsson开发,主要用于构建高可用性、容错性和可扩展性的分布式系统。在Web服务器领域,Erlang由于其天然的并发处理能力和强大的错误恢复...

    erlang-rpm-21.3.4.zip

    Erlang是一种高级编程语言,特别为并发、分布式计算和实时系统设计,广泛应用于电信、银行、互联网服务和软件开发领域。"erlang-rpm-21.3.4.zip"是一个包含Erlang版本21.3.4的RPM(Red Hat Package Manager)包的...

    erlang-18.3-1.el7.centos.x86_64.zip

    在这个案例中,Erlang 18.3的RPM包被用作安装RabbitMQ的前提条件,RabbitMQ是一个用Erlang编写的消息队列服务器,广泛应用于微服务架构和企业级应用中,提供高效、可靠的消息传递服务。 Erlang之所以成为RabbitMQ的...

    Erlang 20.3linux安装包

    由于RabbitMQ是用Erlang语言开发的,因此在部署RabbitMQ之前,首先需要确保系统上安装了Erlang环境。 对于Linux系统来说,安装Erlang有多种方法,但推荐使用最新版本,因为新版本通常包含更多的功能增强和安全修复...

    erlang21.1-windows-64

    Erlang在Windows上安装RabbitMQ,这是一个流行的开源消息队列系统,广泛应用于微服务架构和分布式系统中。RabbitMQ需要依赖Erlang环境才能运行。安装RabbitMQ的步骤如下: 1. **下载RabbitMQ**:访问RabbitMQ官网,...

    Erlang-otp_win64_23.0.zip

    在安装RabbitMQ,一个广泛使用的开源消息代理和队列服务器之前,通常需要先安装Erlang环境。Erlang OTP 23.0是针对Windows 64位操作系统的一个版本,它包含了运行RabbitMQ所需的全部组件。 首先,Erlang OTP(Open ...

    erlang_版本24.3.4.4

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,主要用于构建高可用性、分布式和实时系统。版本24.3.4.4是Erlang的一个更新版本,包含了对先前版本的改进和修复。Erlang以其强大的错误...

    2018-FL+erlang语言-Functional Federated Learning in Erlang (ffl-er

    实验结果显示,尽管Erlang在性能上存在一定的损失,但考虑到开发速度(Erlang的优势)与运行效率(C语言的优势)之间的权衡,对于某些实际的机器学习任务,Erlang可能是C语言的一个可行替代方案。 1. 并发与分布式...

    最新版erlang-23.3.4.3-1.el7.x86_64.rpm(CentOS7)

    Erlang是一种高级编程语言,特别为并发、分布式计算和容错设计,广泛应用于网络通信、实时系统和大型分布式计算环境中。最新版的Erlang是23.3.4.3-1.el7.x86_64.rpm,这个版本针对CentOS 7进行了优化。Erlang以其轻...

    erlang-23.2.1-1.el7.x86-64.rpm

    Erlang:RabbitMQ 是用 Erlang 编写的,因此需要 Erlang 运行时。确保安装了兼容的 Erlang 版本;Erlang:RabbitMQ 是用 Erlang 编写的,因此需要 Erlang 运行时。确保安装了兼容的 Erlang 版本;Erlang:RabbitMQ ...

    erlang-18.3.4.7-1.el6.x86_64.rpm

    ●外部接口-Erlang进程与外部世界之间的通讯使用和在Erlang进程之间相同的消息传送机制。 ●Fail-fast(中文译为速错),即尽可能快的暴露程序中的错误。 ●面向并发的编程(COP concurrency-oriented programming) ...

    erlang mochiweb-test demo

    Erlang 是一种高级并发编程语言,以其在分布式系统、实时和容错计算中的卓越表现而闻名。Mochiweb 是一个用 Erlang 编写的轻量级 Web 服务器和 HTTP 客户端库,它提供了处理 HTTP 请求和响应的能力。这个 "erlang ...

    Erlang-game-server开发实践.pdf

    在本文中,我们将介绍如何使用Erlang开发一个简单的游戏服务器,并讨论其优点和实现细节。 Why Erlang? Erlang是一种轻量级的语言,非常适合开发高性能的服务器应用程序。其主要优点有: * 轻量级process:...

    最新最全rabbitmq与erlang版本匹配-2020-04-23.docx

    RabbitMQ是一种广泛使用的开源消息代理和队列服务器,它基于Erlang编程语言构建。Erlang以其并发能力、容错性和分布式特性而闻名,是实现RabbitMQ的理想选择。正确地匹配RabbitMQ和Erlang的版本对于确保系统的稳定性...

Global site tag (gtag.js) - Google Analytics