IDEA支持erlang的protobuffer定义的结构体直接跳转到proto文件

简介

erlang的protobuffer使用无论是使用erlang_protobuffs还是gpb,一般都是将proto转成erlang的record,然后编码的时候使用record来进行编写。当然gpb也支持将proto转换成maps格式,但是maps格式在IDE上的提示无法做的很完善。因此本文还是基于gpb转换的record形式的proto来做介绍

依赖

  • 测试环境基于IDEA 2020.1,需要提前安装好erlang插件
  • 之后便是关键的proto插件,proto插件在Google开源后有人进行了维护proto插件,现在已经支持,java,python,golang的直接跳转;
  • erlang的跳转是我在插件版本的基础上扩展的,目前还没有PR到主线上,可以直接下载打包好的插件;
    提取码: p6g5
  • 不放心的话可以自己去下载分支进行编译,项目用了bazel,bazel目前对windows的支持很弱,因此可能需要在mac或者linux下进行编译

使用<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用erlang自带的leex和yecc库来完成这个任务。具体实现步骤如下: 1. 首先,需要定义一个leex词法分析器来将文件解析成token序列。这里需要定义一些正则表达式来匹配record定义及其名称,如下所示: %% 定义 leex 词法分析器 -define(TOKEN_RECORD, {record, Token}). -define(TOKEN_ID, {id, Token}). % 定义正则表达式 RECORD_NAME_RE = "[a-zA-Z_][a-zA-Z0-9_]*". RECORD_START_RE = "-record\\(". RECORD_END_RE = "\\)\\.?\n?". % 定义 token 匹配规则 RecordStart = {regex, RECORD_START_RE, fun(_, _) -> {skip, token} end}. RecordEnd = {regex, RECORD_END_RE, fun(_, _) -> {skip, token} end}. RecordName = {regex, RECORD_NAME_RE, fun(TokenStr, _) -> {ok, [{?TOKEN_RECORD, TokenStr}]} end}. Id = {regex, "[a-zA-Z_][a-zA-Z0-9_]*", fun(TokenStr, _) -> {ok, [{?TOKEN_ID, TokenStr}]} end}. % 定义完整的 leex 规则 Rules = [RecordStart, RecordEnd, RecordName, Id]. 2. 接下来,需要定义一个yecc语法分析器来解析token序列,并提取所有的record定义。这里使用的是递归下降算法,具体实现如下: % 定义语法规则 -define(RULES, [ {expression, [ {any, [ {?TOKEN_RECORD, fun process_record/1}, {_, fun ignore/1} ]} ]} ]). % 定义语法动作 process_record(Token) -> TokenStr = element(2, Token), io:format("Found record definition: ~s\n", [TokenStr]). ignore(_) -> ok. % 定义完整的语法规则 Grammar = {grammar, ?RULES}. % 定义解析函数 parse(TokenList) -> Yecc = yecc:new(Grammar), {ok, AST, _} = yecc:parse(Yecc, expression, TokenList), AST. 3. 最后,需要将leex和yecc整合起来,并编写一个主函数来调用它们。具体实现如下: % 定义主函数 main(FileName) -> {ok, FileData} = file:read_file(FileName), TokenList = leex:scan_tokens(string:strip(FileData)), AST = parse(TokenList), io:format("Finished parsing file: ~s\n", [FileName]), ok. % 调用主函数 main("test.erl"). 其中,test.erl是待解析的文件名。运行结果将打印出所有的record定义名称。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值