Хрестоматия по программированию на Си в Unix




Текстовая обработка. Хрестоматия по программированию на Си в Unix


Разработайте архитектуру и систему команд учебной машины и напишите интерпретатор учебного ассемблера, отрабатывающего по крайней мере такие команды:

mov пересылка (:=) add сложение sub вычитание cmp сравнение и выработка признака jmp переход jeq переход, если == jlt переход, если < jle переход, если <= neg изменение знака not инвертирование признака

Напишите программу, преобразующую определения функций Си в "старом" стиле в "новый" стиль стандарта ANSI ("прототипы" функций).

f(x, y, s, v) int x; char *s; struct elem *v; { ... }

преобразуется в

int f(int x, int y, char *s, struct elem *v) { ... }

(обратите внимание, что переменная y и сама функция f описаны по умолчанию как int).

Еще пример:

char *ff() { ... } заменяется на char *ff(void){ ... }

В данной задаче вам возможно придется использовать программу lex.

В списке аргументов прототипа должны быть явно указаны типы всех аргументов описатель int нельзя опускать. Так

q(x, s) char *s; { ... } // не прототип, допустимо. // x - int по умолчанию. q(x, char *s); // недопустимо. q(int x, char *s); // верно.

Собственно под "прототипом" понимают предварительное описание функции в новом стиле где вместо тела {...} сразу после заголовка стоит точка с запятой.

long f(long x, long y); /* прототип */ long f(long x, long y){ return x+y; } /* реализация */

В прототипе имена аргументов можно опускать:

long f(long, long); /* прототип */ char *strchr(char *, char);

Это предварительное описание помещают где-нибудь в начале программы, до первого вызова функции. В современном Си прототипы заменяют описания вида

extern long f();

о которых мы говорили раньше. Прототипы предоставляют программисту механизм для автоматического контроля формата вызова функции. Так, если функция имеет прототип

double f( double );

и вызывается как

double x = f( 12 );

то компилятор автоматически превратит это в

double x = f( (double) 12 );

(поскольку существует приведение типа от int к double); если же написано

f( "привет" );




Содержание  Назад  Вперед