Coco/R

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

Введение[править | править исходный текст]

Сосо/R — программа генерации компиляторов или интерпретаторов языка. Программа читает файл с атрибутивной грамматикой исходного языка, в форме РБНФ (Расширенная форма Бэкуса — Наура) и генерирует ряд файлов для этого языка:

Лексический анализатор работает как конечный автомат. Синтаксический анализатор использует методику нисходящего рекурсивного спуска. Использование Сосо/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.//конец описания

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