Формальные языки, грамматики и основы построения трансляторов. Кревский И.Г - 89 стр.

UptoLike

89
После обнаружения ошибки процедура должна самостоятельно
продолжать просмотр текста до того места, откуда можно возобновить
анализ, а не прекращать работу и сообщать об ошибке вызвавшей ее
процедуре. Таким образом, крайне желательно, чтобы из процедуры
грамматического разбора не было другого выхода, кроме обычного
завершения работы.
Игнорирование больших фрагментов текста до следующего внешнего
символа может иметь нежелательные последствия. Поэтому к множеству
символов, прекращающих пропуск текста, добавляют служебные слова,
отмечающие начало конструкции, которую не следует пропускать. Таким
образом, в качестве параметров процедуре разбора передаются символы
возобновления, а не просто внешние символы. Часто множество символов
возобновления с самого начала содержат отдельные служебные слова и при
проходе иерархии подцелей грамматического разбора постепенно
дополняются внешними символами этих подцелей. Для выполнения
описанной выше проверки введем общую функцию и назовем ее test.
Данная функция имеет три параметра:
Множество s1 допустимых следующих
символов; если текущий символ
к нему не принадлежит, то имеет место ошибка.
Множество s2 дополнительных символов возобновления, появление
которых определенно является ошибкой, но которые ни в коем случае нельзя
пропускать.
Номер n, который присваивается ошибке, если функция ее обнаружит.
void test(char[] s1, char[] s2, int n)
{
if(!belongsTo(sym, s1)
{
error(n);
s1= unite(s1, s2);
while(!belongsTo(sym, s1))
sym = fgetc(input);
}
}
                                                                      89
     После обнаружения ошибки процедура должна самостоятельно
продолжать просмотр текста до того места, откуда можно возобновить
анализ, а не прекращать работу и сообщать об ошибке вызвавшей ее
процедуре. Таким образом, крайне желательно, чтобы из процедуры
грамматического разбора не было другого выхода, кроме обычного
завершения работы.
     Игнорирование больших фрагментов текста до следующего внешнего
символа может иметь нежелательные последствия. Поэтому к множеству
символов, прекращающих пропуск текста, добавляют служебные слова,
отмечающие начало конструкции, которую не следует пропускать. Таким
образом, в качестве параметров процедуре разбора передаются символы
возобновления, а не просто внешние символы. Часто множество символов
возобновления с самого начала содержат отдельные служебные слова и при
проходе   иерархии   подцелей    грамматического   разбора   постепенно
дополняются внешними символами этих подцелей. Для выполнения
описанной выше проверки введем общую функцию и назовем ее test.
Данная функция имеет три параметра:
     Множество s1 допустимых следующих символов; если текущий символ
к нему не принадлежит, то имеет место ошибка.
     Множество s2 дополнительных символов возобновления, появление
которых определенно является ошибкой, но которые ни в коем случае нельзя
пропускать.
     Номер n, который присваивается ошибке, если функция ее обнаружит.
void test(char[] s1, char[] s2, int n)
{
  if(!belongsTo(sym, s1)
  {
     error(n);
     s1= unite(s1, s2);
     while(!belongsTo(sym, s1))
       sym = fgetc(input);
  }
}