amnick
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору DV Цитата: А есть где-нибудь инфо о Coco/R и пару примерчиков? | Заходишь по той ссылке, что я давал, и читаешь. Правда, материал на английском, на русском я не встречал. Есть книга "Compilers and Compiler Generators: An Introduction with C++", by Pat Terry. Она есть и в Интернете, на той же страничке есть ссылка на нее (http://www.scifac.ru.ac.za/compilers). Примеры, как я уже писал, имеются в распространяемом пакете. Там есть и файл для Си ("An attempt to describe a subset of C"). Цитата: Кстати говоря, позволю себе спросить о передаче папрметров: а именно < > . Как это осуществляется? | Да очень просто: то, что записано в угловых скобках, в таком точно виде и передается в качестве формальных параметров функции. Например, описание паскале-подобной записи (RECORD) может выглядеть примерно так (это упрощенный вариант, например, в нем ';' перед END обязательно, если хотя бы один член объявлен): RecordType < t_type* typ, t_id* id > = (. t_struct* s; t_member* m_last = 0; // pointer to the last declared member .) 'RECORD' (. s = new t_struct(); //s->members = 0; - already 0 because of overridden new s->id = id; typ->typ = s; localEntry( id->name ); .) { MemberDecl < s, &m_last > ';' } 'END' (. localEnd( id ); .) . На С получается такой код: static void RecordType (t_type* typ, t_id* id ) { t_struct* s; t_member* m_last = 0; // pointer to the last declared member ; Expect(RECORDSym); s = new t_struct(); //s->members = 0; - already 0 because of overridden new s->id = id; typ->typ = s; localEntry( id->name ); while (Sym == IdentifierSym) { MemberDecl(s, &m_last ); Expect(SemicolonSym); } Expect(ENDSym); localEnd( id ); } (На самом деле, я несколько упростил исходный код для COCO/R, а затем подправил ручками, соответственно, сгенерированный код. Так проще, чтобы не перегружать пример излишними деталями.) |