Лекция: Входной язык С0
Язык С0 является очень упрощенным вариантом языка С. Знакомство с новым языком удобнее всего начинать с примера программы.
Пример 1. Программа «Коды символов». Задача: для каждого вводимого символа выводить на экран его десятичный и восьмеричный коды, перед которыми выводить знак равенства. Закончить работу при нажатии клавиши Esc или Ctrl-Break.
Если после запуска программы набирать, например, текст: " язык С0",
то на экране появится строка:
=32=4я=239=357з=167=247ы=235=353к=170=252 =32=40C=67=1030=48=60
При нажатии клавиши <Esc>, с кодом 27, программа прекращает работу.
Программа 1.С0-программа «Коды символов»
Можно написать и короче,
kod (x,baza) в стиле, характерном для С:
{ int y;
if ((y = x / baza) != 0) kod (x,baza)
kod (y,baza); { if (x >= baza)
putchar (x % baza + 48); kod (x/baza, baza);
} putchar (x % baza + 48);
int c; }
main () int c;
{ c=0; main ()
while (c != 27) { while ((c=getchar())!=27)
{ c = getchar (); { putchar (61);
putchar (61); kod (c,10);
kod (c,10); putchar (61);
putchar (61); kod (c,8);
kod (c,8); }
} }
}
Пояснения к программе «Коды символов». Рекурсивная функция kod выводит на экран (точнее, в стандартный выходной файл) целочисленное значение х в системе счисления с заданным основанием baza (2 £ baza £ 10).
Оператор putchar (x % baza + 48); выводит на экран младшую цифру числа x, имеющую значение x%baza (% — остаток от деления). Если x содержит более одной цифры, то перед этим с помощью рекурсивного вызова kod(x/baza,baza); выводится значение старших разрядов числа x, равное x/baza.
Например, если x=932 и baza=10, то сначала рекурсивный вызов функции kod выводит старшие разряды числа x, равные x/10=93, затем выводится младшая цифра x, равная x%10=2.
Переменная y в функции kod используется для демонстрационных целей, без нее можно обойтись. В правом столбце и аналогичной С0-программе функции putn в библиотеке языка С0 (приложение1) показано более короткое решение.
Число 61 используется в этой программе как код символа '=', 48 — код цифры ноль '0'.
Входной язык С0 является подмножеством языка С и содержит данные только целочисленного типа, без массивов. Разрешаются глобальные и локальные переменные, функции с параметрами, рекурсия.
Параметры функций могут быть только входными (ввиду отсутствия операции получения адреса). Поэтому результат работы функции передается только в виде ее значения или присваивается глобальной переменной. В отличие от языка С, параметры не описываются (в языке С нет и стандартной функции putn).
Имеются следующие операторы: оператор-выражение, составной оператор, сокращенный условный оператор (if без else), цикл с предусловием, оператор возврата.
Оператор-выражение представляет собой выражение, заканчивающееся точкой с запятой:
выражение;
Условный оператор используется для организации ветвлений. В языке С0 разрешен только сокращенный условный оператор:
if (выражение) оператор
Для организации повторяющихся действий используется цикл с предусловием:
while (выражение) оператор
Выражение в операторах if и while считается истинным, если оно не равно нулю. Внутри операторов if и while разрешено использовать только один оператор. Если в этом месте требуется написать последовательность из нескольких операторов, используется составной оператор, т. е. последовательность операторов, заключенная в операторные скобки { и }:
{ оператор_1… оператор_n }
Эти скобки превращают последовательность операторов в один составной оператор. В некоторых языках для этой цели используются служебные слова begin и end.
Оператор возврата завершает выполнение подпрограммы (функции) и задает значение функции (если она обладает значением):
return [выражение];
В выражениях допускаются:
· арифметические операции: +, -, *, /, %,
· сравнения: ==, !=, <, >, <=, >=,
· присваивание =,
· скобки ().
Отсутствующие в языке C0 логические операции И и ИЛИ можно заменить арифметическим умножением и сложением, соответственно.
Примечания.
1. Cлужебные слова int, if, while, return пишутся строчными буквами.
2. Длина имени не ограничена, но учитываются не более 8 символов.
3. Отсутствующий оператор return в конце описания функции вставляется автоматически.
Грамматика языка С0.
программа ::= {oписание-переменных | описание-функции}...
описание-переменных ::= int имя [, имя]...;
описание-функции ::= имя ( [имя[, имя]...] )
{ [описание-переменных]...[оператор]… }
оператор ::= [выражение]; | { [оператор]… } |
if (выражение) оператор | return [выражение];
while (выражение) оператор
выражение ::= терм [{ + | — | * | / | % | < | > | <= |>= | == | != | = } терм]...
терм ::= число | имя | имя ([выражение[, выражение]...]) |
— терм | (выражение)
имя ::= буква [буква|цифра]...
число ::= цифра ...
буква ::= A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|
a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z
цифра ::= 0|1|2|3|4|5|6|7|8|9
Эта грамматика описывает не только синтаксис, но и лексику языка С0. К лексике относятся четыре последних правила.
Стандартные функции языка С0. Библиотека std.asm (приложение 1) присоединяется к программе на этапе ее ассемблирования и содержит следующие стандартные функции (все они кроме putn имеются и в языке С).
getchar () Вводит с клавиатуры символ с отображением на экране и выдает в качестве значения его код. Реагирует на Ctrl-Break.
getch() Вводит с клавиатуры символ без отображения на экране и выдает в качестве значения его код. Реагирует на Ctrl-Break.
putchar (x) Выводит на экран символ с кодом х. Не имеет значения.
putn (x) Выводит на экран целoе значение х. Не имеет значения.