Coco/R
Coco/R | |
---|---|
Тип | Parser/scanner generator |
Автор | Hanspeter Mössenböck and others |
Аппаратная платформа | Cross-platform |
Лицензия | GNU GPL |
Сайт | ssw.jku.at/Research/Projects/Coco/ |
Введение
Сосо/R — программа генерации компиляторов или интерпретаторов языка. Программа читает файл с атрибутивной грамматикой реализуемого языка, описанной в форме РБНФ (Расширенная форма Бэкуса — Наура, EBNF) и генерирует ряд файлов:
- исходники лексического анализатора (сканера); работает как детерминированный конечный автомат.
- исходники синтаксического анализатора (парсера); использует метод нисходящего рекурсивного спуска.
- информационные файлы (лог, таблица лексем языка).
Использование Сосо/R является очень простым. Создаваемый программой код является быстрым и лёгким для понимания.
Сама программа уже реализована на множестве языков, и генерирует исходники компилятора так же на множестве языков. Существуют версии Сосо/R, создающие исходники на Java, C++, C#, Delphi, Pascal, Ada, Modula-2, Modula-3, Oberon, Component Pascal и других языках.
Разработка своего языка заключается в разработке файла грамматики языка. В грамматику языка добавляется специального вида комментарии (. .), в которых заключен код для выполнения дополнительных действий. Как правило, это код для занесения данных в таблицы идентификаторов, генерации кода или его интерпретации.
Версия Сосо/R для языка С#
Входной файл для Сосо/R имеет расширение .ATG и содержит наборы символов языка, лексемы и продукции языка, описывающие структуру компилируемого языка и вставки на языке С#.
Сосо/R генерирует классы сканера и парсера на языке C# (Scanner.cs, Parser.cs) Так же автоматически создаётся обработчик ошибок (он входит в состав Parser.cs), что впоследствии позволяет выводить при анализе программ пользователя список ошибок с указанием их мест. Таким образом, программа автоматизированной генерации компиляторов Сосо/R значительно облегчает процесс создания компиляторов.
Пример
В данном случае Сосо/R описывает грамматики вида:
- S -> aU | bV
- U -> bV | bS | e
- V -> a | b
COMPILER CLN //название языка
public System.Windows.Forms.TextBox text; //имя текст-бокса в нашем компиляторе на языке, на котором он пишется (C#)
public string Production=""; //переменная в программе компилятора с продукциями
public string Conditions="";
public string dd; //промежуточная строка
CHARACTERS //раздел, в котором описываются допустимые символы, разбитые на группы
Blet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ". //большие буквы
Slet = "abcdefghijklmnopqrstuvwxyz". //маленькие..))
TOKENS //токены, они же лексемы. Структурные единицы, из которых состоит описываемый входной язык компилятора
Unterminal = Blet. //например, нетерминалы могут быть любой буквой и группы, описанной выше как Blet, т.е. все большие буквы
Product = Slet {Blet|Slet}. //аналогично, продукции состоят из одной маленькой буквы и далее энное колво больших и маленьких букв (эн от 0 до бесконеч)
Cr = '\r'|'\n'. //возможные варианты конца строки
goto = "->". //стрелочка
Divider = "|". //разделитель продукций
COMMENTS FROM "//" TO '\n' //комментарии - будет игнорироваться
IGNORE '\t'+' ' //список игнорируемых символов, в данном случае табуляция и пробелы
PRODUCTIONS //раздел с описанием структуры входного языка компилятора, в данном случае - грамматики)
CLN = //начало описания, описывается в виде набора описанных выше токенов. в фигурных скобках, как и выше - значит что кусок может не быть, а может быть от 1 до много раз)
//в квадратных скобках (здесь нету..) - либо 0, либо 1 раз)
{
Unterminal (. Conditions+=t.val; .)
goto
Product (. Production+=t.val+" "; .)
{
Divider
Product (. Production+=t.val+" "; .)
}
(. Production+='\n'; .) //в (. .) идут вставки на конечном языке (си шарпе), которые без изменения будут перенесены в парсер и сканер
{Cr}
}.
END CLN.//конец описания
Ссылки
- The Compiler Generator Coco/R (англ.). Дата обращения: 20 января 2021. Архивировано 7 марта 2009 года.
- Ada Coco/R - Руководство пользователя (недоступная ссылка). Архивировано 3 марта 2012 года.