Что лучший способ состоит в том, чтобы использовать F#, чтобы разобрать AST, чтобы построить переводчика? Есть много примеров F# для тривиального синтаксиса (основные арифметические операции), но я, может казаться, ничего не нахожу для языков с намного большими диапазонами особенностей.
Различаемые союзы надеются быть incrediably полезными, но как Вы пошли бы о строительстве того с большим числом вариантов? Лучше определить типы (скажите, что дополнение, вычитание, условные предложения, управляет потоком), в другом месте, и просто объедините их как предопределенные типы в союзе?
Или я пропустил некоторое намного более эффективное средство пишущих переводчиков? Функция оценки для каждого типа имеет более эффективный, или возможно использует монады?
Заранее спасибо
Дизъюнктные объединения надеются быть incrediably полезный, но как был бы вы пойти о построении того с большим число вариантов? Лучше определить типы (скажите дополнение, вычитание, условные выражения, управление поток), в другом месте и просто приносят им вместе как предварительно определенные типы в объединение?
я не уверен, что вы спрашиваете здесь; даже с большим числом вариантов, DUs все еще просты определить. Посмотрите, например, эта запись в блоге для структуры крошечного языка DU (а также более общая дискуссия о записи, что дерево преобразовывает). Хорошо иметь DU со значительно большим количеством чехлов, и распространенный в компиляторах/интерпретаторах для использования такого представления.
Что касается парсинга, я предпочитаю одноместный синтаксический анализатор combinators; выезд FParsec или видит эта старая запись в блоге . После использования такого синтаксического анализатора combinators, я никогда не могу возвращаться ни к чему как lex/yacc/ANTLR - внешние DSL кажутся настолько примитивными в сравнении.
(РЕДАКТИРОВАНИЕ: 'крошечные арифметические примеры' вы нашли, являются, вероятно, в значительной степени представительными для того, на какие большие решения похож также. 'Игрушечные' примеры обычно представляют правильную архитектуру.)
Не совсем ответ на ваш вопрос, но, похоже, вам лучше воспользоваться методом 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 .
Удачи.
Я предложение вторым Брайаном взглянуть на FPARSEC. Если вы заинтересованы в том, чтобы делать вещи старого школы с FSLEX и FSYACC, одно место для поиска того, как разбирать нетривиальный язык - сам источник F #. Смотрите каталог Source \ fsharp \ fsharp.compiler
в распределении.
Вы можете быть интересным при проверке LEXING и разборки раздел F # Wikibook. F # Библиотека PowerPack содержит инструменты FSLEX и FSYACC , который значительно назыскал с этим. Руководство Wikibook - это хороший способ начать с этим.
Кроме того, вам нужно будет подумать о том, как вы действительно хотите выполнить код из формы AST, что является распространенным дизайном как компиляторов, так и переводчиков. Однако это обычно считается более легкой частью, и существует множество общих ресурсов на компиляторов / интерпретатере, которые должны предоставить информацию об этом.
Я сам не делал интерпретатора. Надеюсь, поможет:)
Здесь курс компилятора, преподаваемый в Йеле с использованием ML, который может оказаться полезным. Конспекты лекций очень лаконичны (короткие) и информативны. Вы можете следовать первым нескольким конспектам лекций и заданиям. Как вы знаете, F#, у вас не будет проблем с чтением программ на ML.
Btw, профессор был студентом А. Аппеля, который является создателем реализации SML. Так что из этих заметок Вы также получаете самый естественный способ написания компилятора/переводчика на языке семейства ML.