`
jjchen_lian
  • 浏览: 86198 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

The Erlang Parser之erl_parse

阅读更多

这篇续前一篇,来介绍erl_parse这个重头模块。

先看看这个模块的三个重头方法:

parse_form(Tokens) -> {ok, AbsForm} | {error, ErrorInfo}

Types:

Tokens = [token()]
AbsForm = abstract_form()
ErrorInfo = error_info()
This function parses Tokens as if it were a form. It returns: //针对form

{ok, AbsForm}
The parsing was successful. AbsForm is the abstract form of the parsed form.

{error, ErrorInfo}
An error occurred.

parse_exprs(Tokens) -> {ok, ExprList} | {error, ErrorInfo}

Types:

Tokens = [token()]
ExprList = [abstract_expr()]
ErrorInfo = error_info()
This function parses Tokens as if it were a list of expressions. It returns: //针对list

{ok, ExprList}
The parsing was successful. ExprList is a list of the abstract forms of the parsed expressions.

{error, ErrorInfo}
An error occurred.

parse_term(Tokens) -> {ok, Term} | {error, ErrorInfo}

Types:

Tokens = [token()]
Term = term()
ErrorInfo = error_info()
This function parses Tokens as if it were a term. It returns: //针对term

{ok, Term}
The parsing was successful. Term is the Erlang term corresponding to the token list.

{error, ErrorInfo}
An error occurred.

 分别注意这三个方法是针对不同的tokens进行parse的。

下面给出两个例子

{ok, Tokens, EndLine} = erl_scan:string("test() -> ok.").
{ok,[{atom,1,test},
     {'(',1},
     {')',1},
     {'->',1},
     {atom,1,ok},
     {dot,1}],
    1}
erl_parse:parse_form(Tokens).
{ok,{function,1,test,0,[{clause,1,[],[],[{atom,1,ok}]}]}}

 

{ok, Tokens2, EndLine2} = erl_scan:string("[a,b,c].").
{ok,[{'[',1},
     {atom,1,a},
     {',',1},
     {atom,1,b},
     {',',1},
     {atom,1,c},
     {']',1},
     {dot,1}],
    1}
erl_parse:parse_exprs(Tokens2).
{ok,[{cons,1,
           {atom,1,a},
           {cons,1,{atom,1,b},{cons,1,{atom,1,c},{nil,1}}}}]}
erl_parse:parse_term(Tokens2).
{ok,[a,b,c]}

 再看看下面这个不常用的方法

tokens(AbsTerm) -> Tokens
tokens(AbsTerm, MoreTokens) -> Tokens

Types:

AbsTerm = abstract_expr()
MoreTokens = Tokens = [token()]
This function generates a list of tokens representing the abstract form AbsTerm of an expression. Optionally, it appends MoreTokens.

 例子

Expr.
{cons,1,
      {atom,1,a},
      {cons,1,{atom,1,b},{cons,1,{atom,1,c},{nil,1}}}}
erl_parse:tokens(Expr).
[{'[',1},
 {atom,1,a},
 {',',1},
 {atom,1,b},
 {',',1},
 {atom,1,c},
 {']',1}]

 其实就是把表达式重新解析成tokens格式

 给出别人写的一个demo

-module(file_2).
-export([compile/1]).
-spec file_2:compile(Code) -> {ok, Module} | {error} when
      Code:: string(),
      Module :: module().
compile(Code) ->
    {ok, M, Bin} = compile:forms(scan_tokens(Code)),
    case code:load_binary(M, "nofile", Bin) of
        {module, Module} ->
            {ok, Module};
        {error, _} ->
            {error}
    end.
scan_tokens(Code) ->
    case erl_scan:tokens([], Code, 1) of
        {done, {ok, Token, _}, Remain} ->
            {ok,Form} = erl_parse:parse_form(Token),
            [Form | scan_tokens(Remain)];
        {more, _} ->
            []
    end.

 

分享到:
评论
1 楼 fair_jm 2013-07-04  
多谢博主分享 这些模块资料都蛮少的 自己英语渣又看的不是很懂^_^

相关推荐

    erl_nif 扩展erlang的另外一种方法

    在Erlang中,为了实现与C或其他低级语言的高效交互,Erlang提供了一个名为`erl_nif`的接口。本文将深入探讨`erl_nif`,了解它是如何扩展Erlang的功能,并讨论如何使用它来提升性能。 `erl_nif`(Erlang NIF,Native...

    erlang版本的protobuf(erl_protobuffs)

    3. **集成性**:由于Erlang主要用于构建分布式系统,`erl_protobuffs`的设计考虑到了Erlang的通信模型,使得与其他Erlang进程的交互更为流畅,尤其适合处理大规模并发场景下的数据交换。 **使用erl_protobuffs** 1...

    erlang-erl_interface-19.3.6.4-1.el7.x86_64.rpm

    erlang-erl_interface-19.3.6.4-1.el7.x86_64.rpm

    erlang-sd_notify-1.0-2.el7.x86_64.rpm

    erlang-sd_notify-1.0-2.el7.x86_64.rpm

    erlang-erl_docgen-19.3.6.4-1.el7.x86_64.rpm

    erlang-erl_docgen-19.3.6.4-1.el7.x86_64.rpm

    erlang语言实现binary_to_term完整代码

    erlang提供了binary_to_term 函数,用于把二进制数据转为原始的erlang数据。这个函数都是c实现的,这里用erlang语言实现了,很有参考价值,其他语言可以参考这个解析erlang二进制协议数据。配套文章地址...

    Erl_B表查询小工具

    Erl_B通常指的是Erlang B模型,这是一个在电信行业中广泛使用的数学模型,用于估算交换机或网络节点的容量需求。在理解这个工具之前,我们先来了解一下Erlang B模型的基本概念。 Erlang B模型是基于概率论的,用于...

    esl-erlang_23.0_windows_amd64.exe rabbitmq-server-3.8.4.exe

    esl-erlang_23.0和rabbitmq-3.8.4windows版本 直接下载安装就行,可以直接下载就可安装,非常的方便 ,欢迎大家下载 注意事项: 1. Erlang版本和RabbitMQ版本要配套 (Erlang23.0, RabbitMQ3.8.4) 2. amd芯片请乖乖...

    erlang_otp_src_22.3.tar.gz

    Erlang OTP (Open Telephony Platform) 是一种高级编程语言,专为构建高并发、分布式、容错性强的系统而设计。22.3 版本是 Erlang OTP 的一个稳定版本,它提供了许多增强的功能和性能改进。下面将详细介绍这个版本的...

    Erlang_x64_20.1

    Erlang_x64_20.1是Erlang OTP (Open Telephony Platform)的一个特定版本,专为64位Windows操作系统设计。 Erlang OTP是一个包含Erlang编译器、运行时系统、库和工具的完整平台。OTP提供了许多关键特性,如进程间...

    erlang otp_src_20.2.tar.gz

    4. **验证安装**:安装完成后,通过运行`erl`命令启动Erlang shell,如果出现Erlang的欢迎信息,表明安装成功。 5. **环境变量设置**:添加Erlang到PATH环境变量,这样可以在任何目录下直接运行Erlang命令。编辑`~/...

    Erlang otp_src_20.3.tar.gz

    Erlang OTP 20.3 是一个针对Linux CentOS系统的软件包,主要为开发者提供了一个强大的并发和分布式计算环境。Erlang是一种静态类型的、函数式的编程语言,它以其在处理高并发、容错和实时系统方面的优秀表现而闻名。...

    erl_nif_rustler_过程宏写法

    本篇主要介绍如何利用Rust语言来开发Erlang NIF,并探讨`erl_nif_rustler`的过程宏写法。 首先,`erl_nif_rustler` 是一个库,它简化了在Rust中编写Erlang NIFs的过程。Rust以其类型安全和内存管理特性,成为构建...

    最新版 erlang安装包 otp_src_21.3.tar.gz

    - 安装完成后,你可以通过运行`erl`命令来启动Erlang shell,如果一切顺利,你应该看到Erlang的欢迎界面。 - 使用`erl -version`可以查看Erlang的版本,确认是否为21.3。 8. **设置环境变量**: - 可能需要将...

    Erlang_win64_24.1.rar

    标题中的"Erlang_win64_24.1.rar"是指Erlang的64位Windows版,版本号为24.1.7。这个压缩包文件是专为在Windows操作系统上安装和运行Erlang而准备的,包含了所有必要的二进制文件和库,使得开发者可以在Windows平台上...

    esl-erlang_23.0_windows_amd64.exe

    这个erlang23.0版本,根据rabbitMQ官网的介绍,可以和下面这几个版本的rabbitMQ配合使用: 3.8.9 3.8.8 3.8.7 3.8.6 3.8.5 3.8.4 其他版本的rabbit,请移步其他资源下载

    Erlang-win64_20.1

    4. 安装完成后,可以通过命令行输入`erl`来验证Erlang是否正确安装。 参考链接中的教程(https://blog.csdn.net/hzw19920329/article/details/53156015)可以提供更详细的安装指南,包括可能出现的问题和解决方法。...

    esl-erlang_23.0.2-1_centos_7_amd64.rpm

    erlang_23.0.2-1版本 centos7 64bit esl-erlang_23.0.2-1_centos_7_amd64.rpm

    erl_to_html:使用解析转换和erl_id_trans.erl将erlang代码转换为跨度为_everything_HTML

    erl_to_html 使用解析变换和erl_id_trans.erl Erlang的代码转换为HTML,跨度的一切。...我不知道我需要怎么做许可证,但是由于我是从Erlang示例代码中复制erl_id_trans.erl,因此我正在使用Erlang公共许可证。

Global site tag (gtag.js) - Google Analytics