<Операнд>.
int O (void)
{
# ifdef TEST
cprintf ("O - Перевірка на Операнд. R n ");
# endif
fprintf (errors, "O - Перевірка на Операнд. N ");
if (nx == '(')
{
AB ();
if (nx! = ')')
Error (3);
else
{
Scan ();
return (OK);
}
}
else
if (IDENT () == NO)
{
if (FLOAT () == NO)
Error (4);
}
return (OK);
}
// Реалізація нетермінала <Ідентифікатор>.
int IDENT (void)
{
# ifdef TEST
cprintf ("IDENT - Перевірка на Ідентифікатор з символу% c. R n ", nx);
getch ();
# endif
fprintf (errors, "IDENT - Перевірка на Ідентифікатор з символу% c. N ", nx);
if (isalpha (nx))
{
while (isalpha (nx) | | Isdigit (nx))
Scan ();
return (YES);
}
return (NO);
}
// Реалізація нетермінала <Дробове Без Знака>.
int FLOAT (void)
{
# ifdef TEST
cprintf ("FLOAT - Перевірка на Дробове Без Знака з цифри% c. R n ", nx);
getch ();
# endif
fprintf (errors, "FLOAT - Перевірка на Дробове Без Знака з цифри% c. N ", nx);
if (isdigit (nx))
{
while (isdigit (nx))
Scan ();
if (nx == '.')
{
Scan ();
while (isdigit (nx))
Scan ();
}
return (YES);
}
return (NO);
}
// Сканування наступного символу з рядка.
void Scan (void)
{
# ifdef TEST
cprintf ("SCAN - Сканування. Поточний символ '% c' з кодом% d. R n ", STR [pos], STR [pos]);
getch ();
# endif
fprintf (errors, "SCAN - Сканування. Поточний символ '% c' з кодом
% d. n ", STR [pos], STR [pos]);
nx = STR [pos];
pos + +;
}
// Обробка помилок.
void Error (int num, char * s)
{
char * E [40] =
{p> "Очікується '+' або '-'",
"Очікується '*', '/' або '**'",
"Очікується ')'",
"Очікується ідентифікатор або Дробове без знака",
"Не визначено ідентифікатор",
"Не знайдено оператор GOTO r nСтрока розбору не підлягає",
NULL
}; p> sprintf (mes [ERR1] [ERR2], "% s% s", E [num-1], s);
fprintf (errors, "Error - Помилка рядок% d, помилка #% d. N ", ERR1, ERR2);
# ifdef TEST
cprintf ("Error - Помилка: рядок #% d, помилка #% d. R n ", ERR1, ERR2);
cprintf ("% s r n", mes [ERR1] [ERR2]);
Beep (1000,200);
getch ();
# endif
fprintf (errors, "% s n", mes [ERR1] [ERR2]);
ERR2 + +;
mes [ERR1] [ERR2] [0] = NULL;