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, а затем подправил ручками, соответственно, сгенерированный код. Так проще, чтобы не перегружать пример излишними деталями.)