2013-07-08 8 views
3

Я пытаюсь реализовать небольшой язык описания для пользовательских сценариев в приложении. В основном пользователи описывают, как объекты создаются из других объектов. (Не совсем язык программирования). Я мог бы использовать JSON (но это было бы более подробным).Как скомпилировать для Erlang VM

Я использую 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?

Спасибо.

+1

нашел это http://www.cs.indiana.edu/~dyb/pubs/nano-jfp.pdf – niahoo

+1

Вы можете попробовать посмотреть видеоролики Роберта Вирдинга. Например, [Импорт языков на Erlang VM] (http://www.youtube.com/watch?v=hry_BUidOAk). Я считаю, что у него есть по крайней мере 2 или 3 видео на аналогичные темы. Также его [github] (https://github.com/rvirding) содержит несколько примеров кода. Кроме того, вы можете проверить [Elixir] (http://elixir-lang.org/) или [Joxa] (http://joxa.org/), которые также реализованы на виртуальной машине Erlang. – Nym

+0

Да, я беру пример на эликсир. Я также нашел [это] (http://ninenines.eu/articles/xerl-0.2-two-modules), хорошая информация, но очень маленький код скомпилирован. не знал Джокса, должен проверить это. благодаря – niahoo

ответ

3

Итак, классический рабочий процесс заключается в следующем:

  1. Определение маркеров и построить лексер с leex
  2. Определением грамматики и построить синтаксический анализатор с yecc
  3. разметить исходный код с лексером
  4. Построение дерева синтаксического анализа с помощью синтаксического анализатора, подаваемого с токенами
  5. Создание модуля форм эрлангов с сердечником cerl
  6. Скомпилированные формы с модулем compile. Это может дать бинарники луч для загрузки в виде модуля или создать файл .beam

В качестве альтернативы leex/yecc (LALR парсер), мы можем использовать neotoma, который работает с ПЭГ грамматик. Это зависит от того, что вам нужно проанализировать. Там мне нужна левая рекурсия и я не хочу обрабатывать пробелы.

В качестве цели EVM (BEAM) кажется довольно простым. Компиляция заканчивается, чтобы просто перевести с одного языка на другой, а Core Erlang - очень простой язык, но все же выразительный.