4

我正在尝试为应用程序中的用户脚本实现一种小型描述语言。基本上,用户描述了如何从其他对象创建对象。(不是真正的编程语言)。我也可以使用 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 模块吗?

谢谢。

4

1 回答 1

4

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

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

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

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

于 2013-07-19T13:36:35.943 回答