Встраивание предметно-ориентированного языка в OCaml верхнего уровня - в Camlp4 или нет?
У меня есть код, который включает в себя menhir
синтаксический анализатор для предметно- ориентированного языка (логика). Ради здравого смысла во время отладки, было бы здорово иметь возможность печатать экземпляры этого языка (формулы) непосредственно на верхнем уровне следующим образом:
# f = << P(x,y) & x!=y >>
Является campl4/5
мой единственный вариант? Если да, я нахожу документацию довольно пугающей. Есть ли пример / учебник, который достаточно близок к моему сценарию использования и который я мог бы адаптировать? (Например, синтаксические расширения, которые вводят новые ключевые слова, не кажутся актуальными). Спасибо!
2 ответа
Если вы хотите вызвать функцию для анализа, вы можете использовать ocamlmktop
включить ваш парсер в верхний уровень. Затем вы можете установить принтеры для ваших типов, используя #install_printer
, Сессии могут выглядеть так:
# let x = parse ()
<< type your expression here >>
# x : type = <<formatted version>>
Я использовал специальные принтеры, и они определенно очень помогают со сложными типами. Я никогда не удосужился использовать ocamlmktop
, Я всегда просто загружаю свой код с #load
а также #use
,
Это намного проще, чем освоение camlp4/5 (ИМХО). Но, возможно, это слишком грубо.
Да, вы можете использовать camlp4, и он будет работать достаточно хорошо (в том числе на верхнем уровне), но нет, он не очень хорошо документирован, и вам придется с этим справляться.
Пример, близкий к вашему сценарию использования, приведен в примере цитаты лямбда-исчисления вики Camlp4.
Для верхнего уровня это будет работать легко. Вы можете динамически загрузить "camlp4o.cmo", а затем ваше синтаксическое расширение на верхний уровень, или использовать findlib, который обрабатывает это: с верхнего уровня, #use "topfind";;
, затем #camlp4o;;
, затем #require "myfoo.syntax";;
где myfoo.syntax
это имя пакета findlib, который вы создали для развертывания вашего расширения.