Написание переводчика на OCaml

Я изучаю курс в моем университете, в котором меня просят написать переводчик на языке OCaml, начиная с его операционной семантики. К сожалению, они не дали нам много ресурсов, из которых мы можем узнать об этом, кроме как из слайдов урока. Может кто-нибудь предложить мне какую-нибудь книгу или какой-нибудь сайт, где я могу найти что-нибудь об этом (или подобное)? Благодарю.

3 ответа

Решение

Возможно, вам стоит попробовать " Типы и языки программирования " Б. Пирса, который, вероятно, является хорошим справочником по теме (особенно, если ваш язык ввода функционален).

Если вы хотите углубиться в семантику, я бы посоветовал Формальную семантику языков программирования Г. Винскеля. Но это не поможет вам в реализации.

Наконец, если в какой-то момент вам нужно скомпилировать свой язык, а не интерпретировать его, вам следует взглянуть на " Реализацию современного компилятора в ML " А. Аппеля.

Но эти книги, вероятно, излишни для того, что вы хотите сделать (ваших лекционных заметок должно быть достаточно).

Когда у вас есть подходящий тип данных, который представляет язык, это в основном вопрос перевода семантики, правило за правилом, с использованием сопоставления с образцом.

Например, учитывая этот тривиальный язык, который имеет целочисленные литералы, сложение и присваиваемые переменные:

type Expression = Literal of int | Variable of string | Addition of Expression * Expression;;
type Statement = Assignment of string * Expression | Sequence of Statement * Statement;;

и Store для хранения значений переменных:

type Store = <something>
lookup : Store -> string -> int
update : Store -> string -> int -> Store

мы могли бы определить семантические функции, подобные этим (я пропущу этап формального определения семантики):

let semE store = function
   | Literal l -> l
   | Variable x -> lookup store x
   | Addition e1 e2 -> (semE e1 store) + (semE e2 store);;

let semS store = function
   | Assignment x e -> update store x (semE e store)
   | Sequence (s1, s2) -> let store' = semS store s1 
                          in semS store' s2;;

Это полный интерпретатор языка, но у него нет парсера для перевода синтаксиса языка в приведенное выше представление.

Например,

semS (Sequence (Assignment "x" (Literal 3), 
                Assignment "x" (Addition (Variable "x") (Literal 1)))) 
      empty_store

который может быть представлен на языке ввода как x := 3; x := x + 1, должен привести к Store где x имеет значение 4,

Я бы предложил этот MOOC (на английском!): Ocamlmooc

Книги (те, которые я использую... но есть много других):
Разработка приложений с помощью Ocaml
реальный мир ocaml.

В первой книге взгляните на главу 6, которая должна вас удержать.

Другие вопросы по тегам