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モジュールとしてロードするか、ファイルを作成する Beam バイナリを生成できます。

leex/yecc(LALR パーサー)の代わりに、PEG 文法で動作するneotomaを使用できます。それはあなたが解析しなければならないものに依存します。そこでは、左再帰が必要で、空白を処理したくありませんでした。

ターゲットとしては、EVM (BEAM) は非常に簡単に思えます。コンパイルは、ある言語から別の言語に単純に変換するだけで終わります。Core Erlang は非常に単純な言語ですが、それでも表現力があります。

于 2013-07-19T13:36:35.943 に答える