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

扫描器erl_scan

阅读更多

Erlang提供的基本扫描器是erl_scan,里面提供了两个重头函数

string(String) -> Return
string(String, StartLocation) -> Return
string(String, StartLocation, Options) -> Return

Types:

String = string()
Options = options()
Return = {ok, Tokens :: tokens(), EndLocation}
       | {error, ErrorInfo :: error_info(), ErrorLocation}
StartLocation = EndLocation = ErrorLocation = location()

 

tokens(Continuation, CharSpec, StartLocation) -> Return
tokens(Continuation, CharSpec, StartLocation, Options) -> Return

Types:

Continuation = return_cont() | []
CharSpec = char_spec()
StartLocation = location()
Options = options()
Return = {done,
          Result :: tokens_result(),
          LeftOverChars :: char_spec()}
       | {more, Continuation1 :: return_cont()}
char_spec() = string() | eof
return_cont()
An opaque continuation

 下面先来看看erl_scan:string这个方向

{ok,Data} = prim_file:read_file("sn.txt").
{ok,<<"{rssAPVg}.\r\nrssAPVg1.\r\nrssAPVg2.\r\nrssAPVg3.">>}
Data1 = binary_to_list(Data).
"{rssAPVg}.\r\nrssAPVg1.\r\nrssAPVg2.\r\nrssAPVg3."

 这是我sn.txt文件放的内容

{ok, Tokens, _} = erl_scan:string(binary_to_list(Data)).
{ok,[{'{',1},
     {atom,1,rssAPVg},
     {'}',1},
     {dot,1},
     {atom,2,rssAPVg1},
     {dot,2},
     {atom,3,rssAPVg2},
     {dot,3},
     {atom,4,rssAPVg3},
     {dot,4}],
    4}

 erl_scan:string返回值的具体组成请看官方文档http://www.erlang.org/doc/man/erl_scan.html#type-token

erl_scan:tokens的用法差不多,下面也给一个例子

erl_scan:tokens([],binary_to_list(Data),0,text).
{done,{ok,[{'{',[{line,0},{text,"{"}]},
           {atom,[{line,0},{text,"rssAPVg"}],rssAPVg},
           {'}',[{line,0},{text,"}"}]},
           {dot,[{line,0},{text,".\r"}]}],
          0},
      "\nrssAPVg1.\r\nrssAPVg2.\r\nrssAPVg3."}

 对于erl_scan:tokens来说,需要返回值中more进行尾递归进行调用erl_scan:tokens,如

scan_tokens(Code) ->
    case erl_scan:tokens([], Code, 1) of
        {done, {ok, Token, _}, Remain} ->
            scan_tokens(Remain);
        {more, _} ->
            []
    end.

 那这个模块有什么用呢?就是为后面erlang可以把从文件读取的text转成erlang特定的term或者是动态生成erlang模块做准备

分享到:
评论

相关推荐

    erl_nif 扩展erlang的另外一种方法

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

    Erl_B表查询小工具

    **Erl_B表查询小工具** 是一个专为处理Erl_B数据的实用程序,它提供了用户友好的界面,使得对Erl_B表的查询变得简单而高效。Erl_B通常指的是Erlang B模型,这是一个在电信行业中广泛使用的数学模型,用于估算交换机...

    erlang版本的protobuf(erl_protobuffs)

    1. **性能提升**:`erl_protobuffs`经过优化,相比其他Erlang的protobuf实现,如`protobuf-erl`或`thrift`,其解析和编码速度更快。这得益于Erlang自身的并发特性和轻量级进程,以及`erl_protobuffs`内部的高效算法...

    erl_nif_rustler_过程宏写法

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

    驻波比换算工具,Erl_B表等

    "小工具"可能是包含上述功能的软件包或集合,可能包括各种实用的小型应用程序,如驻波比计算器、Erl_B查询工具和功率换算器。这样的工具集大大简化了工程师的工作,使他们能够快速准确地进行通信系统的设计和故障...

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

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

    erl_aliases:为 Erlang 记录和模块名称定义(较短的)别名

    erl_aliases是一个 Erlang 解析转换库,它提供了一个简单直接的接口,用于为(较长)记录和模块名称定义(较短)别名。 定义后,可以使用别名代替原始名称。 基本原理 全局 Erlang 记录和模块名称往往相对较长。 长...

    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公共许可证。

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

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

    erl_embedded_redis:用于Erlang的嵌入式Redis服务器

    {erl_embedded_redis, ".*", {git, "https://github.com/gossiperl/erl_embedded_redis.git", {tag, "3.0.3"}}} ]}. rebar get-deps compile 直接从终端 git clone git://github....

    erl_gm:Erlang GraphicsMagick包装器

    **erl_gm:Erlang GraphicsMagick包装器** `erl_gm` 是一个用Erlang编写的库,其主要目的是为Erlang环境提供对GraphicsMagick库的接口。GraphicsMagick是一个强大的图像处理工具,支持广泛的图像格式,并提供了丰富...

    aleppo:备用Erlang预处理器

    传递由erl_scan返回的令牌,在应用了预处理器宏之后,将接收erl_scan兼容令牌的列表。 不执行Erlang代码解析! 支持-define,-undef,-ifdef,-ifndef,-else,-endif,-include,-include_lib 预处理器指令可在...

    erl_unused_includes

    这是一个 shell 脚本,可以用作 Erlang erlc 编译器的包装器,它通过多次编译文件并只保留编译工作实际需要的那些包含声明来消除源文件中不必要的包含声明。 该脚本采用与 erlc 相同的参数,除了一个额外的初始参数...

    erl_reabitmq-server 配套安装包.zip windows安装

    标题中的"erl_reabitmq-server 配套安装包.zip"是一个包含Erlang环境和RabbitMQ服务器的Windows安装包。Erlang是一种专门设计用于构建大规模并发系统的编程语言,而RabbitMQ是一个基于AMQP(Advanced Message ...

    erl_migrate:升级降级架构和迁移erlang应用程序数据库的数据的工具

    erl_migrate 升级/降级架构和迁移erlang应用程序数据库数据的工具 安装 运行make deps以安装depident 运行make来编译代码 用法 参数Options数据结构是map 创建迁移src文件 Args = #{ schema_name =&gt; mhs, ...

    erl_port_test:获取erlport连接Python和Elixir的小例子

    端口测试 这对我来说只是一个例子,还有谁需要它来使用 ErlPort 连接 Python 和 Elixir。 到目前为止,我只是将 erlport 库添加到我的依赖项中 { :erlport , github: " hdima/erlport " } 然后尝试在 iex 中调用它...

    erl_protobuffs:Google的Erlang协议缓冲区的实现,基于bashoerlang_protobuffs

    erl_protobuffs Google的Erlang协议缓冲区的实现,基于 。 该模块是其他开源模块和原始代码的组合,使与 Protocol Buffers 协议的接口变得容易。使用 .proto 文件该模块的主要目标是让开发人员能够轻松使用 .proto ...

    erlang高性能网络库esockd的编译和使用

    erlang高性能网络库esockd的编译和使用,erlang高性能网络库esockd的编译和使用

    erl_ex:在rebar3项目中使用来自erlang的elixir的示例

    erl_ex 这是在rebar3项目中使用elixir lib的示例建造$ rebar3 compile用法$ rebar3 shell===&gt; Fetching rebar_mix v0 . 4.0===&gt; Analyzing applications ...===&gt; Compiling rebar_mix===&gt; Verifying dependencies .....

Global site tag (gtag.js) - Google Analytics