Написание переводчика на 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, которая должна вас удержать.