Это часть серии вопросов, посвященных проекту, связанному с проектом Abstraction Project, целью которого является абстракция концепций, используемых в языковом дизайне, в форме фреймворка. Родственный проект называется OILexer, целью которого является создание синтаксического анализатора из файлов грамматики без использования внедрения кода в совпадениях.
Некоторые другие страницы, связанные с этими вопросами, связанные со структурной типизацией, можно посмотреть здесь , а простоту использования можно найти здесь . Мета-тема, связанная с запросом о фреймворке и подходящем месте для публикации, может быть найдена здесь .
Я подхожу к тому, что собираюсь начать извлечение дерева разбора из заданной грамматики, за которым следует парсер рекурсивного спуска, который использует DFA для распознавания прямых путей (аналогично LL (*)) в ANTLR 4, поэтому я подумал, что я открою это, чтобы получить представление.
Какие компиляторы идеальны в компиляторе парсера?
Итак, вот краткий обзор того, что реализовано:
- Шаблоны
- Посмотрите вперед прогнозирование, зная, что действительно в данный момент.
- Правило «Делитерализация» берет литералы в правилах и определяет, из какого они токена.
- Недетерминированные автоматы
- Детерминированные автоматы
- Простой лексический конечный автомат для распознавания токенов
- Методы автоматизации токенов:
- Сканирование - полезно для комментариев: Комментарий: = "/ *" Сканирование ("* /");
- Subtract - полезно для идентификаторов: Identifier: = Subtract (IdentifierBody, Keywords);
- Гарантирует, что идентификатор не принимает ключевые слова.
- Кодировать - кодирует автоматизацию в виде серии X с количеством базовых N переходов.
- UnicodeEscape: = "\\ u" BaseEncode (IdentifierCharNoEscape, 16, 4);
- Делает Unicode escape в шестнадцатеричном, с шестнадцатеричным 4-переходом. Разница между этим и: [0-9A-Fa-f] {4} заключается в том, что автоматизация с Encode ограничивает допустимый набор шестнадцатеричных значений областью действия IdentifierCharNoEscape. Так что, если вы дадите ему \ u005c, версия кодирования не примет значение. Такие вещи имеют серьезное предостережение: используйте экономно. В результате автоматизация может быть довольно сложной.
- UnicodeEscape: = "\\ u" BaseEncode (IdentifierCharNoEscape, 16, 4);
Что не реализовано, так это генерация CST, мне нужно настроить детерминированные автоматы, чтобы перенести соответствующий контекст, чтобы заставить это работать.
Для всех, кто интересуется, я загрузил довольно напечатанную оригинальную форму проекта T * y♯ . Каждый файл должен ссылаться на каждый другой файл, я начал ссылаться в отдельных правилах, чтобы следовать им, но это заняло бы слишком много времени (было бы проще автоматизировать!)
Если нужно больше контекста, пожалуйста, напишите соответственно.
Изменить 5-14-2013 : я написал код для создания графиков GraphViz для конечных автоматов в рамках данного языка. Вот орграф GraphViz AssemblyPart . Члены, связанные в описании языка, должны иметь rulename.txt в соответствующей папке с орграфом для этого правила. Некоторое описание языка изменилось с момента публикации примера, это связано с упрощением грамматики. Вот интересное графическое изображение .