41
Грамматику называют LL(1)-грамматикой, если для каждого
нетерминала, появляющегося в левой части более одного
порождающего правила, множества направляющих символов,
соответствующих правым частям альтернативных порождающих
правил, -- непересекающиеся.
Все LL(1)-грамматики можно разбирать детерминированно
сверху вниз.
Существует алгоритм, который позволяет выяснить, представляет
ли собой заданная грамматика LL(1)-грамматику.
Прежде всего нужно установить, какие нетерминалы могут
генерировать пустую строку. Для этого создадим одномерный
массив, где каждому нетерминалу соответствует один элемент.
Любой элемент массива может принимать одно из трех значений:
YES, NO или UNDECIDED. Просматриваем грамматику столько раз,
сколько требуется для того, чтобы каждый элемент принял значение
YES или NO.
При первом просмотре исключаются все правила, содержащие
терминалы. Если это приводит
к исключению всех правил для
какого-либо нетерминала, соответствующему элементу массива
присваиваем значение NO.
Затем для каждого порождающего правила с
в правой части
этому элементу массива, который соответствует нетерминалу в левой
части, присваиваем значение YES, и все порождающие правила для
этого нетерминала исключаются из грамматики.
Если требуются дополнительные просмотры (т.е. значения
некоторых элементов массива имеют все еще значение
UNDECIDED), выполняются следующие действия:
1. Каждое порождающее правило, имеющее такой символ в
правой
части, который не может генерировать пустую строку (о чем
свидетельствуют значения соответствующего массива), исключается
из грамматики. В том случае, когда для нетерминала в левой части
исключенного правила не существует других порождающих правил,
значение элемента массива, соответствующего этому нетерминалу,
устанавливается NO.
2. Каждый нетерминал в правой части порождающего правила,
который может генерировать пустую
строку, стирается из правила. В
том случае, когда правая часть правила становится пустой, элементу
массива, соответствующему нетерминалу в левой части,