F # синтаксический анализ Абстрактные синтаксические деревья

Каков наилучший способ использования F # для анализа АСТ для построения интерпретатора? Существует множество примеров F # для тривиального синтаксиса (базовые арифметические операции), но я не могу найти ничего для языков с гораздо большим диапазоном функций.

Дискриминационные союзы выглядят невероятно полезными, но как бы вы решили построить один с большим количеством вариантов? Лучше ли определять типы (например, сложение, вычитание, условные выражения, поток управления) в другом месте и просто объединять их как предопределенные типы в объединении?

Или я пропустил гораздо более эффективные способы написания переводчиков? Имеет ли функция eval для каждого типа более эффективную или, возможно, использование монад?

Заранее спасибо

Ответ 1

Дискриминационные союзы выглядят невероятно полезный, но как бы вы о строительстве одного с большим количество вариантов? Лучше ли определить типы (например, добавление, вычитание, условные обозначения, контроль поток) в другом месте и просто принести их вместе как предопределенные типы в союз?

Я не уверен, что вы спрашиваете здесь; даже с большим количеством опций, DU все еще просты в определении. См. эта запись в блоге для крошечной структуры DU языка (а также более общая дискуссия о написании древовидных преобразований). Прекрасно иметь DU со многими другими случаями и распространять в компиляторах/интерпретаторах такое представление.

Что касается синтаксического анализа, я предпочитаю комбинаторы монодического парсера; проверьте FParsec или посмотрите эту старую запись в блоге. После использования таких комбинаторов синтаксиса я никогда не могу вернуться к чему-то вроде lex/yacc/ANTLR - внешние DSL кажутся настолько примитивными в сравнении.

(EDIT: "Крошечные арифметические примеры", которые вы нашли, вероятно, довольно репрезентативны, как выглядят более крупные решения. Примеры "игрушек" обычно демонстрируют правильную архитектуру.)

Ответ 2

Вы должны взять копию Роберта Пикеринга "Начало F #".

В главе 13 "Анализ текста" содержится пример с FsLex и FsYacc, как было предложено Noldorin.

Кроме того, в той же книге, глава 12, автор объясняет, как создать простой простой компилятор для арифметического языка, который он предлагает. Очень просветительская. Наиболее важная часть - то, что вы ищете: анализатор АСТ.

Удачи.

Ответ 3

Второе предложение Брайана взглянуть на FParsec. Если вы заинтересованы в том, чтобы делать что-то в старой школе с FsLex и FsYacc, одно место, чтобы искать, как разбирать нетривиальный язык, - это сам источник F #. См. Каталог source\fsharp\FSharp.Compiler в дистрибутиве.

Ответ 4

Я сам не сделал переводчика. Надеюсь, что следующее поможет:)

Здесь курс компилятора, преподаваемый в Йельском университете с использованием ML, который вам может пригодиться. Лекционные заметки очень сжатые (короткие) и информативные. Вы можете следовать первым лекциям и заданиям. Как вы знаете F #, у вас не будет проблем с чтением программ ML.

Btw, профессор был учеником А. Аппеля, который является создателем реализации SML. Таким образом, из этих заметок вы также получаете наиболее естественный способ написать компилятор/интерпретатор на семейном языке ML.

Ответ 5

Вам может быть интересно узнать раздел Lexing and Parsing в F # WikiBook. F # PowerPack library содержит инструменты FsLex и FsYacc, которые очень сильно помогают в этом. Руководство WikiBook - это хороший способ начать с этого.

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