F#, разбирающий Абстрактные Деревья Синтаксиса

Что лучший способ состоит в том, чтобы использовать F#, чтобы разобрать AST, чтобы построить переводчика? Есть много примеров F# для тривиального синтаксиса (основные арифметические операции), но я, может казаться, ничего не нахожу для языков с намного большими диапазонами особенностей.

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

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

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

11
задан Chris 13 January 2010 в 15:59
поделиться

5 ответов

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

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

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

(РЕДАКТИРОВАНИЕ: 'крошечные арифметические примеры' вы нашли, являются, вероятно, в значительной степени представительными для того, на какие большие решения похож также. 'Игрушечные' примеры обычно представляют правильную архитектуру.)

13
ответ дан 3 December 2019 в 04:52
поделиться

Не совсем ответ на ваш вопрос, но, похоже, вам лучше воспользоваться методом std:: Последовательности:: find .

Что-то подобное:

const char * const pc = "ABC";
string s = "Test ABC Strings";
size_t pos = s.find(pc);
-121--4121292-

Я использовал стеки для обработки изображений, где в URL-адресе должен быть указан «язык обработки». Форма на основе стека позволяет представить дерево операций в простой в разборе и размышлении форме.

См.:

http://www.hackification.com/2008/10/29/stack-based-processing-part-1/

и

http://www.hackification.com/2008/10/29/stack-based-processing-part-2/

-121--3048014-

Вам следует взять копию «Beginning F #» Роберта Пикеринга.

Глава 13 «Анализ текста» содержит пример с FsLex и FsYacc , как предложил Нолдорин.

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

Удачи.

3
ответ дан 3 December 2019 в 04:52
поделиться

Я предложение вторым Брайаном взглянуть на FPARSEC. Если вы заинтересованы в том, чтобы делать вещи старого школы с FSLEX и FSYACC, одно место для поиска того, как разбирать нетривиальный язык - сам источник F #. Смотрите каталог Source \ fsharp \ fsharp.compiler в распределении.

3
ответ дан 3 December 2019 в 04:52
поделиться

Вы можете быть интересным при проверке LEXING и разборки раздел F # Wikibook. F # Библиотека PowerPack содержит инструменты FSLEX и FSYACC , который значительно назыскал с этим. Руководство Wikibook - это хороший способ начать с этим.

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

2
ответ дан 3 December 2019 в 04:52
поделиться

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

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

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

2
ответ дан 3 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: