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.//конец описания

Ссылки[править | править код]