【问题标题】:How to compile for the Erlang VM如何为 Erlang VM 编译
【发布时间】:2014-05-11 06:42:29
【问题描述】:

我正在尝试为应用程序中的用户脚本实现一种小型描述语言。基本上,用户描述了如何从其他对象创建对象。 (不是真正的编程语言)。我也可以使用 JSON(但会更冗长)。

我使用 leex 和 yecc,我有一个不错的解析树。说它是这样的:

{def,double,   %% function name double
    [{x}],     %% list of input names
    %% return expression, in this case {Operator, Operand1, Operand2}
    {'*',{var,x},{number,2}} 
}.

有了这棵树,我想构建这样的东西:

double(State) ->
    _Var1 = some_app:get_input(State,x),
    _Var1 * 2.

但我不知道从哪里开始。我可以在运行时读取树并构建乐趣,但我真的很想学习如何编译(并希望有更好的性能)。

我应该将我的解析树转换为 Erlang AST,然后编译 erlang 模块吗?

谢谢。

【问题讨论】:

  • 您可以尝试观看 Robert Virding 的一些视频。例如,Implemting Languages on the Erlang VM。我相信他至少有 2 或 3 个类似主题的视频。还有他的github,有几个代码示例。此外,您可以查看 ElixirJoxa,它们也在 Erlang VM 上实现。
  • 是的,我以长生不老药为例。我还找到了this,信息很好,但编译的代码非常小。不知道 Joxa,必须检查一下。谢谢

标签: compiler-construction erlang leex yecc


【解决方案1】:

所以,经典的工作流程是这样的:

  1. 定义标记并使用leex 构建词法分析器
  2. 使用yecc 定义语法并构建解析器
  3. 使用词法分析器标记源代码
  4. 使用输入令牌的解析器构建解析树
  5. 使用cerl生成核心erlang表单模块
  6. 使用compile 模块编译表单。它可以生成梁二进制文件以作为模块加载或创建.beam 文件

作为leex/yecc(LALR 解析器)的替代方案,我们可以使用neotoma,它适用于PEG 语法。这取决于你必须解析什么。我需要左递归并且不想处理空格。

作为目标,EVM (BEAM) 似乎很容易。编译最终只是简单地从一种语言翻译成另一种语言,Core Erlang 是一种非常简单的语言,但仍然富有表现力。

【讨论】:

  • 有没有办法可视化语法?也许是metacpan.org/pod/GraphViz2::Parse::Yacc
  • @TheMitraBoy 我认为您必须将语法转换为经典的 Yacc 语法文件(或任何其他流行格式)。我想我前段时间用它来生成铁路图,但我不记得了。
猜你喜欢
  • 2013-10-27
  • 2013-10-17
  • 2015-04-08
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2010-12-20
  • 1970-01-01
相关资源
最近更新 更多