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

UptoLike

64
A();
}
if(ch == ')') ch = fgetc(input);
else error();
}
else error();
}
void main(int argc, char **argv)
{
ch =fgetc(input);
A();
}
При этом преобразовании свободно применялись некоторые очевидные
правила программирования, позволяющие упростить программу. Например,
при буквальном переводе четвертая строка имела бы вид:
if(ch == 'x')
if(ch == 'x') ch = fgetc(input); else error();
else ...
Ясно, что ее можно сократить, как это сделано в программе. Операторы
чтения в восьмой и двенадцатой строках тоже получены с помощью такого
же упрощения
.
По-видимому, полезно определить, когда вообще возможны подобные
упрощения, и показать это непосредственно в виде графов. Два основных
случая покрываются следующими дополнительными правилами:
В4а.
S
1
S
2
S
n
. . .
x
1
x
2
x
n
. . .
if(ch == 'x1')
{
ch = fgetc(input);
T(S1);
}
else
if(ch == 'x2')
                                                                      64
            A();
         }
         if(ch == ')') ch = fgetc(input);
         else error();
      }
      else error();
}

void main(int argc, char **argv)
{
  ch =fgetc(input);
  A();
}
    При этом преобразовании свободно применялись некоторые очевидные
правила программирования, позволяющие упростить программу. Например,
при буквальном переводе четвертая строка имела бы вид:
if(ch == 'x')
   if(ch == 'x') ch = fgetc(input); else error();
else ...
    Ясно, что ее можно сократить, как это сделано в программе. Операторы
чтения в восьмой и двенадцатой строках тоже получены с помощью такого
же упрощения.
     По-видимому, полезно определить, когда вообще возможны подобные
упрощения, и показать это непосредственно в виде графов. Два основных
случая покрываются следующими дополнительными правилами:
     В4а.
             x1     S1

            x2      S2

            ...    ...
            xn      Sn

if(ch == 'x1')
{
   ch = fgetc(input);
   T(S1);
}
else
if(ch == 'x2')