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

Напишите отзыв о статье "Coco/R"

Ссылки

  • [www.ssw.uni-linz.ac.at/Research/Projects/Coco/ The Compiler Generator Coco/R] (англ.). [www.webcitation.org/65ta0cBD6 Архивировано из первоисточника 3 марта 2012].
  • [www.ada-ru.org/files/cocor_doc_ru.zip Ada Coco/R - Руководство пользователя] (рус.). [www.webcitation.org/65ta1A7IH Архивировано из первоисточника 3 марта 2012].

Отрывок, характеризующий Coco/R

«Я ранен, верхом ездить не могу, следственно и командовать армией. Вы кор д'арме ваш привели разбитый в Пултуск: тут оно открыто, и без дров, и без фуража, потому пособить надо, и я так как вчера сами отнеслись к графу Буксгевдену, думать должно о ретираде к нашей границе, что и выполнить сегодня.
«От всех моих поездок, ecrit il a l'Empereur, получил ссадину от седла, которая сверх прежних перевозок моих совсем мне мешает ездить верхом и командовать такой обширной армией, а потому я командованье оной сложил на старшего по мне генерала, графа Буксгевдена, отослав к нему всё дежурство и всё принадлежащее к оному, советовав им, если хлеба не будет, ретироваться ближе во внутренность Пруссии, потому что оставалось хлеба только на один день, а у иных полков ничего, как о том дивизионные командиры Остерман и Седморецкий объявили, а у мужиков всё съедено; я и сам, пока вылечусь, остаюсь в гошпитале в Остроленке. О числе которого ведомость всеподданнейше подношу, донеся, что если армия простоит в нынешнем биваке еще пятнадцать дней, то весной ни одного здорового не останется.
«Увольте старика в деревню, который и так обесславлен остается, что не смог выполнить великого и славного жребия, к которому был избран. Всемилостивейшего дозволения вашего о том ожидать буду здесь при гошпитале, дабы не играть роль писарскую , а не командирскую при войске. Отлучение меня от армии ни малейшего разглашения не произведет, что ослепший отъехал от армии. Таковых, как я – в России тысячи».
«Le Marieechal se fache contre l'Empereur et nous punit tous; n'est ce pas que с'est logique!
«Voila le premier acte. Aux suivants l'interet et le ridicule montent comme de raison. Apres le depart du Marieechal il se trouve que nous sommes en vue de l'ennemi, et qu'il faut livrer bataille. Boukshevden est general en chef par droit d'anciennete, mais le general Benigsen n'est pas de cet avis; d'autant plus qu'il est lui, avec son corps en vue de l'ennemi, et qu'il veut profiter de l'occasion d'une bataille „aus eigener Hand“ comme disent les Allemands. Il la donne. C'est la bataille de Poultousk qui est sensee etre une grande victoire, mais qui a mon avis ne l'est pas du tout. Nous autres pekins avons, comme vous savez, une tres vilaine habitude de decider du gain ou de la perte d'une bataille. Celui qui s'est retire apres la bataille, l'a perdu, voila ce que nous disons, et a ce titre nous avons perdu la bataille de Poultousk. Bref, nous nous retirons apres la bataille, mais nous envoyons un courrier a Petersbourg, qui porte les nouvelles d'une victoire, et le general ne cede pas le commandement en chef a Boukshevden, esperant recevoir de Petersbourg en reconnaissance de sa victoire le titre de general en chef. Pendant cet interregne, nous commencons un plan de man?uvres excessivement interessant et original. Notre but ne consiste pas, comme il devrait l'etre, a eviter ou a attaquer l'ennemi; mais uniquement a eviter le general Boukshevden, qui par droit d'ancnnete serait notre chef. Nous poursuivons ce but avec tant d'energie, que meme en passant une riviere qui n'est рas gueable, nous brulons les ponts pour nous separer de notre ennemi, qui pour le moment, n'est pas Bonaparte, mais Boukshevden. Le general Boukshevden a manque etre attaque et pris par des forces ennemies superieures a cause d'une de nos belles man?uvres qui nous sauvait de lui. Boukshevden nous poursuit – nous filons. A peine passe t il de notre cote de la riviere, que nous repassons de l'autre. A la fin notre ennemi Boukshevden nous attrappe et s'attaque a nous. Les deux generaux se fachent. Il y a meme une provocation en duel de la part de Boukshevden et une attaque d'epilepsie de la part de Benigsen. Mais au moment critique le courrier, qui porte la nouvelle de notre victoire de Poultousk, nous apporte de Petersbourg notre nomination de general en chef, et le premier ennemi Boukshevden est enfonce: nous pouvons penser au second, a Bonaparte. Mais ne voila t il pas qu'a ce moment se leve devant nous un troisieme ennemi, c'est le православное qui demande a grands cris du pain, de la viande, des souchary, du foin, – que sais je! Les magasins sont vides, les сhemins impraticables. Le православное se met a la Marieaude, et d'une maniere dont la derieniere campagne ne peut vous donner la moindre idee. La moitie des regiments forme des troupes libres, qui parcourent la contree en mettant tout a feu et a sang. Les habitants sont ruines de fond en comble, les hopitaux regorgent de malades, et la disette est partout. Deux fois le quartier general a ete attaque par des troupes de Marieaudeurs et le general en chef a ete oblige lui meme de demander un bataillon pour les chasser. Dans une de ces attaques on m'a еmporte ma malle vide et ma robe de chambre. L'Empereur veut donner le droit a tous les chefs de divisions de fusiller les Marieaudeurs, mais je crains fort que cela n'oblige une moitie de l'armee de fusiller l'autre.