Аналогично, для заполнения столбца, помеченного ⊥к, возьмем множество R^(S). В это множество входит только один символ —;. Поэтому в столбце матрицы, помеченном символом ⊥к, ставим знак «.>» («следует») в клетке на пересечении со строкой, помеченной символом;.
В итоге получим заполненную матрицу операторного предшествования, которая представлена в табл. 3.8.
Теперь на основе исходной грамматики G можно построить остовную грамматику G'({if,then,else,a,=,or,xor,and,(,),},{E},P',E) с правилами P':
E → E; – правило 1;
E → if E then E else E | if E then E | a:= E – правила 2, 3 и 4;
E → if E then E else E | a:= E – правила 5 и 6;
E → E or E | E xor E | E – правила 7, 8 и 9;
E → E and E | E – правила 10 и 11;
E → a | (E) – правила 12 и 13.
Жирным шрифтом в грамматике и в правилах выделены терминальные символы.
Всего имеем 13 правил грамматики. Причем правила 2 и 5, а также правила 4 и 6 в остовной грамматике неразличимы, а правила 9 и 11 не имеют смысла (как было уже сказано, цепные правила в остовных грамматиках теряют смысл). То, что две пары правил стали неразличимы, не имеет значения, так как по смыслу (семантике входного языка) эти две пары правил обозначают одно и то же (правила 2 и 5 соответствуют полному условному оператору, а правила 9 и 11 – оператору присваивания). Поэтому в дереве синтаксического разбора нет необходимости их различать. Следовательно, синтаксический распознаватель может пользоваться остовной грамматикой G'.
Рассмотрим примеры разбора цепочек входного языка в виде последовательности конфигураций МП-автомата, выполняющего разбор. Результат разбора будем представлять в виде последовательности номеров правил грамматики. На основе найденной последовательности правил после выполнения разбора при отсутствии ошибок (когда входная цепочка принята МП-автоматом) можно построить дерево синтаксического разбора.
Рассматриваемый МП-автомат имеет только одно состояние. Тогда для иллюстрации работы МП-автомата будем записывать каждую его конфигурацию в виде трех составляющих {α|β|γ}, где:
• α – непрочитанная часть входной цепочки;
• β – содержимое стека МП-автомата;
• γ – последовательность номеров примененных правил.
В начальном состоянии вся входная цепочка не прочитана, стек автомата содержит только лексему типа «начало строки», последовательность номеров правил пуста.
Для удобства чтения стек МП-автомата будем заполнять в порядке справа налево, тогда находящимся на верхушке стека будет считаться крайний правый символ в цепочке β.
Возьмем входную цепочку «if a or b and c then a:= 1 xor c;».
После выполнения лексического анализа, если все лексемы типа «идентификатор» и «константа» обозначить как «a», получим цепочку: «if a or a and a then a:= a xor a;».
Рассмотрим процесс синтаксического анализа этой входной цепочки. Шаги функционирования МП-автомата будем обозначать символом «÷». Символом «÷п» будем обозначать шаги, на которых выполняется сдвиг (перенос), символом «÷с» – шаги, на которых выполняется свертка.
{if
{
{or
{or
{
{and
{and
{
{then
{then
{then
{then
{
{:=
{
{xor
{xor
{
{;⊥к|⊥н if
{;⊥к|⊥н if
{;⊥к|⊥н if
{;⊥к|⊥н if
{;⊥к|⊥н
{⊥к|⊥н
{⊥к|
В результате получим последовательность правил: 12 12 12 107 12 12843 1. Этой последовательности правил будет соответствовать цепочка вывода на основе остовной грамматики С:
Стоит обратить внимание, что, так как данный МП-автомат строит правосторонний вывод, в цепочке вывода на каждом шаге правило всегда применяется к крайнему правому нетерминальному символу в цепочке.