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的另外一种方法
Erl_B表查询小工具
erlang-erl_interface-19.3.6.4-1.el7.x86_64.rpm
驻波比换算工具,Erl_B表,功率换算工具
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
{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_scan返回的令牌,在应用了预处理器宏之后,将接收erl_scan兼容令牌的列表。 不执行Erlang代码解析! 支持-define,-undef,-ifdef,-ifndef,-else,-endif,-include,-include_lib 预处理器指令可在...
这是一个 shell 脚本,可以用作 Erlang erlc 编译器的包装器,它通过多次编译文件并只保留编译工作实际需要的那些包含声明来消除源文件中不必要的包含声明。 该脚本采用与 erlc 相同的参数,除了一个额外的初始参数...
原贴 https://blog.csdn.net/ap114/article/details/118092301 用rust 开发 erlang nif的正确做法
erl_migrate 升级/降级架构和迁移erlang应用程序数据库数据的工具 安装 运行make deps以安装depident 运行make来编译代码 用法 参数Options数据结构是map 创建迁移src文件 Args = #{ schema_name => mhs, ...
这个erlang版本的protobuf,做了改进,效率有很大提升,配套文章地址http://blog.csdn.net/mycwq/article/details/42122439
端口测试 这对我来说只是一个例子,还有谁需要它来使用 ErlPort 连接 Python 和 Elixir。 到目前为止,我只是将 erlport 库添加到我的依赖项中 { :erlport , github: " hdima/erlport " } 然后尝试在 iex 中调用它...
erl_aliases是一个 Erlang 解析转换库,它提供了一个简单直接的接口,用于为(较长)记录和模块名称定义(较短)别名。 定义后,可以使用别名代替原始名称。 基本原理 全局 Erlang 记录和模块名称往往相对较长。 长...
otp_win64_22.3.exe 和 rabbitmq-server-3.8.14.exe
erl_protobuffs Google的Erlang协议缓冲区的实现,基于 。 该模块是其他开源模块和原始代码的组合,使与 Protocol Buffers 协议的接口变得容易。使用 .proto 文件该模块的主要目标是让开发人员能够轻松使用 .proto ...
erl_gm:Erlang GraphicsMagick包装器
erl_ex 这是在rebar3项目中使用elixir lib的示例建造$ rebar3 compile用法$ rebar3 shell===> Fetching rebar_mix v0 . 4.0===> Analyzing applications ...===> Compiling rebar_mix===> Verifying dependencies .....
ransac代码erl_egomotion 与关联的代码。 预期残留可能性和相关方法的实现。 有关代码的示例用法,请参阅Tests / Sample.m。 此回购用作对极RANSAC成本函数的实现。 它还希望您拥有。 引用:Jaegle,A.,Phillips,S...